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 ?