Prolog 将元素在列表中出现的次数与给定的次数进行比较

Prolog 将元素在列表中出现的次数与给定的次数进行比较,prolog,Prolog,我对序言练习有点问题 假设我有一份获得奥斯卡奖的演员名单。像这样: (steven spielberg, steven spielberg, francis ford coppola, michael curtiz) 当一个名字出现两次时,意味着这个人获得了两项奥斯卡奖,以此类推。我需要做的是浏览一下这个列表,找到每一个获得N个或更多奥斯卡奖的演员,用一个谓词 wonMoreOscars(Number, Activity):- 其中数字是N,我们必须与列表进行比较。 我已经有了一个功能,可以

我对序言练习有点问题

假设我有一份获得奥斯卡奖的演员名单。像这样:

(steven spielberg, steven spielberg, francis ford coppola, michael curtiz)
当一个名字出现两次时,意味着这个人获得了两项奥斯卡奖,以此类推。我需要做的是浏览一下这个列表,找到每一个获得N个或更多奥斯卡奖的演员,用一个谓词

wonMoreOscars(Number, Activity):-
其中数字是N,我们必须与列表进行比较。 我已经有了一个功能,可以计算列表中出现次数最多的人,以及该人在电影中的活动,但已经包括在内

谁能帮帮我,我有密码找到那个赢得更多奥斯卡奖的人:

occS([],_,_,_,_):-write(0),nl,write('+'),nl, !.
occS([H|T],_,_,_,_):-occ([H|T],0,0,H,H).
occ([],_,Top,_,Nome):-write(Nome),nl,write(Top),nl,write('+'),nl, !.
occ([H|T],Count,Top,El_corrente,_):- compare(=,H,El_corrente),C is Count +      1,C>=Top,occ(T,C,C,El_corrente,El_corrente), !.
occ([H|T],_,Top,El_corrente,Nome):- not(compare(=,H,El_corrente)),occ(T,1,Top,H,Nome),!.
occ([H|T],Count,Top,_,Nome):- C is Count + 1,occ(T,C,Top,H,Nome), !.

但是现在我遇到了这个问题。

我假设您要编写一个谓词,它接受一个数字和一个参与者列表,并返回列表中至少指定次数的参与者列表(
wonMoreOscars(number,Activity)
没有足够的参数)。您可以这样做:

oscars(N, T, R) :- oscars(N, T, [], R).

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

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

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

顺便说一句:我认为史蒂文·斯皮尔伯格从未获得过奥斯卡最佳男演员奖:——)