2017-05-28 191 views
1

即时通讯新的使用Prolog,我希望你能帮助我。Prolog。二叉树的节点

我需要得到所有节点与一个名为listofnodes(A4,L)谓词二叉树。树A4由这样的:

[[[[[],1,[]],5,[]], 
7, 
[[],3,[[],4,[]]]], 
6, 
[[[],10,[]], 
8, 
[[[],9,[]],11,[[],2,[]]]]] 

而且具有这种形式

enter image description here

确定。那听起来很容易,但我需要做谓语只能使用这些构造函数和选择:

empty([]). 
root([_,N,_], N). %root node 
hi([HI,_,_],HI). %left child 
hd([_,_,HD],HD). %right child 
dotree(R,HI,HD,[HI,R,HD]). %make a tree 

所以我想我可以用下面的代码做到这一点,但它的错误

childs(X,[L,X,R],[L,X,R]). 
childs(X,[L,_,_],D) :- childs(X,L,D). 
childs(X,[_,_,R],D) :- childs(X,R,D). 

listofnodes([],[]). 
listofnodes([[],X,[]],[X]). 
listofnodes(Abn,P) :- raiz(Abn, N), childs(N,Abn,D), listofnodes(D,P). 

任何想法我怎么能解决这个?

谢谢!

+0

什么是raiz/2? – lurker

+0

但是列表中的节点的顺序是什么,为什么使用这种奇怪的嵌套列表树而不是普通的'tree/3'树? – 2017-05-29 08:35:51

回答

1

你可能,如果你正确地定义你的递归情况下不需要listofnodes([[],X,[]],[X]).。您已经有了listofnodes([], []).,它可以正确定义空树的节点列表。

想想规则可能是节点在一般情况下的列表:

了树的节点列表,[Left, Node, Right]将节点为Left列表,节点Node,和来自Right的节点列表。

所以,你的谓语应该以某种方式类似于此规则。

listofnodes([Left, Node, Right], ListOfNodes) :- 
    listofnodes(Left, LeftNodes), 
    ... 

我将剩下的作为练习。

+0

谢谢!真的有用:) – Aceconhielo