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

Tree Sicstus Prolog-如何从列表构建树,tree,prolog,Tree,Prolog,遇到一个关于如何从列表构建树的问题 示例:我得到了List=[1,2,3,4],运行之后我想得到这样的答案 T = Tree(1, Tree(2, Tree(3, 4)). 我是新来西斯图的。我尝试过使用以下代码: build_tree([X], X). build_tree([H|S], T) :- build_tree([S] , Tree(H, T)). 当列表中只有一个元素,但列表中有多个元素时, 我得到错误代码: 资源错误:内存不足 请注意,大写符号通常是为变量保留的(ISO pr

遇到一个关于如何从列表构建树的问题

示例:我得到了
List=[1,2,3,4]
,运行之后我想得到这样的答案

T = Tree(1, Tree(2, Tree(3, 4)).
我是新来西斯图的。我尝试过使用以下代码:

build_tree([X], X).
build_tree([H|S], T) :- build_tree([S] , Tree(H, T)).
当列表中只有一个元素,但列表中有多个元素时, 我得到错误代码:

资源错误:内存不足


请注意,大写符号通常是为变量保留的(ISO prolog)。 以下是我的解决方案:

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

请注意,大写符号通常是为变量保留的(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.

您不需要做任何事情,列表是一棵树,例如:

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

正如@Kaarel所指出的,当按顺序插入节点时,二叉树的退化形式是一个链表:

Prolog的列表表示法只是普通Prolog术语的语法糖:
/2
,其中第一个参数是列表的头,第二个参数是列表的尾。空列表的符号是原子“[]”。因此,类似于
[1,2,3]
的列表的内部表示是结构/术语

.( 1 , .( 2 , .( 3 , '[]' )
一个元素列表,
[1]
作为

.( 1 , '[]' )
空列表作为atom
“[]”

你可以看到语法糖的吸引力

有关更多详细信息,请参阅

鉴于这种身份,类似这样的东西会给你你的原始帖子所说的你想要的:

list2tree( [X,Y] , tree(X,Y) )
  .
list2tree( [X|Xs] , tree( X , Ts ) :-
  list2tree( Xs , Ts )
  .

尽管你所做的只是改变函子。但是,您的结构似乎不允许空列表/树。您打算如何表示这一点?

正如@Kaarel所指出的,当按顺序插入节点时得到的二叉树的退化形式是一个链表:

Prolog的列表表示法只是普通Prolog术语的语法糖:
/2
,其中第一个参数是列表的头,第二个参数是列表的尾。空列表的符号是原子“[]”。因此,类似于
[1,2,3]
的列表的内部表示是结构/术语

.( 1 , .( 2 , .( 3 , '[]' )
一个元素列表,
[1]
作为

.( 1 , '[]' )
空列表作为atom
“[]”

你可以看到语法糖的吸引力

有关更多详细信息,请参阅

鉴于这种身份,类似这样的东西会给你你的原始帖子所说的你想要的:

list2tree( [X,Y] , tree(X,Y) )
  .
list2tree( [X|Xs] , tree( X , Ts ) :-
  list2tree( Xs , Ts )
  .
尽管你所做的只是改变函子。但是,您的结构似乎不允许空列表/树。你打算如何表达这一点