【问题标题】:some trouble on how to sum elements on a list in prolog关于如何在序言中对列表中的元素求和的一些麻烦
【发布时间】:2013-05-24 14:36:28
【问题描述】:

我的问题是,例如我在 prolog 上有这个列表

[[1,1],[1,1],[2,1],[2,2],[2,1],[3,1]]

我想要的结果是: [1,2],[2,4],[3,1]

简而言之,如果列表的第一个元素相等,我想对该列表的第二个元素求和,

并返回一个列表,该列表在第一个位置具有相同的元素,第二个元素的总和作为列表的第二个元素。

我觉得在 python 之类的东西上这样做很容易,但在 prolog 中我想不出办法。

【问题讨论】:

    标签: list prolog sum equals


    【解决方案1】:

    递归访问对我来说似乎是最简单的方法:

    sum_keys([], []).
    sum_keys([[K,V]|L], U) :-
        sum_keys(L, S),
        (   select([K,C], S, T),
            N is V+C,
            U = [[K,N]|T]
        ;   U = [[K,V]|S]
        ).
    

    这会产生

    ?- sum_keys([[1,1],[1,1],[2,1],[2,2],[2,1],[3,1]],R),sort(R,S).
    R = S, S = [[1, 2], [2, 4], [3, 1]] .
    

    注意pair表示不是最优的:在Prolog中我们通常采用Key-Value,那么我们可以访问一些library,然后写

    :- [library(pairs)].
    
    list2pair([K,V], K-V).
    sum_value_list(K-L, K-S) :- sumlist(L,S).
    
    sum_keys(L, S) :-
        maplist(list2pair, L, Ps),
        group_pairs_by_key(Ps, Grouped),
        maplist(sum_value_list, Grouped, Summed),
        maplist(list2pair, S, Summed).
    

    当然,list2pair 转换是由于表示不匹配造成的。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2022-09-23
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2013-06-26
      相关资源
      最近更新 更多