2017-05-28 149 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