prolog从事实列表中查找max

prolog从事实列表中查找max,prolog,Prolog,嗨,对不起,我对Prolog真的很陌生。假设我有一个事实列表说6个事实第一列数字代表个人ID,第二列代表一个人赢得的次数。如果我想找到赢家最多的人,我该怎么做 wins(1, 22). wins(2, 24). wins(3, 23). wins(4, 20). wins(5, 21). wins(6, 19). 像这样的?哈哈,说实话,我真的不知道我在做什么 X = wins(_, Xs) Y = wins(_, Ys) most wins(X) :- Xs > Ys 获取这些

嗨,对不起,我对Prolog真的很陌生。假设我有一个事实列表说6个事实第一列数字代表个人ID,第二列代表一个人赢得的次数。如果我想找到赢家最多的人,我该怎么做

wins(1, 22).
wins(2, 24).
wins(3, 23).
wins(4, 20).
wins(5, 21).
wins(6, 19).
像这样的?哈哈,说实话,我真的不知道我在做什么

X = wins(_, Xs) 
Y = wins(_, Ys)
most wins(X) :- Xs > Ys  

获取这些信息的方法不止一种

most_wins(Id) :-
    wins(Id, W), \+ (wins(_, W1), W1 > W).
或者,如果Prolog具有库():-

或者你可以使用/3

速度与内存之间存在着明显的权衡:第一种方式是内存效率为O(1),但时间复杂度为O(N^2),因为它扫描候选集的2倍。第二个和第三个(我认为)实际上是等价的,在SWI prolog的当前实现中,它们都构建候选列表(然后在空间中是O(N)),然后在时间上选择元素-O(N logn)

如果候选人是事实,就用第一个


从效率的角度来看,编辑的另一种方式是使用不可回溯的分配。只需扫描候选人,保持最大值。普通Prolog将需要assert/retract来执行这样的任务,这使得它效率很低。但是许多序言都有更有效的方法来存储“全局”变量…

获取这些信息的方法不止一种

most_wins(Id) :-
    wins(Id, W), \+ (wins(_, W1), W1 > W).
或者,如果Prolog具有库():-

或者你可以使用/3

速度与内存之间存在着明显的权衡:第一种方式是内存效率为O(1),但时间复杂度为O(N^2),因为它扫描候选集的2倍。第二个和第三个(我认为)实际上是等价的,在SWI prolog的当前实现中,它们都构建候选列表(然后在空间中是O(N)),然后在时间上选择元素-O(N logn)

如果候选人是事实,就用第一个

从效率的角度来看,编辑的另一种方式是使用不可回溯的分配。只需扫描候选人,保持最大值。普通Prolog将需要assert/retract来执行这样的任务,这使得它效率很低。但许多序言都有更有效的方法来存储“全局”变量

most_wins(Id) :-
    setof(N-Id, W^(wins(Id, W), N is -W), [_-Id|_]).