【问题标题】:prolog list of how many times an element occurs in a list?一个元素在列表中出现多少次的序言列表?
【发布时间】:2014-10-25 18:40:57
【问题描述】:

好吧,我有一个列表,比如说[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]).

我正在尝试学习 Prolog,但遇到了一些困难...非常感谢您的帮助...提前致谢!

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    让我先参考一个相关问题“How to count number of element occurrences in a list in Prolog”,尤其是my answer

    在上述答案中,我提出了一个名为list_counts/2 的谓词的逻辑纯单调实现,它基本上可以满足您的需求。考虑以下查询:

    ?- list_counts([a,b,c,c,d], Xs)。 Xs = [a-1,b-1,c-2,d-1]。 % 确定性地成功 ?- list_counts([a,b,a,d,a], Xs)。 % 'a' 分布在列表中 Xs = [a-3,b-1,d-1]。 % 确定性地成功

    请注意,该实现是单调,即使对于像以下这样的非常一般的查询,也能提供逻辑上合理的答案

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

    【讨论】:

      【解决方案2】:

      我无法遵循你的逻辑。最简单的方法是使用库(聚合),但这里是一个递归定义

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

      怪癖:它以相反的顺序构建结果。你的代码,因为它使用了一个累加器,所以有机会直接构建......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        相关资源
        最近更新 更多