2 votes

Trouver le nombre d'éléments uniques dans la liste

Je veux écrire un code qui renvoie le nombre d'éléments uniques dans la liste. Mon idée est de vérifier si la tête de la liste est présente dans la liste des éléments uniques. Si ce n'est pas le cas, on l'ajoute à la liste, on incrémente le compteur et on continue avec la liste restante. J'ai donc essayé ce qui suit :

count([],0).
count([X,T], N) :- 
    count([X,T], [], N). %initially list of unique elements is empty

count([X,T], U, N) :- % U is a list of unique elements
    (not(member(X, U)), append(U, X, U2));
    count(T, U2, N1),
    N is N1 + 1.

%------ helpers ------
member_(X,[Y|T]):-
    member_(X, T).
member_(X,[X|_]).

append([], Y, [Y]).  % append[] and Y to get Y.
append([H|X], Y, [H|Z]) :- append(X, Y, Z). % append [H|X] and Y to get [H|Z] if appending X and Y gives Z

Mais en courant au-dessus, il suffit de retourner false :

3 ?- count([1,2,3],N).
   Call: (10) count([1, 2, 3], _7714) ? creep
   Fail: (10) count([1, 2, 3], _7714) ? creep
false.

Pourquoi en est-il ainsi ?

1voto

tiffi Points 683

Mais l'exécution ci-dessus renvoie simplement false :

3 ?- count([1,2,3],N).
   Call: (10) count([1, 2, 3], _7714) ? creep
   Fail: (10) count([1, 2, 3], _7714) ? creep
false.

Pourquoi en est-il ainsi ?

Parce qu'il n'y a pas de tête de clause qui count([1,2,3],N) peut correspondre.

Vous avez deux clauses pour count/2 :

count([],0).             %%% clause 1
count([X,T], N) :- ...   %%% clause 2

Desde [1,2,3] ne peut pas être unifié avec [] la clause 1 ne correspond pas. Mais [1,2,3] ne peut pas non plus être unifié avec [X,T] donc la clause 2 ne correspond pas non plus. Par conséquent, count([1,2,3],N) ne peut être prouvée.

Vous pouvez tester cela en demandant

?- [X,T]=[1,2,3].
false.

Ce dont vous avez besoin pour décomposer récursivement des listes de longueur arbitraire est [X|T] à la place. (Veuillez tester ?- [X|T]=[1,2,3]. pour voir comment vous pourriez corriger votre code).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X