2017-04-03 9 views
1

프롤로그에서 값을 리턴하는 술어를 얻으려면 어떻게해야합니까?트리가 최소 힙인지 점검하십시오.

트리의 노드를 찾고 최소 힙이 있는지 확인해야합니다. 내가 그것을 이런 식 같은데요 - 지금까지

getnode(tree(_, node, _), node). 

내 코드는 다음과

minheap(tree(L, Node, empty)) :- 
    getnode(L, Val), 
    Node =< Val, 
    minheap(L). 
minheap(tree(empty, Node, R)) :- 
    getnode(R, Val), 
    Node =< Val, 
    minheap(R). 

getnode(tree(_,n,_) , n). 

입력 것은 사실이어야 유형 -

minheap(tree(empty,3,tree(tree(empty,8,empty),5,tree(empty,7,empty)))). 

출력이다.

+0

'tree/3'의 형식은 무엇입니까? '나무 (왼쪽, 값, 오른쪽)'? –

+0

예, 정확함 –

+0

노드를 루트로하는 트리는 노드 값이 모든 노드 (일반적으로 : 양쪽 자식 노드)의 값보다 작거나 (적어도 둘 이상인) 자식 노드를 기반으로하는 모든 하위 트리와 자식을 루틴으로하는 모든 하위 트리 또한 최소 힙입니다. 코드가 주어진 노드의 _all_ 자식을 테스트 할 수 있습니까? – CiaPan

답변

0

이 문제를 해결하려면보다 단순한 유틸리티 유추 조건을 정의하는 것이 좋습니다.

예를 들어, lower/2 술어. 이 empty이거나 Tree 값이 Value 인 경우 성공한 lower(Tree,Value)입니다. 그래서 다음과 같이 구현할 수 있습니다 :

lower(empty,_). 
lower(tree(_,TreeValue,_),Value) :- 
    TreeValue >= Value. 

다음으로 우리는 술어 minheap/1을 정의합니다. empty 나무는 확실히 minheap입니다. 또한 그 아이가 낮은 모든 아이들이 minheap/1 자신을 s의 경우 나무는 그렇게하는 minheap입니다 :

minheap(empty). 
minheap(tree(Left,Value,Right)) :- 
    lower(Left,Value), 
    lower(Right,Value), 
    minheap(Left), 
    minheap(Right). 

하고 그게 다에요. empty, tree(empty,val,empty), tree(tree(..),val,empty), tree(empty,val,tree(..))tree(tree(..),val,tree(..)) :이 경우에 이후 minheap/1 조건에서 작업하면 다섯가지 경우를 처리해야 모든을하는 것보다 낫다. lower/2 헬퍼 조건자를 사용하면 두 가지 경우 (emptytree/3) 만 처리하면됩니다.

+0

감사! 왜 그런 생각을하지 않았는지 모르겠다. –

+0

아규먼트 순서는 "A가 * pred * B"와 같이 'pred (A, B)'를 읽는 것이 일반적이다. –