【发布时间】:2018-11-16 09:55:06
【问题描述】:
我是 Prolog 的新手,最近开始使用这本很棒的书 Learn Prolog Now! 学习它。有些东西我不完全理解,这真的让我很烦。 exercises 的问题之一是
我们有以下知识库和谓词:
child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
child(donna,emily).
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z),
descend(Z,Y).
如果我们将谓词更改为以下内容会发生什么:
descend(X,Y) :- child(X,Y).
descend(X,Y) :- descend(X,Z),
descend(Z,Y).
我知道这会导致错误情况下的无限递归,但我无法完全理解为什么。
如果我理解正确,在上面的第一种情况下,如果给出错误查询 child(X,Z) 将耗尽其所有选项,试图将多个元素统一到 Z 然后失败,回溯到前一个 X 然后再次尝试 Z 选项满足孩子(X,Z)。 (如果我错了,请纠正我)。
我不确定为什么对于descend 谓词的第二个定义不会发生同样的情况。
【问题讨论】: