2012-04-26 18 views
1

我需要創建一個prolog謂詞from_list/2,這樣如果我調用from_list([], T),我將返回一個包含list(ints)中項目的樹,目前爲止:從列表中創建一個prolog 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 2012-04-27 12:11:54

+0

@Mog:很棒的編輯! – false 2012-04-27 17:47:25

回答

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

關於你的第二個問題,我想說你應該描述二叉樹的兩個(而不是五個)情況:它可以是空的,也可以是一個內部節點,其中左側和右側的所有元素都較小大,並且分別二叉樹自己:

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作爲練習。提示:對於他們每個人來說,兩個條款也足夠了。您可能會找到一種方法使其更快...

相關問題