2009-12-11 4 views
1

Comment compter combien de fois un mot se produit dans une liste?Comment compter combien de fois un mot se produit dans une liste?

Par exemple: counthowmany(hello,[hello,how,are,you,hello,hello],N).

N donne le nombre total de mots hello.

Merci

+0

Cela sent des devoirs. – CAbbott

+0

cela sent une question raisonnable que tout autre mérite une réponse. – Marcelo

+0

UGH *, prologue ... je me souviens de faire le loup, chèvre, problème de chou dans ce comme une tâche ... OH les souvenirs de la douleur! – Zoidberg

Répondre

2

Voici une solution:

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

La première ligne est le test de terminaison: sur une liste vide, le nombre est égal à zéro. Les deux autres lignes sont les appels récursifs, et si le premier élément correspond (ligne 2), le compte est incrémenté.

Voici une version similaire, mais purement logique (pas de coupure), comme suggéré par Darius:

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

Je l'aurais écrit sans aucune coupure, en utilisant plutôt un test non égal à la dernière clause, puisque les définitions purement logiques sont moins sujettes aux erreurs. –

+0

Conserver [tag: pureté logique] en utilisant 'dif/2' au lieu de' (\ ==)/2'! Plus d'infos sur 'dif' est ici: [tag: prolog-dif] – repeat

-1

Voici une autre implémentation. C'est la queue récursive en utilisant des accumulateurs.

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

Utilisez le tcount/3 en tandem avec l'égalité réifié terme (=)/3 comme ceci:

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

encore mieux aswer

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