Tree 检查树是否为最小堆
如何在prolog中获取谓词以返回值 我需要找到树的一个节点,还要检查它是否是一个最小堆。 我猜是这样的:-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
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”。