2012-05-27 3 views
1

i m new in proog, поэтому вопрос может быть легко для вас, но я не смог найти ответ. Может кто-то, пожалуйста, помогите мне.Как подсчитать количество вхождений элементов в списке в Прологе

Я просто хочу

функция подсчета s.t

count([c,c,a,a,b,b,d,a,c,b,d,d,a], O). 

он будет возвращает число вхождений членов списка.

O = [[a, 4], [b, 3], [c, 3], [d, 3]] 
+0

Вы что-то пробовали, и это не сработало? – dasblinkenlight

ответ

2

На мой previous answer на "Remove duplicates in list (Prolog)" и на this previous answer на вопрос "Prolog union for A U B U C".

list_item_subtracted_count0_count/5 получен из list_item_subtracted/3. list_counts/2 получен из list_setB/2, которые были как defined here.

 
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). 

Вот запрос ОП дал:

?- 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 

Обратите внимание на порядок пар X-N в Counts соответствует первое вхождение X в 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]. 

последнее, давайте рассмотрим все возможные списки Es — перечислил справедливо с восходящей линией l engths:

 
?- 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) 
... 
0
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). 

я не использовал очень значимые имена на цели. Попытайтесь понять, что делает каждый из предикатов.