我需要获得列表中的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次并构成预期列表。
答案 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
请注意,这些谓词按递增顺序提供解决方案,而不一定按照它们在原始列表中出现的顺序。然而,这并未作为一项要求。