我需要制作一个prolog谓词from_list/2
,这样如果我打电话给from_list([], T)
,我会找回一个包含列表中项目的树(ints)到目前为止我有:
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).
而且还不是第二个,更小的问题,它不需要答案
我知道prolog在正确使用时具有非常优雅的风格......而且这段代码......不那么优雅......
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) ).
关于如何清理它的任何提示?
答案 0 :(得分: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).
这是行不通的,因为如果你看第2行就不知道了。
要使用相反的顺序列表
reverse(X,R).
PS:据我所知,我们正在谈论SWI-Prolog,对吗?
答案 1 :(得分:1)
关于你的第二个问题,我想你应该描述一个二叉树的TWO(而不是五个!)情况:它是空的,或者它是一个内部节点,左边和右边的所有元素都较小,分别更大,并且是二叉树本身:
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和all_larger_than / 2作为练习。提示:同样,两个条款足以满足每个条款的要求。你可能会找到一种让它更快的方法......