Tree 检查树是否为最小堆

Tree 检查树是否为最小堆,tree,prolog,min-heap,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), N

如何在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).

输出应该是真的。

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

例如谓词
lower/2
<代码>降低(树,值)如果
,或者
的值高于
值,则成功。因此,您可以这样实现:

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

就这样。这比尝试在
minheap/1
谓词中完成所有工作要好,因为在这种情况下,您应该处理五种情况:
empty
tree(empty,val,empty)
tree(tree(..),val,empty)
tree(tree(..),val,tree(..)
。通过使用
lower/2
helper谓词,我们只需要处理两种情况:
empty
tree/3

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

例如谓词
lower/2
<代码>降低(树,值)
如果
,或者
的值高于
值,则成功。因此,您可以这样实现:

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

就这样。这比尝试在
minheap/1
谓词中完成所有工作要好,因为在这种情况下,您应该处理五种情况:
empty
tree(empty,val,empty)
tree(tree(..),val,empty)
tree(tree(..),val,tree(..)
。通过使用
lower/2
helper谓词,我们只需要处理两种情况:
empty
tree/3

树/3
的格式是什么<代码>树(左、值、右)?是的,如果节点的值小于(或至少不大于)所有(通常:都是)子节点的值,并且在子节点上根的所有子树也是最小堆,则在节点上根的树是最小堆。您的代码能够测试给定节点的所有子节点吗?这正是我所遇到的问题。如何从输入中提取节点。我的逻辑在这一点上可能是不正确的。@johnkaton:还要注意,变量以大写字母开头。因此,对于
getnode/2
来说,
n
被解释为一个常量。
树/3
的格式是什么<代码>树(左、值、右)?是的,如果节点的值小于(或至少不大于)所有(通常:都是)子节点的值,并且在子节点上根的所有子树也是最小堆,则在节点上根的树是最小堆。您的代码能够测试给定节点的所有子节点吗?这正是我所遇到的问题。如何从输入中提取节点。我的逻辑在这一点上可能是不正确的。@johnkaton:还要注意,变量以大写字母开头。因此对于
getnode/2
来说,
n
被解释为一个常量。谢谢!我不知道为什么我没有想到这一点。按照惯例,论证顺序应符合
pred(a,B)
的解读,即“a是pred B”。谢谢!我不知道为什么我没有想到这一点。按照惯例,论证顺序应符合
pred(a,B)
的解读,即“a是pred B”。