Сравните, сколько раз элемент встречается в списке с данным номером - PullRequest
1 голос
/ 25 мая 2011

У меня небольшая проблема с упражнением Пролог.

Предположим, у меня есть список актеров, которые выиграли Оскара.Например:

(steven spielberg, steven spielberg, francis ford coppola, michael curtiz)

Когда имя появляется два раза, это означает, что человек выиграл 2 оскара и так далее.Что мне нужно сделать, так это пройти через этот список и найти каждого актера, который выиграл 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), !.

Но теперь у меня проблемы с этим делом.

1 Ответ

0 голосов
/ 26 мая 2011

Я предполагаю, что вы хотите написать предикат, который принимает число и список действующих лиц и возвращает список тех, которые находятся в списке по крайней мере указанное число раз (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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...