列表中的最大值

时间:2013-12-12 19:39:11

标签: prolog

我有一个列表,列表中的每个元素都有五个组件,所以列表就像[[1,3,4,5,6],[2,4,5,15,16] ,. ..]。 我想找到列表中所有元素的第三个组成部分的最大值。我使用以下例程,但它不起作用:

maxList([_,_,_,_,_],Max).   
maxList([_,_,A,_,_|F],Max):- A>=Max, Max1=A, maxList(F,Max1).  
maxList([_,_,A,_,_|F],Max):- A<Max, Max1=Max, maxList(F,Max1).  

有人可以帮忙吗? 非常感谢你。

3 个答案:

答案 0 :(得分:3)

您的代码不会将第一个参数视为列表列表 - 而是将其视为五个元素的列表。

以下是解决此问题的方法:

maxList([[_,_,Max,_,_]], Max). /* List of one element */
maxList([[_,_,A,_,_]|F], Max):- maxList(F, B), Max is max(A, B).

此解决方案使用内置max/2

Demo on ideone

答案 1 :(得分:1)

你可以尝试

maxList(L,Max) :-
    select([_,_,Max,_,_], L, L1), \+ (member([_,_,M,_,_], L1), M > Max).

CapelliC在前一个帖子中提供了解决方案的模板。

答案 2 :(得分:1)

这是一个改进版本(不创建任何选择点,递归是终端)。为此,它使用带累加器的辅助谓词。注意:只有列表的3个第一个元素是“匹配的”。

maxList([[_,_,X|_]|L], Max) :-
    maxList(L, X, Max).

maxList([], Max, Max).
maxList([[_,_,X|_]|L], Max, Max2):-
    Max1 is max(X, Max),
    maxList(L, Max1, Max2).