repetidos - Cómo contar el número de ocurrencias de elementos en una lista en Prolog
contar elementos repetidos lista prolog (2)
soy nuevo en prólogo por eso es posible que la pregunta sea fácil para ti pero no pude encontrar la respuesta. ¿Puede alguien por favor ayudarme?
sólo quiero
una función de conteo st
count([c,c,a,a,b,b,d,a,c,b,d,d,a], O).
Devolverá el número de ocurrencias de los miembros de la lista.
O = [[a, 4], [b, 3], [c, 3], [d, 3]]
Lo siguiente se basa en mi respuesta anterior a " Eliminar duplicados en la lista (Prólogo) " y en esta respuesta previa a la pregunta " Unión Prolog para AUBUC ".
list_item_subtracted_count0_count/5
se deriva de list_item_subtracted/3
. list_counts/2
se deriva de list_setB/2
, que se definieron aquí .
list_item_subtracted_count0_count([], _, [], N,N). list_item_subtracted_count0_count([A|As], E, Bs1, N0,N) :- if_(A = E, ( Bs1 = Bs , N1 is N0+1 ), ( Bs1 = [A|Bs], N1 = N0 )), list_item_subtracted_count0_count(As, E, Bs, N1,N). list_counts([], []). list_counts([X|Xs], [X-N|Ys]) :- list_item_subtracted_count0_count(Xs, X, Xs0, 1,N), list_counts(Xs0, Ys).
Aquí está la consulta que el OP dio:
?- list_counts([c,c,a,a,b,b,d,a,c,b,d,d,a], Xss).
Xss = [c-3,a-4,b-3,d-3]. % succeeds deterministically
Tenga en cuenta que el orden de los pares XN
en Counts
corresponde a la primera aparición de X
en Xs
:
?- list_counts([a,b,c,d], Xss). Xss = [a-1,b-1,c-1,d-1]. ?- list_counts([d,c,b,a], Xss). Xss = [d-1,c-1,b-1,a-1].
Por último, consideremos todas las listas posibles Es
-enumerado justamente con longitudes ascendentes:
?- length(Es, N), list_counts(Es, Xss). N = 0, Es = [], Xss = [] ; N = 1, Es = [A], Xss = [A-1] ; N = 2, Es = [A,A], Xss = [A-2] ; N = 2, Es = [A,B], Xss = [A-1,B-1], dif(B,A) ; N = 3, Es = [A,A,A], Xss = [A-3] ; N = 3, Es = [A,A,B], Xss = [A-2,B-1], dif(B,A) ; N = 3, Es = [A,B,A], Xss = [A-2,B-1], dif(B,A) ; N = 3, Es = [B,A,A], Xss = [B-1,A-2], dif(A,B), dif(A,B) ; N = 3, Es = [A,B,C], Xss = [A-1,B-1,C-1], dif(C,A), dif(C,B), dif(B,A) ...
co(X,L) :- co(X,[],L).
co([],A,A).
co([X|Xs], A, L) :- p(X-Z,A,R), !, Z1 is Z+1, co(Xs, [X-Z1|R], L).
co([X|Xs], A, L) :- co(Xs, [X-1|A], L).
p(X-Y,[X-Y|R],R):- !.
p(X,[H|Y], [H|Z]) :- p(X,Y,Z).
No usé nombres muy significativos a propósito. Intenta comprender lo que hace cada uno de los predicados.