在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).
因为我比较那样,看起来很奇怪,我会弄错,因为我正在比较相同的数字,所以我认为这是我的比较或找到最大值的问题。
答案 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所以我不知道这是好还是坏或两者兼而有之?