Writing prolog with recursive rules? "ERROR: Out of local stack"
Writing prolog with recursive rules? "ERROR: Out of local stack"
鉴于以下事实:
- 杰克比尼克聪明
- 尼克比韦斯聪明
- 韦斯比
迪克
编写一个递归程序,确定 Jake 的比 Dik 的聪明。
我的解决方案是:
smarter(jake, nik).
smarter(nik, wes).
smarter(wes, dik).
smarter(X, Y) :-
smarter(X, Z),
smarter(Z, Y).
输出:
?- smarter(jake, dik).
True
但是当我交换它时:
?- smarter(dik, jake)
输出将显示"ERROR: Out of local stack"
我需要输出显示 "False"。我如何解决它?
谢谢
你的代码可以证明
?- smarter(jake, dik).
因为使用 X = jake, Y = dik 它找到了一个 Z=nik 这样 smarter(jake,nik) (这是事实)然后 smarter(nik,dik),(考虑到 X1= 证明了这一点nik, Y1=dik, Z1=wes).
不过,为了证明
?- smarter(dik, jake).
X =dik, Y=jake, prolog 需要一个 Z 使得 smarter(dik, Z)。然而,没有事实更聪明(dik,Z)。然后,再次应用该规则...并且您有循环。
修复(至少这个特定示例)的想法是区分事实和规则:
isSmarter(jake, nik).
isSmarter(nik, wes).
isSmarter(wes, dik).
smarter(X, Y) :- isSmarter(X,Y).
smarter(X, Y) :-
isSmarter(X, Z),
smarter(Z, Y).
这应该有效。
鉴于以下事实:
- 杰克比尼克聪明
- 尼克比韦斯聪明
- 韦斯比 迪克
编写一个递归程序,确定 Jake 的比 Dik 的聪明。
我的解决方案是:
smarter(jake, nik).
smarter(nik, wes).
smarter(wes, dik).
smarter(X, Y) :-
smarter(X, Z),
smarter(Z, Y).
输出:
?- smarter(jake, dik).
True
但是当我交换它时:
?- smarter(dik, jake)
输出将显示"ERROR: Out of local stack" 我需要输出显示 "False"。我如何解决它?
谢谢
你的代码可以证明
?- smarter(jake, dik).
因为使用 X = jake, Y = dik 它找到了一个 Z=nik 这样 smarter(jake,nik) (这是事实)然后 smarter(nik,dik),(考虑到 X1= 证明了这一点nik, Y1=dik, Z1=wes).
不过,为了证明
?- smarter(dik, jake).
X =dik, Y=jake, prolog 需要一个 Z 使得 smarter(dik, Z)。然而,没有事实更聪明(dik,Z)。然后,再次应用该规则...并且您有循环。
修复(至少这个特定示例)的想法是区分事实和规则:
isSmarter(jake, nik).
isSmarter(nik, wes).
isSmarter(wes, dik).
smarter(X, Y) :- isSmarter(X,Y).
smarter(X, Y) :-
isSmarter(X, Z),
smarter(Z, Y).
这应该有效。