2012-04-26 5 views
1

プロログ述語from_list/2を作成して、from_list([], T)を呼び出すと、これまでのリスト(ints)の項目を含むツリーを返すようにする必要があります。リストからプロローグBSTを作成し、パラメータで返す

from_list([], empty). 
from_list([X], T) :- 
    insert(X, empty, T). 
from_list([X|Y], T) :- 
    from_list(Y, NT), 
    insert(X, NT, T). 

編集:考え出しましたが、リストの逆順でツリーに追加しています。どんな助け?

ここに私の挿入述語がありますが、うまくいくようです。

insert(X, empty, bt(X, empty, empty)). 
insert(X, bt(X2, L, R), bt(X2, NL, R)) :- 
    X < X2, 
    !, 
    insert(X, L, NL). 
insert(X, bt(X2, L, R), bt(X2, L, NR)):- 
    insert(X, R, NR). 

ではなく、また、私はプロローグが適切に使用される非常にエレガントなスタイル...と、このコードを持って知っている答え

を必要としない第二、はるかに小さい問題...そうエレガントではありません...

is_search(empty). 
is_search(bt(_, empty, empty)). 
is_search(bt(X, empty, bt(Y,LEFT,RIGHT))) :- 
    X < Y, 
    is_search(LEFT), 
    is_search(RIGHT). 
is_search(bt(X, bt(Y,LEFT,RIGHT), empty)) :- 
    X > Y, 
    is_search(LEFT), 
    is_search(RIGHT). 
is_search(bt(X, bt(Y,L1,R1), bt(Z, L2, R2))) :- 
    X > Y, 
    X < Z, 
    is_search(bt(Y, L1, R1)), 
    is_search(bt(Z, L2, R2)). 

これを少しきれいにする方法についてのヒントを教えてください。

+1

あなた自身を次回にインデントしてみてください! – m09

+0

@Mog:素晴らしい編集! – false

答えて

1

私の側からわずかヒント:

from_list([], empty). 
from_list([X], T):- insert(X, empty, T). 
from_list([X|Y], T):- from_list(Y, NT), insert(X, NT, T). 

you'reが空では知られていないライン2を見ている場合これは動作しません。私の知る限り、我々は右、SWI-Prologのの話している見ることができるように:逆の順序でリストを持っている

reverse(X,R). 

PSを使うのか?

1

2つ目の質問については、バイナリツリーの2つの場合(5つではない)を記述する必要があります:空であるか、左右のすべての要素が小さい内部ノードですそれぞれ、より大きな、およびバイナリツリーそのものです:

bt(empty). 
bt(bt(Val, Left, Right)) :- 
    all_smaller_than(Left, Val), 
    all_larger_than(Right, Val), 
    bt(Left), 
    bt(Right). 

は私がall_smaller_than/2を残して、あなたのためのエクササイズとして/ 2をall_larger_than。ヒント:再度、それぞれに2つの節が必要です。あなたはそれをより速くする方法を見つけるかもしれません...

関連する問題