2017-09-05 50 views
1

我在另一个程序中嵌入了CLIPS,并且主要将它用作推理引擎。我的规则条件使用logical关键字,因此当规则不受支持时,会自动收回作为规则动作的任何事实(BPG第5.4.8节)。我通常需要检查所有类型为foo的事实(其中foo是事实的第一个字段,例如(foo bar baz))。要做到这一点,我一直在解析整个事实清单,但是这样做已经成为经济放缓的重要原因。当事实失去支持时,CLIPS回调

我关心的每一个事实都是在自己的规则中声明的,所以我想过在每个规则中使用回调来通知我的程序,我感兴趣的事实已被声明,但是这只会告诉我当事实被宣称时,而不是当它被收回时。我试图想出一种写反规则的方式,当事实变得不受支持时会触发,但是我一直没能想出有用的东西。我已经尝试了用not包装整个规则条件的明显方法,但是这不允许您使用not子句之外的变量,这是我需要使回调正常工作的变量。

是否有一种显而易见的方式来查询foo类型的所有事实,而不是迭代事实列表?或者当规则/事实失去支持时,有没有办法获得回调?似乎这应该是相当容易做的,有什么我在这里失踪?

回答

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函数来执行查找,所有的事实命令,然后你遍历存储在返回值中的事实而不是整个事实列表。

您可以使用EnvAddAssertFunction和EnvAddRetractFunction为断言和撤消添加回调,虽然这些API都没有记录。

相关问题