N列表中最大的元素

时间:2014-05-25 14:23:54

标签: list prolog repeat

我需要获得列表中的N个最大元素。

我有谓词最大

largest([X], X).
largest([X|T], K) :-
   largest(T, Y),
   K is max(X,Y).

现在我需要新的谓词 n_largest ,其效果如下:

?- n_largest([1, 2, 12, 33, 4, 15, 6], 2, List).

预期结果:列表:[33,15]。

我做了这个谓词的简单案例:

n_largest(List, 1, [X]) :- largest(List, X).

但是我无法找到如何重复最大 N次并构成预期列表。

2 个答案:

答案 0 :(得分:2)

这是基于从输入列表中选择更高值的答案:

n_largest(_, 0, []).
n_largest(L, N, [M|Ms]) :-
    N > 0,
    select(M, L, L1), \+ (member(X, L1), X > M),
    N1 is N - 1,
    n_largest(L1, N1, Ms).

当然关键是产生双重结果的联接select(M, L, L1), \+ (member(X, L1), X > M):当前列表L的最大M,以及已删除M的列表。

答案 1 :(得分:2)

这是另一种方法:

n_largest(L, N, R) :-
    msort(L, LS),
    length(R, N),
    append(_, R, LS).

这将重复计算。所以:

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [4,6,6]

yes

如果您想选择唯一元素,则可以使用sort

n_largest(L, N, R) :-
    sort(L, LS),
    length(R, N),
    append(_, R, LS).

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [3,4,6]

yes

请注意,这些谓词按递增顺序提供解决方案,而不一定按照它们在原始列表中出现的顺序。然而,这并未作为一项要求。