我很难理解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))
)
很抱歉打扰:(
答案 0 :(得分:3)
在6.24及更早版本中,当 not 条件元素是规则中的第一个模式时,模式(initial-fact)被添加到它之前(这在5.4.9节中描述, “基本编程指南”中LHS CE的自动添加和重新排序。执行(重置)命令时会声明(初始事实)事实。我认为这是你问题的原因。如果您在断言其他事实之前执行了(重置),那么您的原始规则将起作用。