获取该信息的方法不止一种。
most_wins(Id) :-
wins(Id, W), \+ (wins(_, W1), W1 > W).
或者,如果您的 Prolog 有库(聚合):-
most_wins(Id) :-
aggregate(max(W, Id), wins(Id, W), max(_, Id)).
或者你可以使用setof /3
most_wins(Id) :-
setof(N-Id, W^(wins(Id, W), N is -W), [_-Id|_]).
存在明显的速度/内存权衡:第一种方式是内存效率 O(1),但时间复杂度为 O(N^2),因为它扫描了 2 次候选集。第二个和第三个(我认为)实际上是等效的,在 SWI-prolog 中的当前实现下,都建立候选者列表(然后在空间中是 O(N)),然后及时选择元素 - O(N log N)。
如果候选人是事实,就选择第一个。
编辑另一种方式,从效率的角度来看更好,利用不可回溯的分配。只需扫描候选人,随时随地保持最大值。Plain Prolog 将需要 assert/retract 来执行这样的任务,这使得它相当低效。但是许多 Prologs 有更有效的方法来存储“全局”变量......