我已将CLIPS嵌入到另一个程序中,并且主要将其用作推理引擎。我的规则条件使用logical
关键字,以便在规则不受支持时,assert
作为规则操作的任何事实都会自动撤消(BPG第5.4.8节)。我通常需要检查foo
类型的所有断言事实(其中foo
是事实的第一个字段,例如(foo bar baz)
)。为此,我一直在解析整个事实清单,但这样做已成为减速的重要原因。
我关心的每一个事实都是按照自己的规则断言的,所以我想到在每个规则中使用回调来通知我的程序我已经声明了我感兴趣的事实,但是这只会告诉我当一个事实被断言时,而不是当它被收回时我。我试图提出一种编写反规则的方法,当一个事实变得不受支持时会触发,但是我还没有能够找到有效的东西。我已尝试用not
包装整个规则条件的明显方法,但这并不允许您使用not
子句之外的变量,这是我需要的回调工作正常。
除了迭代事实列表之外,是否有一种明显的方法可以查询foo
类型的所有事实?或者,当规则/事实失去支持时,有没有办法获得回调?这样看起来应该很容易,我在这里缺少什么?
答案 0 :(得分:1)
您可以使用事实查询功能来检索和执行对事实组的操作:
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命令,然后迭代存储在返回值中的事实而不是整个事实列表。
您可以使用EnvAddAssertFunction和EnvAddRetractFunction为断言和撤消添加回调,尽管这些不是文档化的API。