1

我是序言中的新手,这就是为什么这个问题对你来说很容易,但我找不到答案。有人可以帮帮我吗。

我只是想

计数函数 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]]
4

2 回答 2

2

以下内容基于我之前对“删除列表中的重复项(Prolog) ”的回答以及之前对问题“ Prolog union for 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 是 N0+1 ),
       (Bs1 = [A|Bs], N1 = N0)),
   list_item_subtracted_count0_count(As,E,Bs,N1,N)。

列表计数([],[])。
list_counts([X|Xs], [XN|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

请注意,对X-Nin的顺序对应于inCounts的第一次出现: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——以递增的长度公平地列举:

?-长度(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)
...
于 2015-05-04T09:48:28.677 回答
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).

我没有故意使用非常有意义的名字。尝试了解每个谓词的作用。

于 2012-05-27T20:26:37.907 回答