プロローグ述語を作成する必要があるため、from_list/2
呼び出すfrom_list([], T)
と、リスト(int)内のアイテムを含むツリーが返されます。これまでのところ:
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).
そして、答えを必要としない2番目のはるかに小さな質問でもありません
プロローグが適切に使用されると非常にエレガントなスタイルになることは知っています...そしてこのコードは...それほどエレガントではありません...
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) ).
それを少しきれいにする方法についてのヒントはありますか?