3

私の問題は、たとえば、プロローグにこのリストがあることです

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

結果として欲しい:[1,2]、[2,4]、[3,1]

つまり、リストの最初の要素が等しい場合、そのリストの2番目の要素を合計したい、

最初の位置に同じ要素を持ち、2 番目の要素の合計をリストの 2 番目の要素とするリストを返します。

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]] .

ペアの表現は最適ではないことに注意してください: 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 に答える