Prolog:查找查询的某些结果之间的最大值

时间:2016-04-16 12:14:15

标签: prolog

我有以下规则:

compute_stats(A, B, C)

,如您所见,每次迭代返回三个值:

  • 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。

我尝试了很多不同的东西,但它们似乎无法发挥作用:(

谢谢你的建议!

1 个答案:

答案 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的排序顺序。

<小时/> 根据@false的注释,您可能会有多个最大结果(与最大值具有相同的值)。处理此问题的一种方法是让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-_-_).