我試圖通過將序列列表重新轉換爲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