检查树是否是最小堆

时间:2017-04-03 14:20:17

标签: tree prolog min-heap

如何在prolog中获取谓词以返回值?

我需要找到树的节点,并检查它是否为最小堆。 我猜它是这样的: -

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)))).

输出应该是真的。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,您最好定义一些使生活更简单的实用程序谓词。

例如谓词lower/2。如果lower(Tree,Value)Tree,或empty的值高于Tree,则Value成功。所以你可以这样实现:

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

接下来我们定义谓词minheap/1empty树绝对是minheap。此外,如果一个树的子女较低且所有的孩子都是minheap/1,那么它就是一个minheap,所以:

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

就是这样。这比在minheap/1谓词中尝试所有工作更好,因为在这种情况下,您应该处理五个案例:empty,{{ 1}},tree(empty,val,empty)tree(tree(..),val,empty)tree(empty,val,tree(..))。通过使用tree(tree(..),val,tree(..))辅助谓词,我们只需要处理两种情况:lower/2empty