2012-04-01 52 views
0

我想定義一個二位謂詞buildTree,它的第一個參數是一個節點列表(即[a,b,c]),第二個參數是樹樹(a,樹(b,nil,nil),樹(c,nil,nil))。這是謂語 「樹」:謂詞buildTree,其第一個參數是節點列表,其第二個參數是樹

tree(nil). 
tree(tree(_,L,R)):-tree(L),tree(R). 

,這是謂語 「buildTree」:

buildTree([],nil). 
buildTree([X|[Y|H]],tree(X,L,R)):- 
    buildTree([Y|H],L), 
    buildTree(H,R). 

,但與查詢,即buildTree([a,b,c],T),我也沒有複雜的術語tree(a,tree(b,nil,nil),tree(c,nil,nil))。爲什麼?

+0

它失敗了,因爲它必須調用'buildTree([c],R)',並且沒有一個單元列表的規則。另一個問題是你將'H'傳遞給兩個遞歸調用,所以你最終會在兩個子樹中得到相同的元素。事實上,你的問題有點不明確。 @ user1304831的解決方案爲'[a,b,c]'提供了所需的輸出,但是會爲較長的列表生成極不平衡的樹,我不認爲這就是你所追求的。你能舉一個例子說:'[a,b,c,d,e,f]'? – 2012-04-01 23:12:44

回答

0

您尚未正確定義buildTree,首先,您沒有爲一個輸入定義它,也沒有定義它,因此在邏輯上,您的答案最終會不正確。

應該多在這行:

/* Stopping conditions */ 
buildTree([X | nil], tree(X, nil, nil)). /* First trivial case */ 
buildTree([X | [Y | nil]], tree(X, tree(Y, nil, nil), nil)). /* Second case */ 

/* builds a tree, according to your reasoning */ 
buildTree([X | [Y | H]], tree(X, L, R)) :- buildTree(Y, L), buildTree(H, R). 

當然,這不是一個二叉搜索樹(對於這一點,你必須定義像treeInsert一些邏輯)。

+0

不幸的是,用查詢** buildTree([a,b,c],T)** Prolog讓我回到「假」,但我想T =樹(a,樹(b,nil,nil),樹C,零,零))。 – Mark 2012-04-02 06:03:58

+0

你似乎正在以這種方式錯誤地工作:首先使用謂詞邏輯來表達你想要的。然後在prolog中寫下來。在你的原始代碼中,當然會給你「假」。查詢「buildtree([C],nil)」沒有被處理,因此,它當然是錯誤的。首先,用文字來定義你真正想做的事情;我的代碼創建了你想要的樹,但對於大型輸入,它將非常不平衡,並且沒有排序邏輯。 – user1304831 2012-04-02 06:20:54

相關問題