【发布时间】:2019-06-03 18:32:40
【问题描述】:
我刚刚开始学习 Prolog,并且一直在玩弄它。现在我到了一个我被卡住的地步。我写的程序在我请求时进入了一个无限循环
?- q(b).
我不明白为什么会这样。如果有人可以向我解释,那就太好了。
p(a).
p(b).
q(Y) :- r(X), r(Y).
r(X) :- r(f(X)).
r(a) :- p(c).
r(a) :- p(a).
r(b) :- p(b).
【问题讨论】:
-
提示:
r(something_completely_different)不会终止也是出于同样的原因。 -
一般来说,试着想想 Prolog 是如何得出一个事实的:它以当前的目标(例如
r(something)并从上到下遍历规则以找到与其统一的规则头。然后它尝试从左到右推导该规则主体中的每个目标。Prolog 只会在推导第一个目标时尝试推导主体的第二个目标 - 这也称为深度优先搜索。 -
好的。这意味着程序以“q(Y) :- r(X), r(Y).”开头。之后它要检查“r(X)”并转到“r(X) :- r(f(X)).”。它在那里尝试检查“r(f(x))”。它在“r(X) :- r(f(X)).”中循环。我理解正确吗?
-
是的,就是这样 :-)
标签: prolog infinite-loop