2016-11-14 12 views
1

私はプロローグの初心者です。引数がツリーの場合に真となる述語を書きたいと思います。私はこのコードを持っていますが、それは私に常に偽を与えます。誰も私を助けることができますpls。バイナリツリーのプロローグ検証

arb_true(nil). 
arb_true([X,G,D]):- X=[_,G,D], arb_true(G), arb_true(D). 

クエリはあなたが句arb_true(nil).を定義しましたが、あなたは空のリストで空の木を表し、'nil'であなたが書く必要はありませarb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).

+0

どのようにテストしますか? – coder

+1

arb_true([6、[4] [1] [[]] [9] [9] []]] ) – bttX

+0

バイナリ検索ツリーが必要な場合、またはverifのみの場合はまだ明確ではありません構造体を運ぶ​​。 –

答えて

4

通常、次の3つの要素のリストとして木を表すが、3つの引数を持つ用語はありません。そして、あなたがツリーを表現することを決めるどのような方法でも、一貫している必要があります。あなたの現在の(私は動作しないと思う?)ソリューションでは、ツリーを表現できる2つの異なる方法をきちんと組み合わせています。

ここでは、バイナリツリーを表す1つの方法があります。空のツリーは、アトムnilとなり、空でないツリーは、tree(Value, Left, Right)となります。だから、:

binary_tree(nil). 
binary_tree(t(_, L, R)) :- 
    binary_tree(L), 
    binary_tree(R). 

それとも、あなたは三つの要素[Value, Left, Right]、および空の木のように空のリスト[]でリストを使用することを選択した場合、あなたが持っているでしょう:

binary_tree([]). 
binary_tree([_, L, R]) :- 
    binary_tree(L), 
    binary_tree(R). 

は、私が最初の表現を言うと思いますもっと普通のものです。どちらの場合も、あなたはそれがバイナリツリーがあるかどうかを確認したい場合は、することができます(とすべきである)「値」(tree(Value, Left, Right)の最初の引数や[Value, Left, Right]の最初の要素を無視しかし

を:あなたのこの例ではバイナリツリーもソートされたバイナリツリー、つまりbinary search treeが表示されています。それがあるかどうかを確認するには、左右のサブツリーの実際の値を比較する必要があります。

+0

。ありがとうございました – bttX

0

です:

arb_true([]). 

また、あなたが必要とします書く:

arb_true([_,G,D]):-arb_true(G), arb_true(D). 

nstead:

arb_true([X,G,D]):- X=[_,G,D], arb_true(G), arb_true(D). 

は今arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]).を照会:

?- arb_true([6,[4,[1,[],[]],[]],[9,[],[]]]). 
true. 
+0

ありがとうございます。私にすべてを説明する – bttX

関連する問題