このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1322562648/562
#  [1] プログラミング実習応用  
#  [2] ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、 
#  x,yそれぞれの平均値(重心)を計算して、画面上に表示するプログラムを作成せよ 
#  □"tmp.csv"は「関数y=x^3-xのグラフを描くため、定義域[-2,2]に対するyの値を0.1刻みで計算し、 
#  結果をファイルに出力する」というプログラムで作ったファイルで、もう用意してあります。 
#  □コンパイラの標準外の仕様による異常終了を避けるため、変数の宣言部分にダミーの変数を追加する。例えば、"double dummy=0.0;"(変数名や値は変えてよい)  
#  

'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、x,yそれぞれの平均値(重心)を計算して、画面上に表示する' :-
        'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび),
        'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均),
        画面上に表示する(_xの平均,_yの平均).

'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび) :-
        get_chars('tmp.csv',Chars),
        座標の組(Chars,_x座標ならび,_y座標ならび).

座標の組(Chars,[V|_座標ならび_1],_座標ならび_2) :-
        座標の組(Chars,L,_座標ならび_2,_座標ならび_1),
        実数に変換(L,V).

座標の組([],[],[],[]) :- !.
座標の組([],L,[V],[]) :-
        実数に変換(L,V),!.
座標の組([_区切り記号|R1],[],[V|_座標ならび_1],_座標ならび_2) :-
        member(_区切り記号,[' ','\t',',','\n','(',')']),
        座標の組(R1,L,_座標ならび_2,_座標ならび_1),
        実数に変換(L,V),!.
座標の組([A|R1],[A|R2],_座標ならび_1,_座標ならび_2) :-
        \+(member(A,[' ','\t',',','\n','(',')'])),
        座標の組(R1,R2,_座標ならび_1,_座標ならび_2),!.
座標の組([_|R1],L,_座標ならび_1,_座標ならび_2) :-
        座標の組(R1,L,_座標ならび_1,_座標ならび_2).

実数に変換([],_) :- !,fail.
実数に変換(_実数数字ならび,_実数値) :-
        concat_atom(_実数数字ならび,_文字列),
        atom_to_term(_文字列,_実数値,_).

'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均) :-
        相加平均(_x座標ならび,_xの平均),
        相加平均(_y座標ならび,_yの平均).

相加平均(_値ならび,_相加平均) :-
        length(_値ならび,_標本数),
        相加平均(_値ならび,_標本数,0,_相加平均).

相加平均([],_標本数,_合計,_相加平均) :-
        _相加平均 is _合計 / _標本数,!.
相加平均([V|R],_標本数,_合計_1,_相加平均) :-
        _合計_2 is _合計_1 + V,
        相加平均(R,_標本数,_合計_2,_相加平均).

画面上に表示する(_xの平均,_yの平均) :-
        writef('座標の組の平均(重心)は (%t,%t) です。\n',[_xの平均,_yの平均]).