2016-12-05 2 views
1

私はリストにツリーを平坦化する次のコード、プロローグのリストをどのように一致させるか?

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

を要素のリストは同じです。

treeMatch([], []). 
treeMatch([Th| Tt], [Ah| At]) :- Th is Ah, treeMatch(Tt, At). 

上記単に彼らは空のリストを打つまで、両方のリストから、各インデックスは同じ要素を持っていることを確認するためにチェックリストを通過します。


treeMatch([2, 1, 1, 3, 1, 4, 1], [2, 1, 1, 3, 1, 4, 1])でコードを試してみます。

しかし、私は

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

でそれをしようとした場合、私はfalseを取得します。 Lsの値を取得してtreeMatchに直接挿入して動作させる方法はありますか?

+0

リストが同じ要素を持っているかどうかを確認する '' 'TreeMatch'''についてお話します。しかし、 '' ''は ''が '' ''になっていれば '' '' '' ''に評価されます。したがって、treeMatch([2]、[1 + 1]) '' 'は成功しますが、' 'treeMatch(X、foo)' 'も' 'treeMatch(2、X)' ' (最初はfooが算術式でないため、2番目は評価が根拠のある条件でのみ実行できるためです)。これは期待される行動ですか?私の疑惑は、実際には '' 'L1 = L2'''をチェックしたいということです。 –

答えて

1

あなたは、間違ったモードでthreeMatch/2と呼んでいます。

あなたは

treeMatch([2, 1, 1, 3, 1, 4, 1], phrase(tree_list(node3(1, 
        node1(2, leaf(1)), 
        node2(3, leaf(1), leaf(1)), 
        node1(4, leaf(1)))), Ls)) 

を呼び出した場合、リスト[2, 1, 1, 3, 1, 4, 1]はそれがLsに等しいのですされていない場合、構造体phrase(tree_list(node3...に等しい場合は、あなたが尋ねます。

phrase(tree_list(node3(1, 
         node1(2, leaf(1)), 
         node2(3, leaf(1), leaf(1)), 
         node1(4, leaf(1)))), Ls), 
treeMatch([2, 1, 1, 3, 1, 4, 1], Ls) 

を次のようにあなたはそう最初の呼び出し(phrase/2)は[2, 1, 1, 3, 1, 4, 1]LstreeMatch/2Lsとその[2, 1, 1, 3, 1, 4, 1]一致を検証を統一し、2回のコールで呼び出しを分割する必要があります。

- EDIT -

OP書き込み

I tried it with your method and got ?- treeMatch([2, 3, 4], E). ERROR: user://3:74: is/2: Arguments are not sufficiently instantiated .

提案:(私は仮定し、より良い)treeMatch(E, [2, 3, 4])かを呼び出す

treeMatch([H | Tt], [H | At]) :- treeMatch(Tt, At). 

を次のように使用している場合はtreeMatch/2を変更is/2Th is Ah)あなたの句には1つの方向があります:最初の引数c第二の値で統一されるが、第二の値は第一の値と統一することはできない。

+0

あなたの方法で試してみました。 - treeMatch([2,3,4]、E)。 エラー:ユーザー:// 3:74: は/ 2です:引数が十分にインスタンス化されていません '。それは、Eが[2,3,4]に統一されていないことを意味しますか? –

+0

@AndrewRaleigh - 私の答えを改善しました。お役に立てれば。 – max66

+0

修正していただきありがとうございます。 –

関連する問題