我有这个例子:
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z), descend(Z,Y).
child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
它很好用,我理解。这是一个小练习的解决方案。我的解决方案是相同的,但正在改变:
下降(X,Y):-下降(X,Z),下降(Z,Y)。
也就是说,在第二条规则中改变child
for 。descend
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
。
我在想象探索树时遇到问题......
除了那个问题,我猜原来的解决方案效率更高(忽略我的最后进入无限循环的事实),不是吗?
谢谢!