如何计算在序言列表元素出现的次数如何计算在序言列表元素出现的次数(How to count numb

2019-05-16 13:31发布

IM在序言中新这就是为什么可能是这个问题很容易让你,但我不能找到答案。 有人可以帮帮我吗。

我只是想

计数功能ST

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

它会返回列表成员的出现次数的数量。

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

Answer 1:

以下是根据我以前的答案为“ 列表中(序言),删除重复和” 这前面的回答这个问题:“ 序言联盟AUBUC ”。

list_item_subtracted_count0_count/5源自list_item_subtracted/3list_counts/2源自list_setB/2 ,将其二者在此定义 。

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

这里的OP给查询:

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

注意对顺序XNCounts对应于第一次出现的XXs

?- 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有上升的长度相当枚举的:

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


Answer 2:

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

我不是故意使用非常有意义的名称。 试着去了解一下谓词的每一人做。



文章来源: How to count number of element occurrences in a list in Prolog