2

我在理解该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))
)

抱歉打扰了:(

4

1 回答 1

3

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

于 2012-03-16T03:26:23.203 回答