簡體   English   中英

Sicstus Prolog-如何從列表構建樹

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM