1

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

输出应该是真的。

4

1 回答 1

0

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

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

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

接下来我们定义谓词minheap/1。一empty棵树绝对是一棵树minheap。此外,如果一棵树的子节点较低且所有子节点都是minheap/1s 自己,则该树是 minheap,因此:

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

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

于 2017-04-03T14:41:32.557 回答