事实失去支持时的 CLIPS 回调

CLIPS callback when fact loses support

我已将 CLIPS 嵌入到另一个程序中,主要将其用作推理引擎。我的规则条件使用 logical 关键字,这样当规则变得不受支持时,任何被 assert 编辑为规则操作的事实都会自动撤回(BPG 第 5.4.8 节)。我通常需要检查类型为 foo 的所有断言事实(其中 foo 是事实的第一个字段,例如 (foo bar baz))。为此,我一直在解析整个事实列表,但这样做已成为速度放缓的重要来源。

我关心的每个事实都在其自己的规则中断言,因此我考虑在每个规则中使用回调来通知我的程序我感兴趣的事实已被断言,但这只会告诉我在断言事实时,而不是在撤回事实时。我试图想出一种编写逆向规则的方法,该规则会在事实不受支持时触发,但是我一直无法想出有效的方法。我已经尝试了用 not 包装整个规则条件的明显方法,但这不允许您在 not 子句之外使用变量,这是回调正常工作所需要的.

除了遍历事实列表之外,是否有一种明显的方法来查询 foo 类型的所有事实?或者有没有办法在 rule/fact 失去支持时获得回调?看起来这应该很容易做到,我在这里遗漏了什么吗?

您可以使用事实查询函数检索事实组并对其执行操作:

CLIPS> 
(assert (foo bar baz)
        (foo yak)
        (foo woz bin bly))
<Fact-3>
CLIPS> (find-all-facts ((?f foo)) TRUE)
(<Fact-1> <Fact-2> <Fact-3>)
CLIPS> 
(do-for-all-facts ((?f foo)) TRUE 
   (printout t ?f:implied crlf))
(bar baz)
(yak)
(woz bin bly)
CLIPS> (deftemplate point (slot x) (slot y))
CLIPS> 
(assert (point (x 1) (y 2)) 
        (point (x 3) (y 4)))
<Fact-5>
CLIPS> 
(do-for-all-facts ((?f point)) TRUE 
   (printout t ?f:x " " ?f:y crlf))
1 2
3 4
CLIPS> 

嵌入时,使用 EnvEval 函数执行 find-all-facts 命令,然后迭代存储在 return 值中的事实而不是整个事实列表。

您可以使用 EnvAddAssertFunction 和 EnvAddRetractFunction 添加断言和撤销的回调,尽管这些 API 没有文档记录。