如何在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)))).
输出应该是真的。
答案 0 :(得分:0)
为了解决这个问题,您最好定义一些使生活更简单的实用程序谓词。
例如谓词lower/2
。如果lower(Tree,Value)
为Tree
,或empty
的值高于Tree
,则Value
成功。所以你可以这样实现:
lower(empty,_).
lower(tree(_,TreeValue,_),Value) :-
TreeValue >= Value.
接下来我们定义谓词minheap/1
。 empty
树绝对是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/2
和empty
。