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
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
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).
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. –
Conserver [tag: pureté logique] en utilisant 'dif/2' au lieu de' (\ ==)/2'! Plus d'infos sur 'dif' est ici: [tag: prolog-dif] – repeat
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).
Utilisez le meta-predicatetcount/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
encore mieux aswer
countWord([],0).
countWord([_|List], A):- countWord(List,B), A is B+1.
Cela sent des devoirs. – CAbbott
cela sent une question raisonnable que tout autre mérite une réponse. – Marcelo
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