List 一个元素在列表中出现多少次的序言列表?

List 一个元素在列表中出现多少次的序言列表?,list,prolog,List,Prolog,我有一个列表,比如说[a,b,c,c,d],我想生成一个列表[[a,1],[b,1],[c,2],[d,1]。但是我在生成列表时遇到了麻烦。我可以计算元素出现的次数,但不能将其添加到列表中: % count how much the element occurs in the list. count([], _, 0). count([A|Tail], A, K) :- count(Tail, A, K1), K is K1 + 1. count([_|Tail], X, K)

我有一个列表,比如说
[a,b,c,c,d]
,我想生成一个列表
[[a,1],[b,1],[c,2],[d,1]
。但是我在生成列表时遇到了麻烦。我可以计算元素出现的次数,但不能将其添加到列表中:

% count how much the element occurs in the list.
count([], _, 0).
count([A|Tail], A, K) :-
    count(Tail, A, K1),
    K is K1 + 1.
count([_|Tail], X, K) :-
    count(Tail, X, K1),
    K is K1 + 0.

% Give back a list with each element and how many times is occur
count_list(L, [], _).
count_list(L, [A|Tail], Out) :-
    count(L, A, K),
    write(K),
    count_list(L, Tail, [K|Out]).

我正在努力学习序言,但有一些困难。。。我们将非常感谢您的帮助。。。提前谢谢

我不能理解你的逻辑。简单的方法是使用库(聚合),但这里有一个递归定义

count_list([], []).
count_list([H|T], R) :-
    count_list(T, C),
    update(H, C, R).

update(H, [], [[H,1]]).
update(H, [[H,N]|T], [[H,M]|T]) :- !, M is N+1.
update(H, [S|T], [S|U]) :- update(H, T, U).

怪癖:它以相反的顺序构建结果。您的代码,因为它使用累加器,将提供按直接顺序构建的机会……

让我首先参考一个相关问题“”,尤其是

在上述回答中,我给出了一个名为
list\u counts/2
的谓词的逻辑纯单调实现,它基本上满足了您的需求。考虑下面的查询:

?- list_counts([a,b,c,c,d], Xs). Xs = [a-1,b-1,c-2,d-1]. % succeeds deterministically ?- list_counts([a,b,a,d,a], Xs). % 'a' is spread over the list Xs = [a-3,b-1,d-1]. % succeeds deterministically
?- Xs = [_,_,_,_],list_counts(Xs,[a-N,b-M]).
Xs = [a,a,a,b], N = 3, M = 1 ;
Xs = [a,a,b,a], N = 3, M = 1 ;
Xs = [a,a,b,b], N = M, M = 2 ;
Xs = [a,b,a,a], N = 3, M = 1 ;
Xs = [a,b,a,b], N = M, M = 2 ;
Xs = [a,b,b,a], N = M, M = 2 ;
Xs = [a,b,b,b], N = 1, M = 3 ;
false.