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