我在Prolog练习中遇到了一些问题。
假设我有一个赢得奥斯卡奖的演员名单。像这样:
(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), !.
但现在我遇到了这个案子的问题。
答案 0 :(得分:0)
我假设您要编写一个谓词,该谓词接受一个数字和一个actor列表,并返回列表中至少指定数量的列表(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).