2016-09-24 61 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) 
) 

这应该删除汽车行驶五两扇门和颜色不是绿色的。因此应删除ID f-6和f-8。并打印已删除的事实。

该声明不会给我一个错误,但如果我执行(运行)它不收回或打印出声明。我猜测情况并不正确,但我不知道如何写这种否定的条件。

感谢

回答

0

我发现如何正确地写代码:

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

希望它可以帮助别人

+0

你也可以用你的原始规则颜色&〜绿?用&添加的值在事实的第一个位置必然是?颜色,第一个位置不能是绿色。如果没有&,?颜色就会被绑定到事实上的第一个位置,而第二个位置不能是绿色的。 –

+0

感谢加里给你的见解。我最终会得到它的窍门:-) – Selrac