Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 拿一棵树做一个清单_List_Tree_Prolog - Fatal编程技术网

List 拿一棵树做一个清单

List 拿一棵树做一个清单,list,tree,prolog,List,Tree,Prolog,我写了一个程序,可以把一个列表变成一棵树 build_tree([X,Y],'Tree'(X,Y)) :- !. build_tree([X|Y],'Tree'(X,Z)) :- build_tree(Y, Z). 如果我想反转此过程并将树更改回列表,我将如何执行此操作?请注意,树->列表转换不是一个函数,因为树可能对应于多个列表: ?- build_tree([1, 2, 3], T). T = 'Tree'(1, 'Tree'(2, 3)). ?- build_tree([1, 'Tr

我写了一个程序,可以把一个列表变成一棵树

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

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

如果我想反转此过程并将树更改回列表,我将如何执行此操作?

请注意,树->列表转换不是一个函数,因为树可能对应于多个列表:

?- build_tree([1, 2, 3], T).
T = 'Tree'(1, 'Tree'(2, 3)).

?- build_tree([1, 'Tree'(2, 3)], T).
T = 'Tree'(1, 'Tree'(2, 3)).

如果您想要一个可以从树中生成所有列表的谓词,请从
build_tree
中删除cut,并使用变量first参数应用它。如果您想要一个确定性转换,请编写一个新的谓词
tree\u to\u list

,只是好奇一下,这个确定性的版本会怎样?假设树中只有一个可能的列表,例如:

('Tree'('Tree'(nil, 2, nil), 5, 'Tree'(nil, 6, nil)).

这将给出:L=[5,2,6]

如果从第一条规则中删除剪切,那么代码就可以在“向后”模式下工作:

?- build_tree([1,2,3,4],T).
T = 'Tree'(1, 'Tree'(2, 'Tree'(3, 4))) ;
false.

?- build_tree(X,$T).
X = [1, 'Tree'(2, 'Tree'(3, 4))] ;
X = [1, 2, 'Tree'(3, 4)] ;
X = [1, 2, 3, 4] ;
false.

如果考虑树屁股节点(叶、元素、叶),例如< /P>

flatten(node(node(leaf,2,leaf),3,node(leaf,5,leaf)),X).
给出
X=[2,3,5]。

如果你想有bst

列表到树

insert(E,leaf,node(leaf,E,leaf)).
insert(E,node(L,N,R),T) :-
 E >= N,
 T=node(L,N,R1),
 insert(E,R,R1).
insert(E,node(L,N,R),T) :-
 E < N,
 T=node(L1,N,R),
 insert(E,L,L1).

list_to_tree(List,Tree) :-
    list_to_tree(List,leaf,Trea2),
    Tree=Trea2.
list_to_tree([],Tree,Tree).
list_to_tree([H|T],Tree,St):-
 insert(H,Tree,R),
 list_to_tree(T,R,St).
插入(E,叶,节点(叶,E,叶))。
插入(E,节点(L,N,R),T):-
E>=N,
T=节点(L,N,R1),
插入(E、R、R1)。
插入(E,节点(L,N,R),T):-
E
在描述列表时,DCG通常是描述树和节点列表之间关系的好方法(上面的展平/2):节点(叶)-->[]。节点(节点(L,E,R))-->节点(L),[E],节点(R)。
insert(E,leaf,node(leaf,E,leaf)).
insert(E,node(L,N,R),T) :-
 E >= N,
 T=node(L,N,R1),
 insert(E,R,R1).
insert(E,node(L,N,R),T) :-
 E < N,
 T=node(L1,N,R),
 insert(E,L,L1).

list_to_tree(List,Tree) :-
    list_to_tree(List,leaf,Trea2),
    Tree=Trea2.
list_to_tree([],Tree,Tree).
list_to_tree([H|T],Tree,St):-
 insert(H,Tree,R),
 list_to_tree(T,R,St).