我试图通过将序列列表重新转换为BST来“颠倒”序列遍历。在Prolog中枚举序列号
BST的谓词形式为node(Value,Left,Right)
或leaf
,所以空树只是leaf
,一个节点的树是node(_,leaf,leaf)
。
给定谓词enumerate_bst(Elems,Bst)
,目标是将Bst
与排序列表Elems
的所有可能性匹配。例如(注setof/3):
?- setof(Bst,enumerate_bst([],Bst),Enum).
Enum = [leaf].
?- setof(Bst,enumerate_bst([1,2],Bst),Enum).
Enum = [
node(1, leaf, node(2, leaf, leaf)),
node(2, node(1, leaf, leaf), leaf)
].
?- setof(Bst,enumerate_bst([1,2,3],Bst),Enum).
Enum = [
node(1, leaf, node(2, leaf, node(3, leaf, leaf))),
node(1, leaf, node(3, node(2, leaf, leaf), leaf)),
node(2, node(1, leaf, leaf), node(3, leaf, leaf)),
node(3, node(1, leaf, node(2, leaf, leaf)), leaf),
node(3, node(2, node(1, leaf, leaf), leaf), leaf)
].
我试图这样做:
我已经有一个给定的BST相匹配的谓词是序列表:
inorder(leaf,[]).
inorder(node(X,L,R),Elems) :-
inorder(L,Elems_L),
inorder(R,Elems_R),
append(Elems_L,[X],Tmp),
append(Tmp,Elems_R,Elems).
我试着通过在列表中反向使用它,但这只返回一个结果,我不完全确定为什么。
什么我正在尝试做
我试图使用本地谓词append/3反向,但不能完全确定这将如何做。
任何想法,以最好的方式来做到这一点?谢谢!
在这种情况下''>'语法是什么? – thestateofmay
这是一个[tag:dcg]。说'列出(inorder)'来看看它是如何扩展到普通的Prolog谓词的。 – false