2009-12-11 98 views
1

如何統計列表中出現WORD的次數?如何統計列表中出現WORD的次數?

例如: counthowmany(hello,[hello,how,are,you,hello,hello],N)

N給出的單詞總數hello發生。

由於

+0

這氣味功課好。 – CAbbott 2009-12-11 19:16:26

+0

這是一個合理的問題,作爲任何其他值得一個答案的氣味。 – Marcelo 2009-12-11 19:18:55

+0

UGH *,prolog ...我記得在這裏做狼,山羊,白菜問題作爲一項任務......哦,痛苦的回憶! – Zoidberg 2009-12-11 19:22:26

回答

2

這裏是一個解決方案:

counthowmany(_, [], 0) :- !. 
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1. 
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N). 

第一行是終止測試:一個空的列表中,則計數爲零。另外兩行是遞歸調用,如果第一個元素匹配(第2行),則計數遞增。

這裏是一個類似的,但純邏輯的版本(沒有切割),如通過大流士建議:

counthowmany(_, [], 0). 
counthowmany(X, [X|Q], N) :- counthowmany(X, Q, N1), N is N1+1. 
counthowmany(X, [Y|Q], N) :- X \== Y, counthowmany(X, Q, N). 
+2

我會在沒有任何削減的情況下寫入它,而不是使用最後一個子句中的不等於測試,因爲純粹邏輯定義不太容易出錯。 – 2009-12-12 07:47:38

+0

使用'dif/2'而不是'(\ ==)/ 2'保留[tag:logical-purity]!更多關於'dif'的信息在這裏:[tag:prolog-dif] – repeat 2015-10-07 02:05:28

-1

這裏是一個替換的實施方式。這是使用累加器的尾遞歸。

countwords(X,L,N) :- countwords(X,L,0,N),!. 
countwords(X,[],N,N). 
countwords(X,[X|T],P,N) :- P1 is P+1 , countwords(X,T,P1,N). 
countwords(X,[H|T],P,N) :- X\==H , countwords(X,T,P,N). 
1

使用tcount/3亦隨像這樣具體化的長期平等(=)/3

?- tcount(=(hello),[hello,how,are,you,hello,hello],N). 
N = 3.       % succeeds deterministically 
-1

一個甚至aswer

countWord([],0). 
countWord([_|List], A):- countWord(List,B), A is B+1.