【问题标题】:Extract the minimum value of a Prolog tree提取 Prolog 树的最小值
【发布时间】:2018-11-20 18:09:04
【问题描述】:

我是一个非常 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).

我想我必须定义树是空树的基本子句,但我不知道要输出什么。

【问题讨论】:

  • "但我不知道要输出什么。" - 我们也不知道您的代码应该做什么。你希望空树的最小值是多少?
  • 感兴趣的:Prolog 中的 RosettaCode TreeTraversal
  • 一棵空(null)树没有最小值,因为它没有值。您的基本案例应该是具有最小值的最简单的树。此外,检查递归 min/2 子句中的逻辑。计算完左右最小值后,结果树的最小值应该是多少?提示:这不是一个大计算。您正在考虑 3 个值:根值、左值和右值。

标签: prolog


【解决方案1】:

哦,好树。得到树的最小值很容易,但如果你想真正得到它,你需要其他谓词来帮助第一个谓词找到树的最小值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2013-04-27
    • 2011-07-15
    • 2021-12-19
    • 2014-10-17
    • 2012-11-28
    相关资源
    最近更新 更多