递归访问对我来说似乎是最简单的方法:
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 转换是由于表示不匹配造成的。