2011-05-25 70 views
1

我對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), !. 

但現在我有這個情況麻煩。

+1

只是一個側面說明:我認爲史蒂芬斯皮爾伯格從來沒有贏得過奧斯卡獎的演員:-) – svick 2011-05-25 20:30:27

回答

0

我假設你想編寫一個謂詞,該謂詞需要一個數字和一個actor列表,並返回列表中至少指定了number-times(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). 
+0

沒錯,那就是;)非常感謝! – 2011-05-25 22:36:59

+0

對不起,仍然是相當新的,答案接受 – 2011-05-26 16:23:06