如何在Clips规则的RHS(规则右侧)中测试事实的存在性?我正在尝试设计一个规则,通过计算存在多少个目标事实来“评估”当前状态。很明显如何在LHS(规则左侧)中测试事实,但我找不到如何在RHS中进行等效操作。
我想做类似这样的事情,尽管这并非有效的Clips代码:
(defrule score-state "" ?score <- (score (value ?value)) => (modify ?score (value (+ (exists (goal-1)) (exists (goal-2)) (exists (goal-3))))))
因此,如果没有任何目标状态存在,那么就会存在事实(score (value 0))。相反,如果所有目标状态都存在,那么就会存在事实(score (value 3))。
参考手册提到了函数fact-existp,但这似乎需要传递一个事实地址。我尝试像(fact-existp (goal-1))这样使用它,但是Clips给出了语法错误。
回答:
(deftemplate score (slot value))(deftemplate goal-1)(deftemplate goal-2)(deftemplate goal-3)(deffacts start (score (value undefined)) (goal-1) (goal-3))(deffunction ecount (?g) (if (any-factp ((?f ?g)) TRUE) then (return 1) else (return 0)))(defrule score-state "" ?score <- (score (value undefined)) => (modify ?score (value (+ (ecount goal-1) (ecount goal-2) (ecount goal-3)))))