私の問題は、たとえば、プロローグにこのリストがあることです
[[1,1]、[1,1]、[2,1]、[2,2]、[2,1]、[3,1]]
結果として欲しい:[1,2]、[2,4]、[3,1]
つまり、リストの最初の要素が等しい場合、そのリストの2番目の要素を合計したい、
最初の位置に同じ要素を持ち、2 番目の要素の合計をリストの 2 番目の要素とするリストを返します。
Pythonのようなものでこれを行うのは簡単だと思いますが、プロローグではそれを行う方法がわかりません。
再帰的な訪問は、私にとって最も簡単な方法のようです。
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 では通常 を採用し、ライブラリ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 変換は表現の不一致によるものです。