有多种方法。 以下程序是其中之一。
/* agreggate_sum. */
agreggate_sum :-
sum_calc(Data_list),
write('locality, total'), nl,
write_data(Data_list).
sum_calc(Data_list) :-
findall((Locality, Value), invoice(_, Locality, Value), Invoice_list),
data_reduction(Invoice_list, [], Data_list).
data_reduction([], Data_list, Data_list) :- !.
data_reduction([(Locality, Value) | Result], Tmp_list, Data_list) :-
data_reduction2(Tmp_list, Locality, Value, Tmp_list2 ),
data_reduction(Result, Tmp_list2, Data_list).
data_reduction2([], Locality, Value, [(Locality, Value)]) :- !.
data_reduction2([(Locality, Total_Value) | Result], Locality, Value, [(Locality, Total_Value2) | Result]) :-
!,
Total_Value2 is Total_Value + Value.
data_reduction2([(Locality2, Total_Value) | Result], Locality, Value, [(Locality2, Total_Value) | Result2]) :-
data_reduction2(Result, Locality, Value, Result2).
write_data([]) :- !.
write_data([(Locality, Total_Value) | Result]) :-
write(Locality), write(', '), write(Total_Value), nl,
write_data(Result).
invoice(1, madrid, 100).
invoice(2, lisbon, 200).
invoice(3, london, 300).
invoice(4, madrid, 300).
invoice(5, lisbon, 200).
invoice(6, paris, 100).
结果
9 ?- agreggate_sum.
locality, total
madrid, 400
lisbon, 400
london, 300
paris, 100
过多削减!实际上,OP可以得到他们需要的印象,而不是...... – CapelliC