List prolog中列表元素求和的几个问题

List prolog中列表元素求和的几个问题,list,prolog,sum,equals,List,Prolog,Sum,Equals,我的问题是,例如,我在prolog上有这个列表 [1,1]、[1,1]、[2,1]、[2,2]、[2,1]、[3,1]] 因此,我希望: [1,2],[2,4],[3,1] 简言之,如果列表中的第一个元素相等,我想对列表中的第二个元素求和 并返回一个列表,其中第一个位置上有相同的元素,第二个元素的和作为列表的第二个元素 我发现在python之类的东西上做这件事并不容易,但在prolog中我想不出一种方法来做 对我来说,递归访问似乎是最简单的方法: sum_keys([], []). sum_ke

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

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

因此,我希望: [1,2],[2,4],[3,1]

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

并返回一个列表,其中第一个位置上有相同的元素,第二个元素的和作为列表的第二个元素


我发现在python之类的东西上做这件事并不容易,但在prolog中我想不出一种方法来做

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

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]] .
注意,对表示不是最优的:在Prolog中,我们通常采用
键值
,然后我们可以访问一些,并编写

:- [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转换是由于表示不匹配造成的