【发布时间】:2018-09-14 20:51:10
【问题描述】:
来自 Bratko 的书,Prolog Programming for Artificial Intelligence (4th Edition) 我们有以下代码不起作用 -
anc4(X,Z):-
anc4(X,Y),
parent(Y,Z).
anc4(X,Z):-
parent(X,Z).
在本书第 55 页的图 2.15 中,显示parent(Y,Z) 一直在调用,直到堆栈内存不足。
我不明白的是 prolog 首先对 anc4(X,Y) 进行递归调用,而不是对父级 (Y,Z) 进行递归调用。为什么 prolog 不一遍遍地翻到第一行 anc4(X,Y),而是翻到第二行?
您能否详细说明为什么一直调用parent(Y,Z) 行?
谢谢。
【问题讨论】:
-
anc4(X, Z) :- anc4(X, Y), ...就在那里。 Prolog 将继续选择第一个子句,直到它失败或成功。它也没有。它只是再次调用anc4/2。 -
请参阅failure-slice,了解如何诊断此类问题。
-
请参阅this question 了解定义它的一般方法。
标签: recursion prolog transitive-closure