最大功能没有给出正确答案

时间:2017-04-20 00:23:14

标签: prolog max

在Prolog中,我创建了一个Max函数,但是,我试图比较它返回给其他人的数字,并且可以说它没有给我正确的数字。我的列表将是[2,2,1,2],因此我的max应为2,但是当我将最大结果与2进行比较时,它会失败。

我的代码如下所示:

maximumElement([X], X).
maximumElement([H|T], MaxFound):-
    maximumElement(T, MaxOfTail),
    MaxFound = max(MaxOfTail, H).

我的问题也可能是我在比较数字的地方,但是现在我已经改变它,以便在调用时该谓词看起来像这样:

maximumElement(List, MaxFound),
checkIfTwo(MaxFound, MaxFound).

这就是它的谓词:

checkIfTwo(2,2).

因为我比较那样,看起来很奇怪,我会弄错,因为我正在比较相同的数字,所以我认为这是我的比较或找到最大值的问题。

1 个答案:

答案 0 :(得分:0)

正如评论中的每个人所说,足以说明

maximumElement([X], X).
maximumElement([H|T], MaxFound):-
    maximumElement(T, MaxOfTail),
    MaxFound is max(MaxOfTail, H).

但我写的答案无论如何因为你有问题,它不仅仅是任何元素,它必须是数字或算术表达式,因为你使用is max(),所以名字不是太大,你也得到了选择点,即使没有选择了。看:

?- maximumElement([1+2,2], Max).
Max = 3 ;
false.

所以也许你可以写一下:

max_arith_expr([X|Xs], Max) :-
    max_arith_expr(Xs, X, Max).

max_arith_expr([], X, X).
max_arith_expr([X|Xs], X0, Max) :-
    max_arith_expr(Xs, X, Max0),
    Max is max(X0, Max0).

但为什么它真的是非尾递归?也许是必要的,或许不是?因为如果你已经有三个参数,你可以累积最大值

max_arith_expr([], Max, Max).
max_arith_expr([X|Xs], Max0, Max) :-
    Max1 is max(X, Max0),
    max_arith_expr(Xs, Max1, Max).

但我担心现在这看起来与你所做的完全一样here in the library所以我不知道这是好还是坏或两者兼而有之?