Prolog中的聚合和
我在Prolog中有这样一个表:Prolog中的聚合和,prolog,relational-database,Prolog,Relational Database,我在Prolog中有这样一个表: invoice(number, locality, value) invoice(1, madrid, 100) invoice(2, lisbon, 200) invoice(3, london, 300) invoice(4, madrid, 300) invoice(5, lisbon, 200) invoice(6, paris, 100) 我怎样才能得到当地的总金额 答案应该类似于在Excel中执行数据透视表 里斯本总数:400 马德里总数:400
invoice(number, locality, value)
invoice(1, madrid, 100)
invoice(2, lisbon, 200)
invoice(3, london, 300)
invoice(4, madrid, 300)
invoice(5, lisbon, 200)
invoice(6, paris, 100)
我怎样才能得到当地的总金额
答案应该类似于在Excel中执行数据透视表
里斯本总数:400
马德里总数:400
巴黎总数:100
伦敦总数:300有各种方法。 以下程序就是其中之一
/* 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
有多种方法。 以下程序就是其中之一
/* 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
为了避免偶尔的访问者认为完成这些基本任务需要冗长的代码,以下是library()方法: 也就是说,我们可以选择“透视”列。要获得完整结果,请包装到另一个聚合中:
?- aggregate(set(Locality=Sum), aggregate(sum(Value), Number^invoice(Number,Locality,Value), Sum), All).
All = [lisbon=400, london=300, madrid=400, paris=100].
为了避免偶尔的访问者认为完成这些基本任务需要冗长的代码,以下是library()方法: 也就是说,我们可以选择“透视”列。要获得完整结果,请包装到另一个聚合中:
?- aggregate(set(Locality=Sum), aggregate(sum(Value), Number^invoice(Number,Locality,Value), Sum), All).
All = [lisbon=400, london=300, madrid=400, paris=100].
另一种解决方案是制作城镇价值对,按城镇分组,并计算城镇的总和:
aggregate_sum_by_town(Result) :-
findall(T-V, invoice(_, T, V), TVs),
keysort(TVs, Ps),
group_pairs_by_key(Ps, G),
pairs_keys_values(G, Ks, Vs),
maplist(sumlist, Vs, Ss),
pairs_keys_values(Result, Ks, Ss).
?- aggregate_sum_by_town(Result).
Result = [lisbon-400, london-300, madrid-400, paris-100].
另一种解决方案是制作城镇价值对,按城镇分组,并计算城镇的总和:
aggregate_sum_by_town(Result) :-
findall(T-V, invoice(_, T, V), TVs),
keysort(TVs, Ps),
group_pairs_by_key(Ps, G),
pairs_keys_values(G, Ks, Vs),
maplist(sumlist, Vs, Ss),
pairs_keys_values(Result, Ks, Ss).
?- aggregate_sum_by_town(Result).
Result = [lisbon-400, london-300, madrid-400, paris-100].
切得太多了!事实上,OP可能会给人留下这样的印象,他们是必要的,而不是…太多的削减!事实上,OP可能会觉得它们是必要的,而不是。。。