Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/prolog/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的聚合和_Prolog_Relational Database - Fatal编程技术网

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

我在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 巴黎总数: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可能会觉得它们是必要的,而不是。。。