比较给定数量的元素在列表中出现的次数

问题描述

|| 我在Prolog练习中遇到一些问题。 假设我有赢得奥斯卡奖的演员名单。像这样:
(steven spielberg,steven spielberg,francis ford coppola,michael curtiz)
当名字出现两次时,表示该人赢得了2项奥斯卡奖,以此类推。我需要做的是浏览此列表,找到每位赢得N或更多奥斯卡奖的演员,
wonMoreOscars(Number,Activity):-
数字为N时,我们必须与列表进行比较。 我已经有了一个功能,该功能可以统计列表中出现次数更多的人以及该人在电影中具有的功能,但是已经被涵盖了。 有人可以帮我吗,我有代码找到赢得更多奥斯卡奖的人:
occS([],_,_):-write(0),nl,write(\'+\'),!.
occS([H|T],_):-occ([H|T],H,H).
occ([],Top,Nome):-write(Nome),write(Top),!.
occ([H|T],Count,El_corrente,_):- compare(=,El_corrente),C is Count +      1,C>=Top,occ(T,C,Nome):- not(compare(=,El_corrente)),1,Nome),Nome):- C is Count + 1,!.
但是现在我遇到了这种情况。     

解决方法

我假设您要编写一个谓词,该谓词接受一个数字和一个actor列表,并返回至少列表中指定次数的那些列表(
wonMoreOscars(Number,Activity)
没有足够的参数)。您可以这样做:
oscars(N,T,R) :- oscars(N,[],R).

oscars(N,A,R) :- countOscars(N,R).
oscars(N,[H|T],R) :- addOscar(H,A1),oscars(N,A1,R).

addOscar(H,[(H,1)]).
addOscar(H,N)|T],N1)|T]) :- N1 is N + 1,!.
addOscar(H,[HA|T],[HA|T1]) :- addOscar(H,T1).

countOscars(_,[]).
countOscars(N,HN)|T],[H|TR]) :- HN >= N,countOscars(N,TR),!.
countOscars(N,[_|T],TR) :- countOscars(N,TR).