2016-09-24 60 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