2016-09-24 5 views
0

Я ищу способ удалить факты, основанные на отрицательном состоянии. Например, после создания следующих фактов:CLIPS отрицательное состояние

CLIPS> 
(deffacts Cars 
    (color red) 
    (color green) 
    (color yellow) 
    (doors three) 
    (doors five)) 
CLIPS>  
(defrule combinations 
    (color ?color) 
    (doors ?doors) 
    => 
    (assert (car ?color ?doors))) 
CLIPS> (reset) 
CLIPS> (run) 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (color red) 
f-2  (color green) 
f-3  (color yellow) 
f-4  (doors three) 
f-5  (doors five) 
f-6  (car red five) 
f-7  (car green five) 
f-8  (car yellow five) 
f-9  (car red three) 
f-10 (car green three) 
f-11 (car yellow three) 
For a total of 12 facts. 
CLIPS> 

Я смотрю на удаление некоторых фактов со следующим утверждением:

(defrule clear 
    ?q1 <- (car ?color~green five) 
=> 
    (retract ?q1) 
    (printout t "Cars cleared " ?q1 crlf) 
) 

Это должно удалить автомобили с пятью дверями и цвет не зеленый. Поэтому идентификаторы f-6 и f-8 следует удалить. И распечатайте факты, которые были удалены.

Заявление не дает мне ошибку, но если я запустил (запустил), он не отменил или не распечатал заявление. Я предполагаю, что это не правильно, но я не вижу, как написать это отрицательное условие в противном случае.

Благодаря

ответ

0

я нашел, как писать код правильно:

(defrule clear 
    ?q1 <- (car ~green five) 
=> 
    (retract ?q1) 
    (printout t "Cars cleared " ?q1 crlf) 
) 

Надеется, что это помогает кто-то

+0

Вы можете также использовать цвет & ~ зеленый в исходном правиле?. С помощью & добавлено значение в первой позиции факта связано с цветом, а первая позиция не должна быть зеленой. Без цвета &,? Привязывается к первой позиции в этом факте, а вторая позиция не должна быть зеленой. –

+0

благодарит Гэри за понимание. В конце концов я получу его :-) – Selrac