提取Prolog树的最小值

时间:2018-11-20 18:09:04

标签: prolog

我是一个非常Prolog的初学者,所以这个问题可能会变得毫无用处,反正我已经定义了如下Prolog树:

type([null, tree(T, tree(T), tree(T))]:tree(T)).  

表示树为空或具有左子树和右子树。
然后,我定义了一个谓词,该谓词应输出该树的最小节点值,即:

pred(min(tree(T), integer)).
%% (++ --)
pred(calc_min(integer, integer, integer, integer)).
%% (++, ++, ++, --)

    min(tree(Root, null, null), Root).
    min(tree(Root, Left, Right), Result):-
        min(Left, LeftRes),
        min(Right, RightRes),
        calc_min(Root, LeftRes, RightRes, Result).

我认为我必须在树为空树的地方定义基本子句,但我不知道要输出什么。

1 个答案:

答案 0 :(得分:0)

哦,好树。获取树的最小值很容易,但是如果要真正获取它,则需要其他谓词来帮助第一个谓词查找树的最小值。

min(tree(X, L, _R), Min) :- min_helper(L, X, Min).
min_helper(null, X, X).
min_helper(tree(X, L, _R), _X0, Min) :- min_helper(L, X, Min).

但这仅在二叉树为搜索树的情况下有效。您的树是二叉搜索树吗?如果不是二叉树,那么获取min的树就不那么容易了。但是,您很难做到这一点,因为您想要最小值min和left min以及right min,但这太困难了。但是您说的是整数树,所以再也不难了。

min(null, null).
min(tree(X, L, R), Min) :-
    min(L, LMin),
    min(R, RMin),
    min_with_null(X, LMin, Min0),
    min_with_null(Min0, RMin, Min).

min_with_null(X, Maybe_null, Min) :-
    (   Maybe_null == null
    ->  Min = X
    ;   Min is min(X, Maybe_null)
    ).

但是null的最小值是什么?

?- min(null, Min).
Min = null.

我检查是否为空,但我不检查是否为整数,因为您写了一些东西,它说是整数。但是你确定吗?

另外一棵树的最小长度是什么?

?- min(tree(1, null, null), Min).
Min = 1.

?- min(tree(1, tree(0, null, null), null), Min).
Min = 0.

?- min(tree(0, tree(1, null, null), null), Min).
Min = 0.

?- min(tree(1, null, tree(0, null, null)), Min).
Min = 0.

?- min(tree(0, null, tree(1, null, null)), Min).
Min = 0.

?- min(tree(1, tree(2, null, null), tree(3, null, null)), Min).
Min = 1.

我忘了测试用例吗?我不知道。