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

これは、5つのドアや色の緑ではないと車を削除する必要があります。したがって、ID f-6とf-8は削除する必要があります。そして、削除された事実を印刷します。

このステートメントは私にエラーを与えませんが、実行(実行)してもステートメントを収縮または印刷しません。私は条件が正しくないと推測していますが、そうでない場合はこの否定条件をどのように記述するのか分かりません。

おかげ

答えて

0

私は適切にコードを記述する方法が見つかりました:?

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

それはあなたがまた、使用することができ、あなたの元のルールで色&〜緑を誰か

+0

に役立ちます願っています。ファクトの最初の位置に値を追加すると、?colorにバインドされ、最初の位置は緑色であってはなりません。 &、?colorがファクト内の最初の位置にバインドされていない場合、2番目の位置は緑色であってはなりません。 –

+0

Gary for you insightに感謝します。私は最終的にハングアップします:-) – Selrac