inorder 목록을 다시 BST로 바꾸어 인버스 순회를 "되돌리기"하고 있습니다.프롤로그에서 inorder 열거
BST를 술어 양식 node(Value,Left,Right)
또는 leaf
이 있으므로 빈 나무는, 하나 개의 노드를 가진 나무는 node(_,leaf,leaf)
단지 leaf
입니다.
술어 enumerate_bst(Elems,Bst)
이 주어지면 Bst
을 inorder 목록 Elems
의 모든 가능성에 일치시키는 것이 목표입니다. 예를 들어 (주 setof/3)의 경우 : I 시도
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).
:이 목록 inorder를의에
이미 주어진 BST 일치하는 조건이 있습니다
?- 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)
].
내가 할 노력은 무엇 역순으로 목록에 넣음으로써 사용하는 것이지만, 이것은 하나의 결과만을 반환합니다. 나는 정확히 그 이유를 모르겠습니다. 나는 현재 내가 역에 기본 조건 append/3를 사용하기 위해 노력하고있어
할 노력하고있어,하지만 완전히이 수행되는 방법을 결정할 수없는 무엇
.
가장 좋은 방법은 무엇입니까? 감사!
이 경우'-> '구문은 무엇입니까? – thestateofmay
그것은 [태그 : dcg]입니다. 정규 Prolog 술어로 어떻게 확장되는지 보려면''inorder ''라고 말하십시오. – false