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 )
.
尽管你所做的只是改变函子。但是,您的结构似乎不允许空列表/树。你打算如何表达这一点