我得到了查询的无限循环(请注意原始查询中缺少的逗号):
?- inOrder(bttree(20,
bttree(10, bttree(5, nil, nil), bttree(15, nil, nil)), bttree(30)), T).
即使在false
您的程序中添加了目标,我也会得到相同的无限循环。生成的程序称为失败切片:
inOrder(bttree(_,L,_),T):- false , inOrder(L,T)。
inOrder(bttree(N,_,_),T) :- T1 = T, append(T1,N,T), false。
inOrder(bttree(_,_,R),T):- false , inOrder(R,T)。
所以这个剩余的子句单独导致了这个循环。事实上,任何带有节点的查询bttree/3
现在都会循环,甚至
?- inOrder(bttree(20, nil,nil), T).
所以我们至少需要修复剩下的可见部分。
并不是说条款是相互独立阅读的,所以你的第一个条款是:
inOrder(bttree(_,L,_),T):- inOrder(L,T).
所以节点的中序遍历将只是左子树的中序遍历。这似乎不对。
你真正想要的是一起描述它们。最好的方法不是使用append/3
而是使用dcg:
inorder(nil) --> [].
inorder(bttree(N,L,R)) -->
inorder(L),
[N],
inorder(R).
现在我们得到:
?- phrase(inorder(bttree(20,
bttree(10, bttree(5, nil, nil), bttree(15, nil, nil)), bttree(30))), T).
false.
又是假的!但是这次bttree(30)
应该替换的是这个:
?- phrase(inorder(bttree(20,
bttree(10, bttree(5, nil, nil), bttree(15, nil, nil)), bttree(30,nil,nil))), T).
T = [5,10,15,20,30].