このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/134
#  [2] 問題文(含コード&リンク): 
#  1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す. 
#  実行例 
#  > ./ex06-3 
#  繰り返し回数を入力: 10 
#  乱数の個数を入力: 100 
#  回  平均 
#   1  0.509034 
#   2  0.488603 
#   3  0.485044 
#   4  0.473806 
#   5  0.503660 
#   6  0.519470 
#   7  0.477955 
#   8  0.536236 
#   9  0.516652 
#  10  0.467380 
#  > 
#  この動作をするプログラムを作成せよ。乱数は疑似乱数発生関数 drand48 を用いる.この関数は呼び出すたびにdrand48() を 3 回呼び出すと,drand48() の生成した三つの乱数がそれぞれ変数 x, y, z に格納される. 
#  double x, y, z; x = drand48(); y = drand48(); z = drand48(); 
#  この関数を用いるプログラムは,冒頭に #include <stdlib.h> と記述 
#  

'1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す.' :-
        '1:キーボードから自然数 m と n を読み込む'(_m,_n),
        '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(1,_実行回数,_m,_n),
        '3:この 2:の操作を m 回繰り返す.' (_実行回数,_m).

'1:キーボードから自然数 m と n を読み込む'(_m,_n) :-
        'キーボードから自然数 m を読み込む'(_m),
        'キーボードから自然数 n を読み込む'(_n).

'キーボードから自然数 m を読み込む'(_m) :-
        自然数を読み込む(_m).

'キーボードから自然数 n を読み込む'(_n) :-
        自然数を読み込む(_n).

自然数を読み込む(_自然数) :-
        get_line(Line),
        自然数を読み込む(Line,_自然数),!.
自然数を読み込む(_自然数) :-
        自然数を読み込む(_自然数).

自然数を読み込む(Line,_自然数) :-
        atom_to_term(Line,_自然数,_),
        integer(_自然数),
        _自然数 >= 0,!.
自然数を読み込む(Line,_自然数) :-
        writef('入力された %t からは自然数が得られません。再入力をお願いします。\n'),
        fail.

'2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数,_実行回数,_n) :-
        '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値),
        '実行例ように表示'(_実行回数,_平均値).
'2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_1,_実行回数,_n) :-
        _実行回数_2 is _実行回数_1 + 1,
        '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_2,_実行回数,_n).

'0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値) :-
        findavg(_一様乱数,(
                    for(1,_,_n),
                    '0 以上 1 未満の一様乱数'(_一様乱数)),
                _平均値).

'0 以上 1 未満の一様乱数'(_一様乱数) :-
        _一様乱数 is random(1000000) / 1000000.

'実行例ように表示'(_実行回数,_平均値) :-
        writef('%3l%8l\n',[_実行回数,_平均値]).

'3:この 2:の操作を m 回繰り返す.' (_m,_m).

%
%  目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ
%
/*
実行例 :-
#   1  0.509034 
#   2  0.488603 
#   3  0.485044 
#   4  0.473806 
#   5  0.503660 
#   6  0.519470 
#   7  0.477955 
#   8  0.536236 
#   9  0.516652 
#  10  0.467380 

*/