1

我是 prolog 的新手,正在考虑将其用于小型数据分析应用程序。这是我想要完成的事情:

我有一个 CSV 文件,其中包含以下一些数据:

a,b,c
d,e,f
g,h,i
...

数据是纯数字的,我需要做以下事情:1,我需要根据以下方案对行进行分组:

在此处输入图像描述

那么上面发生了什么?

我从第一行开始,第一行的值为“a”。然后,我继续往下走,直到遇到第一列中的值与“a”相差一定量的行,“z”。然后重复该过程,并且在该过程完成后形成许多“组”。

对于这些组中的每一个,我想找到第二列和第三列的平均值(例如,对于上图中的第一组,第二列的平均值为:(b+e+h)/3)。

我很确定这可以在序言中完成。但是,我有 50,000 多行数据,并且由于 prolog 是声明性的,我不确定 prolog 在完成上述任务方面的效率如何?

制定一个prolog程序来完成上述任务是否可行,这样程序的效率不会明显低于程序模拟?

4

1 回答 1

1

此代码段可能是您任务的起点

:- [library(dcg/basics)].

rownum(Z, AveList) :- phrase_from_file(row_scan(Z, [], [], AveList), 'numbers.txt').

row_scan(Z, Group, AveSoFar, AveList) -->
    number(A),",",number(B),",",number(C),"\n",
    { row_match(Z, A,B,C, Group,AveSoFar, Group1,AveUpdated) },
    row_scan(Z, Group1, AveUpdated, AveList).
row_scan(_Z, _Group, AveList, AveList) --> "\n";[].

% row_match(Z, A,B,C, Group,Ave, Group1,Ave1) 
row_match(_, A,B,C, [],Ave, [(A,B,C)],Ave).
row_match(Z, A,B,C, [H|T],Ave, Group1,Ave1) :-
    H = (F,_,_),
    (  A - F =:= Z
    -> aggregate_all(agg(count,sum(C2),sum(C3)),
        member((_,C2,C3), [(A,B,C), H|T]), agg(Count,T2,T3)),
       A2 is T2/Count, A3 is T3/Count,
       Group1 = [], Ave1 = [(A2,A3)|Ave]
    ;  Group1 = [H,(A,B,C)|T], Ave1 = Ave
    ).

有了这个输入

1,2,3
4,5,6
7,8,9
10,2,3
40,5,6
70,8,9
16,0,0

产量

?- rownum(6,L).
L = [ (3.75, 4.5), (5, 6)] 
于 2013-11-01T09:03:17.667 回答