有关如何从列表构建树的问题。
示例:我有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)).
当列表中只有一个元素,但当列表中有多个元素时,它可以工作 我收到错误代码:
资源错误:内存不足
答案 0 :(得分:2)
正如@Kaarel所说,顺序插入节点时得到的二叉树的简并形式是一个链表:
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.