CLIPS:两个事实列表之间的差异

时间:2015-05-05 01:20:56

标签: clips

如果我有一堆事实,例如(例子(事实1)),(例子(事实2)),(例子(事实3)),并且有另一个事实清单,如(myfact(number 2)),如何在第一个列表中不在第二个列表中的每个项目上执行打印输出(基于事实/数字插槽中的数字)?我怀疑我需要做所有事实,但我不确定如何。这是我不完整的代码:

(deffunction difference ()
    (do-for-all-facts ((?f1 example)) TRUE
        (find-all-facts ((?f2 myfact)) (eq 1 1))
        (if (somehow check if ?f1:fact does not equal ANY of number slots in ?f2) then
            (printout t "..." crlf))))

1 个答案:

答案 0 :(得分:0)

CLIPS> (clear)
CLIPS> (deftemplate example (slot fact))
CLIPS> (deftemplate myfact (slot number))
CLIPS> 
(deffacts start
   (example (fact 1))
   (example (fact 2))
   (example (fact 3))
   (myfact (number 2))
   (myfact (number 4)))
CLIPS> 
(deffunction difference ()
   (do-for-all-facts ((?f1 example))
      (not (any-factp ((?f2 myfact)) (eq ?f1:fact ?f2:number)))
      (printout t "difference " ?f1:fact crlf)))
CLIPS> (reset)
CLIPS> (difference)
difference 1
difference 3
CLIPS> 
(defrule difference
   (example (fact ?n))
   (not (myfact (number ?n)))
   =>
   (printout t "difference " ?n crlf))
CLIPS> (run)
difference 3
difference 1
CLIPS>