2016-12-03 35 views
1

我工作的一個樹轉換成整數列表的功能。我的問題是,當我只需要添加一個或兩個整數時,我可以追加到列表中。但我似乎無法追加三個整數沒有得到這個:如何將1-2-3樹平鋪到列表中?

[[2], 3, 4],當我應該得到[2, 3, 4]

我知道,這個問題從這個聲明

append([Temp1 | Temp2] , Temp3, L) 

凡TEMP1,TEMP2,和TEMP3是我想補充的整數莖。 L是目前包含樹中所有整數的主要列表。


我想有兩個附加聲明,但返回false布爾值,而不是[2, 3, 4]。我試着在[ | ]附近移動,但我不認爲我對他們有足夠的瞭解可以有所作爲。

附加/ 3頁也只上升到連接兩個列表成爲一個。任何幫助將不勝感激:)


編輯:我的代碼如下,我添加了我的測試示例。

chopTree(leaf(_), []). 
chopTree(node1(Leaf, Node), L) :- 
    chopTree(Node, Temp), 
    append([], [Leaf | Temp], L). 
chopTree(node2(Leaf, Node1, Node2), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    append(Temp1, [Leaf | Temp2], L). 
chopTree(node3(_, Node1, Node2, Node3), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    chopTree(Node3, Temp3), 
    append([Temp1 | Temp2] , Temp3, L). 

query(E) :- 
    chopTree(node3(1, 
        node1(2, leaf(1)), 
        node2(3, leaf(1), leaf(1)), 
        node1(4, leaf(1))), 
      E). 
+0

你的代碼是...?包括謂詞定義和查詢。 –

+0

對不起,我認爲這會是一個更普遍的問題。我添加了我的代碼,以及我使用的查詢。 –

+0

爲什麼不能簡單地寫'L = [TEMP1,TEMP2,TEMP3]'?我錯過了什麼嗎? –

回答

1

您的命名已關閉。該變量看起來更好,稱爲「標籤」。然後,node3也許應該有他們的:

chopTree(leaf(_), []). 
chopTree(node1(Label, Node), L) :- 
    chopTree(Node, Temp), 
    % append([], [Label | Temp], L). 
    L = [Label | Temp]. 
chopTree(node2(Label, Node1, Node2), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    append(Temp1, [Label | Temp2], L). 
chopTree(node3(Label1, Label2, Node1, Node2, Node3), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    chopTree(Node3, Temp3), 
    append(Temp1, [Label1 | Temp2] , L1), 
    append(L1, [Label2 | Temp3], L). 

也許node1不應該有任何的標籤了。無論如何,你可以看到,我們只需要調用append兩次,或不過很多時候我們需要的,要逐件建立結果列表件。

1

當與樹列表,結賬DCG符號:DCG中讓你避免append/3完全,使你的代碼更簡單,並在同一時間往往提高其終止性質。

例如:

 
tree_list(leaf(Leaf)) --> [Leaf]. 
tree_list(node1(Leaf, Node)) --> 
     [Leaf], 
     tree_list(Node). 
tree_list(node2(Leaf, Node1, Node2)) --> 
     tree_list(Node1), 
     [Leaf], 
     tree_list(Node2). 
tree_list(node3(_, Node1, Node2, Node3)) --> 
     tree_list(Node1), 
     tree_list(Node2), 
     tree_list(Node3). 

樣品的查詢和答案:

 
?- phrase(tree_list(node3(1, 
        node1(2, leaf(1)), 
        node2(3, leaf(1), leaf(1)), 
        node1(4, leaf(1)))), Ls). 
Ls = [2, 1, 1, 3, 1, 4, 1]. 

您可以輕鬆地適應這個給其他需要的訂單,僅靠移動DCG  機構內的終端和非終結符。

注意,所有的輔助變量完全!