3

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

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

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

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

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

我觉得在 python 之类的东西上很容易做到这一点,但在序言中我想不出办法来做到这一点。

4

1 回答 1

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(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 转换是由于表示不匹配。

于 2013-05-24T15:01:54.803 回答