使用 (not (a-fact $?)) 的 CLIPS 不会触发

标签 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))
)

抱歉打扰了:(

最佳答案

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

关于使用 (not (a-fact $?)) 的 CLIPS 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582631/

相关文章:

c++ - 在剪辑中复制环境的构造函数?

java - 如何使用 Java API 获取 CLIPS 事实的字段数据?

python-3.x - CLIPS Python3 CLIPSError

java - 如何将 CLIPS-JNI-JAVA 输出重定向到字符串

CLIPS 运行时崩溃

ios - iOS Clips AI集成

java - JESS 用户函数将 "BS"而不是 "/home"写入文件

python - pyclips 的 Clipspy 挂件 Clips.ErrorStream.Read()

c++ - 如何优化 CLIPS 中不同模板化事实之间的模式匹配