我在理解 not
函数如何与模式匹配交互方面遇到了一点困难。我想写一个模式匹配“这样的事实不存在”。
也就是说,我想要的是:
(defrule init-count
(not (highest-debt ?))
(catherines ?debt)
=>
(assert (highest-debt ?debt))
)
然后:
(defrule continue-count
?debt-fact <- (highest-debt ?h-debt)
(? ?a-debt)
(test (> ?a-debt ?h-debt))
=>
(retract ?debt-fact)
(assert (highest-debt ?a-debt))
)
但由于某种原因not
在这里对我不起作用。将 not
替换为 (not (exists/*pattern*/))
似乎也不起作用。
有没有我遗漏的东西和/或一个很好的方法来实现使用这样的规则查找最高数字?
更新
我刚刚发现的答案是这样的:not
模式不应该是第一个 ((declare (salience 0))
也不算数)。因此,以下代码可以正确运行:
(defrule init-count
(catherines ?debt)
(not (highest-debt ?))
=>
(assert (highest-debt ?debt))
)
抱歉打扰了:(
最佳答案
在版本 6.24 及更早版本中,当 not 条件元素是规则中的第一个模式时,模式 (initial-fact) 将添加在其前面(这在第 5.4.9 节中进行了描述, LHS CE 的自动添加和重新排序,位于《基本编程指南》中)。当执行(重置)命令时,(初始事实)事实被断言。我认为这就是你的问题的原因。如果您在断言其他事实之前执行了(重置),那么您原来的规则将会起作用。
关于使用 (not (a-fact $?)) 的 CLIPS 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582631/