私は、ツリーが別のツリーの逆のバージョンであるかどうかを調べる小さな関数に取り組んでいます。例えば プロローグ内のノードを等しくする?
、1 1
2 3 = 3 2
1 1
私のコードは次のちょうどバージョンです:
私の基礎は、以下の通りであるtreeRev(leaf(Leaf1), leaf(Leaf2)) :-
leaf(Leaf1) is leaf(Leaf2).
treeRev(node1(Leaf1, Node1), node1(Leaf2, Node2)) :-
node1(Leaf1,treeRev(Node1)) is node1(Leaf2, treeRev(Node2)).
treeRev(node2(Leaf1, Node1, Node2), node2(Leaf2, Node3, Node4)) :-
node2(Leaf1, treeRev(Node1), treeRev(Node2)) is
node2(Leaf2, treeRev(Node4), treeRev(Node3)).
:
ベースケースは、2枚の葉が等しいです、ただ真実を返します。ノードが1つの場合は、葉が等しいかどうかをチェックし、そのノードで再帰的に関数を呼び出します。
2つのノードの場合は、ツリーが等しいかどうかを確認し、2つ目のツリーからノードを反転した後に再帰関数を呼び出します。木の上で他の操作を使用している場合
私の問題は、私は
ERROR: is/2: Arithmetic: `leaf/1' is not a function
事があるバグを得続ける、ですが、私はこのエラーを得ることはありません。これを回避する方法に関するアドバイスはありますか?唯一の制限は、=
を使用できないことです。
私はまた、最も可能性の高い原因は、is
の側がgoogleとstackoverflowの検索によると、同じ "タイプ"を返していないということです。私はそれを見ている方法は、私は両端にほぼ同じことがあるので、ここではそうすべきではありません。
をお読みいただきありがとうございました、そして任意のヘルプは大歓迎です:)
こんにちは、ありがとう:)しかし、私は避けるようにしようとしていることです'='を使用する必要があります。統一なしで同じ結果を得る方法はありますか?私はその限界を知っていますが、それは問題の条件です。 –
もちろん、私はちょうど/ 2が失敗した理由を説明しようとしました。ですから、何らかの統一を使用する必要があります。 =/2を使用しないという制限がある場合は、パターンマッチング(これも統一ですが、=記号は使用しません)を使用して行うことができます。私は私の答えを更新します... – coder
それは素晴らしい人です、あなたがそれを考えた方法は、多くの意味があります。ありがとう、私はそれを感謝します:) –