CLIPSで同一の事実をどのように削除しますか?
私が持っていると仮定して
(事実 2) (事実 3) (事実 2) (事実 4)
(事実2)、(事実3)、(事実4)だけにとどまりたい。どうやってやるの?
別の回答で述べたように、重複したファクトを作成する前にファクトの重複を有効にする必要があるため、重複したファクトを削除する最も簡単な方法は、そもそも重複を許可しないことです。重複を許可するが、選択したいくつかを削除する場合は、ファクト アドレスを比較して、両方のパターンに一致する 1 つのファクトによってルールがアクティブ化されるのを防ぎます。
CLIPS (6.31 6/12/19)
CLIPS> (set-fact-duplication TRUE)
FALSE
CLIPS> (assert (fact 2) (fact 3) (fact 2) (fact 4))
<Fact-4>
CLIPS>
(defrule remove
?f1 <- (fact ?number1)
?f2 <- (fact ?number2)
(test (and (eq ?number1 ?number2)
(neq ?f1 ?f2)))
=>
(retract ?f1))
CLIPS> (agenda)
0 remove: f-3,f-1
0 remove: f-1,f-3
For a total of 2 activations.
CLIPS> (run)
CLIPS> (facts)
f-0 (initial-fact)
f-1 (fact 2)
f-2 (fact 3)
f-4 (fact 4)
For a total of 4 facts.
CLIPS>
まあこんな感じにしました
(defrule removeduplicates
?f1 <- (fact ?number1)
?f2 <- (fact ?number2)
(test (eq ?number1 ?number2))
=>
(retract ?f1)
)