【发布时间】:2017-03-12 23:35:38
【问题描述】:
我有这个例子:
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z), descend(Z,Y).
child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
效果很好,我理解。这是一个小练习的解决方案。我的解决方案是相同的,但正在改变:
descend(X,Y) :-descend(X,Z),descend(Z,Y)。
即在第二条descend 规则中将child 更改为descend。
如果我在第一个解决方案中查询descend(X, Y).,我得到:
?- descend(X, Y).
X = anne,
Y = bridget ;
X = bridget,
Y = caroline ;
X = caroline,
Y = donna ;
X = anne,
Y = caroline ;
X = anne,
Y = donna ;
X = bridget,
Y = donna ;
false.
这是正确的。但如果我用同样的解决方案查询,我会得到:
?- descend(X, Y).
X = anne,
Y = bridget ;
X = bridget,
Y = caroline ;
X = caroline,
Y = donna ;
X = anne,
Y = caroline ;
X = anne,
Y = donna ;
ERROR: Out of local stack
它没有说X = bridget,Y = donna ;,它也溢出了。我明白为什么它会溢出。我不明白的是为什么它没有找到最后的关系。是因为溢出吗?如果是这样,为什么? (为什么知识库这么小,堆栈却这么大?)。
如果我查询descend(bridget, donna),它会回答yes。
我在想象探索树时遇到问题...
除了那个问题,我猜原来的解决方案效率更高(忽略我最后进入无限循环的事实),不是吗?
谢谢!
【问题讨论】:
标签: prolog failure-slice