簡體   English   中英

關於如何在prolog中對列表中的元素求和的一些麻煩

[英]some trouble on how to sum elements on a list in prolog

我的問題是,例如我在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中我們通常采用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轉換是由於表示不匹配造成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM