[英]Sicstus Prolog - How to build a tree from a list
遇到了有關如何從列表構建樹的問題。
示例:我有List = [1,2,3,4]
,運行后,我想要得到這樣的答案
T = Tree(1, Tree(2, Tree(3, 4)).
我是Sicstus的新手。 我試過使用代碼:
build_tree([X], X).
build_tree([H|S], T) :- build_tree([S] , Tree(H, T)).
當列表中只有一個元素時,它可以工作,但是當列表中有多個元素時,我得到錯誤代碼:
資源錯誤:內存不足
正如@Kaarel指出的那樣,按順序插入節點時得到的二叉樹的簡並形式是一個鏈表:
Prolog的列表符號只是普通prolog術語: ./2
語法糖,其中第一個參數是列表的開頭,第二個參數是列表的./2
。 空列表的名稱是原子'[]'。 因此,列表[1,2,3]
的內部表示形式是結構/術語
.( 1 , .( 2 , .( 3 , '[]' )
一個元素列表, [1]
為
.( 1 , '[]' )
空列表作為原子'[]'
。
您可以看到語法糖的吸引力。
有關更多詳細信息,請參見http://cs.union.edu/~striegnk/learn-prolog-now/html/node78.html 。
鑒於這種身份,類似這樣的東西將為您提供原始帖子所說的內容:
list2tree( [X,Y] , tree(X,Y) )
.
list2tree( [X|Xs] , tree( X , Ts ) :-
list2tree( Xs , Ts )
.
盡管您要做的只是更換函子。 但是,您的結構似乎不允許使用空列表/樹。 您打算如何表示?
請注意,大寫符號通常為變量保留(ISO prolog)。 這是我的解決方案:
build_tree([X,Y],'Tree'(X,Y)) :- !.
build_tree([X|Y],'Tree'(X,Z)) :- build_tree(Y, Z).
您無需執行任何操作,列表就是一棵樹,例如:
?- write_canonical([1, 2, 3, 4]).
'.'(1,'.'(2,'.'(3,'.'(4,[]))))
true.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.