2013-05-24 2 views
3
의리스트 요소들을 합산하는 방법에 문제가

내 문제, 예를 들면 난 도입부에이리스트를 가지고프롤로그

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

내가 원하는 결과 : [1,2], [2,4], [3,1]

에서 짧은 단어 목록의 첫 번째 요소가 같으면 그 목록의 두 번째 요소를 더하고 싶습니다.

같은 요소가있는 목록과 두 번째 요소의 합 s를 목록의 두 번째 요소로 사용합니다.

내가 파이썬과 같은 일을 쉽게 할 수는 없지만 프롤로그에서는 그렇게 할 방법을 찾지 못했습니다.

답변

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

주를 산출 : 프롤로그에서 우리가 일반적으로 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). 

urse, list2pair 변환은 표현 불일치로 인한 것입니다.