Я пытаюсь «обратить» неупорядоченный обход, превратив неупорядоченный список обратно в BST.
BSTs имеет форму предиката 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 в обратном порядке, но не могу полностью решить, как это будет сделано.
Любые идеи о том, как лучше всего это сделать? Спасибо!