Sicstus Prolog - 如何从列表中构建树

时间:2011-09-09 09:22:06

标签: tree prolog

有关如何从列表构建树的问题。

示例:我有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)).

当列表中只有一个元素,但当列表中有多个元素时,它可以工作 我收到错误代码:

  

资源错误:内存不足

3 个答案:

答案 0 :(得分:2)

正如@Kaarel所说,顺序插入节点时得到的二叉树的简并形式是一个链表:

degenerate tree

Prolog的列表符号只是一个正常的prolog术语的语法糖:./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 )
  .

虽然你所做的只是改变仿函数。但是,您的结构似乎不允许空列表/树。你打算怎么代表那个?

答案 1 :(得分:1)

请注意,大写符号通常保留用于变量(ISO prolog)。 在这里我的解决方案:

build_tree([X,Y],'Tree'(X,Y)) :- !.
build_tree([X|Y],'Tree'(X,Z)) :- build_tree(Y, Z).

答案 2 :(得分:1)

您无需执行任何操作,列表 树,例如:

?- write_canonical([1, 2, 3, 4]).
'.'(1,'.'(2,'.'(3,'.'(4,[]))))
true.