このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/186
#  [1] 授業単元:数値解析 
#  [2] 問題文(含コード&リンク): 
#  ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする 
#  この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める 
#  プログラムを完成させよ 
#  

'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする。この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_傾き,_切片) :-
        'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られた'(_データ組ならび),
        'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_傾き,_切片).

'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_a,_b) :-
        整列(_データ組ならび,_整列したデータ組ならび),
        length(_整列したデータ組ならび,_n),
        xy系列に分割(_整列したデータ組ならび,Lx,Ly),
        一次方程式への近似(_n,Lx,Ly,_a,_b).

一次方程式への近似(_n,Lx,Ly,_a,_b) :-
        sigma_xy(Lx,Ly,Sxy),
        sigma_x(Lx,Sx),
        sigma_y(Ly,Sy),
        sigma_x2(Lx,Sx2),
        _a is (_n * Sxy - Sx * Sy) / (_n * Sx2 - Sx * Sx),
        _b is (_n * Sx2 * Sy - Sxy * Sx) / (_n * Sx2 - Sx * Sx).

sigma_x2(Lx,S) :-
        findsum(_x,(
                    member(_x,Lx),
                    _x_2 is _x * _x),
               S).

sigma_x1(Lx,S) :-
        findsum(_x,(
                    member(_x,Lx)),
                S).

sigma_y1(Ly,S) :-
        findsum(_x,(
                    member(_y,Ly)),
                S).

sigma_xy([],[],0).
sigma_xy([_x|R1],[_y|R2],S) :-
        sigma_xy(R1,R2,S1),
        S is _x * _y + S1.