Cómo contar el número de ocurrencias de elementos en una lista en Prolog

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 es N0 + 1), 
        (Bs1 = [A | Bs], N1 = N0)),
    list_item_subtracted_count0_count (As, E, Bs, N1, N).

 list_counts ([], []).
 list_counts ([X | Xs], [XN | 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:

 ? - longitud (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(XZ,A,R), !, Z1 is Z+1, co(Xs, [X-Z1|R], L). co([X|Xs], A, L) :- co(Xs, [X-1|A], L). p(XY,[XY|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.