鉴于以下事实:
写一个递归程序,确定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:超出本地堆栈" 我需要输出显示" False"。我如何解决它?
由于
答案 0 :(得分:0)
您的代码可以证明
?- smarter(jake, dik).
因为使用X = jake,Y = dik它发现Z = nik更聪明(jake,nik)(这是一个事实)然后更聪明(nik,dik),(这被证明考虑X1 = nik, Y1 = dik,Z1 = wes)。
然而,为了证明
?- smarter(dik, jake).
X = dik,Y = jake,prolog需要Z这样聪明(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).
这应该有用。