AI: A Modern Approach 在讨论一阶逻辑中的推理时提到了Rete算法。
然而,我找到的所有关于Rete算法的描述似乎都使用了不包含函数符号的规则。换句话说,规则看起来像
a(X) ∧ b(X, Y) → c(Y)
而不是
a(f(X)) ∧ b(X, Y) → c(f(Y))
(这两者的区别可能是根本性的,因为这正是Prolog和Datalog之间的区别,其中只有一个是图灵完备的)
Rete算法是否仅限于不包含函数符号的规则?现代规则引擎如Drools和CLIPS是否处理函数符号?
回答:
在CLIPS中,这是如何实现规则“对于每个人,只存在一个且唯一的父亲,如果一个人的父亲富有,那么他/她也是富有的”:
(defrule inherited-wealth (forall (person ?p) (father ?p ?f) (not (father ?p ~?f))) (person ?p) (father ?p ?f) (rich ?f) => (assert (rich ?p)))