基于其他规则的CLIPS规则未出现在议程或匹配结果中的原因排查
CLIPS中依赖规则未激活的原因分析
问题场景
用户编写了以下CLIPS程序:
事实定义
(deffacts family (father tom nicholas) (mother clair nicholas) (father tom john) (father brad tom) (father mark clair))
执行(reset)后定义两条规则:
parent规则(rule1)
(defrule parent (or (father ?x ?y) (mother ?x ?y)) => (assert (parent ?x ?y)))
gp规则(rule2)
(defrule gp (and (parent ?x ?y) (parent ?y ?z)) => (assert (gp ?x ?z)))
执行(agenda)后,仅显示parent规则的激活项;执行(matches parent)能看到匹配结果,但执行(matches gp)时无任何匹配及激活项。
用户疑问:为何这条依赖其他规则的gp规则既未出现在议程中,也无匹配结果?是否存在操作错误?
用户补充猜测:是否因为CLIPS执行(agenda)时仅基于工作内存中已断言的事实判断规则条件匹配,而非基于规则?
原因分析
你的猜测完全正确,CLIPS的规则匹配机制仅基于工作内存中当前已存在的事实,而非规则之间的逻辑关联:
- 执行
(reset)后,工作内存中只有deffacts里定义的father和mother事实,没有parent事实。 gp规则的条件需要匹配两个parent事实,但此时工作内存里根本不存在这类事实,自然无法匹配,也不会出现在议程中。parent规则能被激活,是因为它的条件直接匹配了已有的father/mother事实。
操作修正
要让gp规则被激活,需要先运行parent规则生成parent事实:
- 执行
(run)命令,触发parent规则执行,此时工作内存中会被断言所有对应的parent事实。 - 再次执行
(agenda),就能看到gp规则的激活项;执行(matches gp)也会显示匹配结果。
内容的提问来源于stack exchange,提问作者yaminoyuki
相关产品推荐
相关产品推荐

