このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/256
#  [1] 授業単元:関数Aから関数Bを呼び出す 
#  [2] 問題文(含コード&リンク): 
#  ../test/read.cgi/tech/1308749241/245に、mainプログラムも追記しなさい。 
#  

'分散を求める述語を追加し、動作確認する' :-
        分散を定義する,
        '20個の0から100の範囲のデータを読み込む'(_データならび),
        分散(_データならび,_分散),
        出力する(_データならび,_分散).

'20個の0から100の範囲のデータを読み込む'(_データならび) :-
        length(_データならび,20),
        findall(_0から100の範囲の]整数,(
                     append(_,[_|_],_データならび),
                     '0から100の範囲の整数を得る'(_0から100の範囲の整数)),
                _データならび).

'0から100の範囲の整数を得る'(_0から100の範囲の整数) :-
        get_integer(_0から100の範囲の整数),
        _0から100の範囲の整数 >= 0,
        _0から100の範囲の整数 =< 100,!.
'0から100の範囲の整数を得る'(_0から100の範囲の整数) :-
        write('0から100の範囲の整数を入力してください\n'),
        '0から100の範囲の整数を得る'(_0から100の範囲の整数).

データを書きだす(_データならび,_分散) :-
        concat_atom(_データならび,S),
        writef('%t\n分散 は %t',[S,_分散]).

分散を定義する :-
        assertz((分散(L,V) :-
                    length(L,N),
                    相加平均(L,M),
                    分散(L,N,M,0.0,V))),
        assertz((分散([],N,M,S,V) :-
                          V is S / N,!)),
        assertz((分散([A|R],N,M,S,V) :-
                          S1 is (A - M) ^ 2,
                          S2 is S + S1,
                          分散(R,N,M,S2,V))).

相加平均([],N,S,M) :-
        M is S / N,!.
相加平均([A|R],N,S,M) :-
        S1 is S + A,
        相加平均(R,N,S1,M).

相加平均(L,M) :-
         length(L,N),
         相加平均(L,N,0.0,M).

/*

分散([],N,M,S,V) :-
        V is S / N,!.
分散([A|R],N,M,S,V) :-
        S1 is (A - M) ^ 2,
        S2 is S + S1,
        分散(R,N,M,S2,V) .

分散(L,V) :-
        length(L,N),
        相加平均(L,M),
        分散(L,N,M,0.0,V) .
*/