2016-12-03 8 views
1

私は、ツリーを整数のリストに変換する関数に取り組んでいます。私の問題は、1つまたは2つの整数だけを追加する必要があるときに、リストに追加できることです。しかし、私はこれを取得せずに3つの整数を追加することができないように見えます。1-2-3ツリーをリストに展開する方法は?

[[2], 3, 4]、私は[2, 3, 4]を取得する必要があります。

私は、問題はこの文からTEMP1、TEMP2とTEMP3は私が追加したいの整数である

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

ステムことを知っています。 Lはこれまでのツリーからのすべての整数を含むメインリストです。


私は2つの追記文を持つ試みたが、その代わりに[2, 3, 4]falseブール値を返します。私は[ | ]の周りを移動しようとしましたが、私は彼らが違いを生み出したと十分に知っているとは思いません。

append/3ページも2つのリストを1つに連結するだけです。どのような助けが大いに感謝されるでしょう:)


編集:私のコードは以下のとおりです、私は私のテストの例を追加しました。

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は、おそらくそれらのをしておく必要がありますおそらく、node1も、その中の任意のラベルを持つべきではない

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). 

。とにかく、わかるように、appendを2回呼び出すか、何度も必要なときに結果リストを1つずつ作成します。

1

リストに木を関連して、チェックアウトDCG表記:DCGsあなたは、多くの場合、その終了の特性を向上させるあなたのコードは単純かつ同時に行う、完全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  機関内の端末と非終端を移動することで、他の所望の受注にこれを適応させることができます。

すべての補助変数はとなり、となりました。

関連する問題