我有以下规则:
compute_stats(A, B, C)
,如您所见,每次迭代返回三个值:
我想问你怎样才能找到最高A(整数)的结果。
示例:
如果我打电话
compute_stats(A, B, C).
我得到的结果就像
A = 1000,
B = 10,
C = ['example1', 'example2'];
A = 1200,
B = 3,
C = ['example3', 'example4'];
A = 800,
B = 7,
C = ['example5', 'example6'];
现在我需要另一个只给我
的规则A = 1200,
B = 3,
C = ['example3', 'example4'];
因为它有最大A。
我尝试了很多不同的东西,但它们似乎无法发挥作用:(
谢谢你的建议!
答案 0 :(得分:1)
有很多方法可以做到这一点。一种方法是利用setof/3
对其结果进行排序的事实。
max_stats(MaxA, MaxB, MaxC) :-
setof(A-B-C, get_stats(A,B,C), R), % All results ordered by A (ascending)
reverse(R, [MaxA-MaxB-MaxC|_]). % Maximum results
此处,setof/3
按升序收集"元组列表" A-B-C
的所有结果均为get_stats(A,B,C)
。由于您需要最大值,我们将反转该结果的顺序(使用reverse/2
),并将该列表的第一个元素作为最大值。表单A-B-C
的条款排序将根据A
的排序顺序排序,因此结果将提供最大A
的排序顺序。
max_stats
有一个list参数,表示最大结果列表:
max_stats(MaxResults) :-
setof(A-B-C, get_stats(A,B,C), R), % All results ordered by A (ascending)
reverse(R, DescendingList),
all_max(DescendingList, MaxResults). % Maximum results
% all_max/2 assumes the first argument is in descending order
% and the second argument is the list of just the maximum values
% of the first list
all_max([X], [X]).
all_max([X, Y|_], [X]) :- X @> Y.
all_maxx([X, Y|T], [X|S]) :-
equal_elements(X, Y),
all_max([X|T], S).
equal_elements(X-_-_, X-_-_).