このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/138
#  [1] 授業単元: ファイル読み取り コサイン類似度 
#  [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/pX1MdXpC 
#    問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt 
#    問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt #  
#  /*
#  二つのtxtファイルがある
#  sample.txtはファイル名と500個の数値の文字列が一行書かれている。
#  txtファイルを例として上げる
#  例:
#  
#  test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が
#  不特定多数並んでいる。txtファイルを例として上げる。
#  例:
#  
#  この2つのtxtファイルを使って次の動作をするプログラムを作れ
#  
#  ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。
#    nは数値の番号で0からはじめる。
#  
#  ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する
#   iには行数、jには数値の番号を入れる。番号は0からはじめる。
#   余裕があれば、ファイル名を別の配列に格納する
#  
#  ?それぞれ格納された配列の数値をつかって繰り返し文を使い
#  
#  c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数}
#  
#  の計算を行う。
#  考え方は下の用になる
#  
#  c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j])
#        / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j]));
#  
#  c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j])
#        / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j]));
#  
#  c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j])
#        / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j]));
#  
#  ・
#  ・
#  ・
#  
#  c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j])
#        / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j]));
#  
#  
#  ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する
#  
#  
#  /*
#  

'二つのtxtファイルがある
sample.txtはファイル名と500個の数値の文字列が一行書かれている。
txtファイルを例として上げる
例:

test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が
不特定多数並んでいる。txtファイルを例として上げる。
例:

この2つのtxtファイルを使って次の動作をするプログラムを作れ

1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。
  nは数値の番号で0からはじめる。

2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する
 iには行数、jには数値の番号を入れる。番号は0からはじめる。
 余裕があれば、ファイル名を別の配列に格納する

3)それぞれ格納された配列の数値をつかって繰り返し文を使い

c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数}

の計算を行う。'(_c) :-
        'sample.txtに書かれている数値を読み取って、_aに格納する'(_a),
        'test.txtを読み取って、配列bに格納する'(_b),
        'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c).

'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :-
        get_numbers('sample.txt',_a).

'test.txtを読み取って、配列bに格納する'(_b) :-
        'test.txtを読み取って'(Lines),
        配列bに格納する(Lines,_b).

'test.txtを読み取って'(Lines) :-
        get_lines('test.txt',Lines).

配列bに格納する(Lines,_b) :-
        findall(L,(
                    member(A,Lines),
                    atom_codes(A,L)),
                _b).

'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :-
        'sqrt(a[n]*a[n])をすべて足した数'(_a,V),
        findsum(X,(
                     'a[n]*b[i][j]をすべて足した数'(_a,_b,W),
                     X is W / (V * sqrt(S_1))),
                _c).

'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :-
        findsum(U,(
                    member(A,_a),
                    U is A * A),
                S_0),
        X is sqrt(S_1).

'a[n]*b[i][j]をすべて足した数'(_a,_bW) :-
        member(L,_b),
        findsum(Y,(
                    nth0(_nth0_1,L,N),
                    nth0(_nth0_1,_a,M),
                    Y is M * N),
                W).


get_numbers(File,Numbers) :-
        get_lines(File,Lines),
        findall(Number,(
                    member(Line,Lines),
                    atom_to_number(Line,Number)),
                Numbers).