このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/341
#  [1] 授業単元: 計算機プログラミング 
#  [2] 問題文(含コード&リンク): http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec4kadai.html 
#  6x(1-x)を0から1まで台形則を用いて数値積分するプログラムを作成せよ。
#  
#  なお、台形則の分割数はnとし、nは入力できるようにすること。
#  

func(_x,_y) :-
        _y is 6 * _x * (1 - _x).

'6x(1-x)を0から1まで台形則を用いて数値積分する。なお、台形則の分割数はnとし、nは入力できるようにすること。'(S) :-
        '台形則の分割数はnとし、nは入力できるようにする'(_n),
        台形公式による積分(_n,0,1,S).

'台形則の分割数はnとし、nは入力できるようにする'(_n) :-
        write('分割数(整数)を入力してください : '),
        get_line(Line),
        '台形則の分割数はnの入力診断'(Line,_n),!.
'台形則の分割数はnとし、nは入力できるようにする'(_n) :-
        '台形則の分割数はnとし、nは入力できるようにする'(_n).

'台形則の分割数はnの入力診断'(Line,_n) :-
        atom_to_term(Line,_n,_),
        integer(_n),
        _n > 0,!.
'台形則の分割数はnの入力診断'(Line,_n) :-
        writef('入力された %t からは分割数を得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

台形公式による積分(_分割数,X0,Xn,S) :-
        _分割数 > 1,
        0 is _分割数 mod 2,
        Xn > X0,
        台形則(_分割数,X0,Xn,S).

台形則(N,X0,Xn,X) :-
        _間隔 is (Xn-X0) / N,
        台形則(1,_分割数,_間隔,X0,Xn,0.0,S),
        func(X0,F0),
        func(Xn,Fn),
        X is (F0 + Fn + S + S ) * _間隔 * 0.5.

台形則(N,_分割数,_,_,_,X,X) :-
        N > _分割数,!.
台形則(N,_分割数,_間隔,X0,Xn,Y,X) :-
        U is _間隔 * N + X0,
        func(U,F),
        Y2 is Y + F,
        N2 is N + 1,
        台形則(N2,_分割数,_間隔,X0,Xn,Y2,X).