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).