CLIPS使用(不是(事实上的??))并不会触发

时间:2011-12-20 22:09:49

标签: clips

我很难理解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))
)

很抱歉打扰:(

1 个答案:

答案 0 :(得分:3)

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