このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/845
#  台形近似法を用いてf(x)=cos(x)を任意の範囲で積分するプログラムを 
#  ユーザ関数を定義して作成しなさい. 
#  その際の区分間距離も任意に入力できるようにすること。 
#   
#  実行例 
#  積分範囲を入力せよ 
#  x0 = 0 
#  xl = 10 
#  区分間距離を入力せよ 
#  length = 1 
#  ans = 9.949055 
#  積分範囲を入力せよ 
#  x0 = 0 
#  xl = 100 
#  区分間距離を入力せよ 
#  length = 5 
#  ans = 49.588107 
#   
#  お願いします。 
# 
# 

f(X,Y) :- Y is cos(X).

'台形近似法を用いてf(x)=cos(x)を任意の範囲で積分する 区分間距離は任意に入力できるようにする' :-
        積分範囲を入力する(_積分範囲下限,_積分範囲上限),
        区分間距離を入力する(_区分間距離),
        f(_積分範囲下限,Y_1),
        '台形近似法を用いて積分する'(_積分範囲下限,Y_1,_積分範囲上限,_区分間距離,_積分値),
        writef('f(x)=cos(x) x範囲 %t-%t の積分値は %t です。\n',[_積分範囲下限,_積分範囲上限,_積分値]).

積分範囲を入力する(_積分範囲下限,_積分範囲上限) :-
        write('積分範囲を入力してください\n積分範囲下限(実数) : '),
        実数入力(_積分範囲下限),
        write('積分範囲上限(実数) : '),
        実数入力(_積分範囲上限),
        _積分範囲上限 > _積分範囲下限,!.
積分範囲を入力する(_積分範囲下限,_積分範囲上限) :-
        積分範囲を入力する(_積分範囲下限,_積分範囲上限).

実数入力(_実数) :-
        get_line(Line),
        実数入力診断(Line,_実数),!.

実数入力診断(Line,_実数) :-
        atom_to_term(Line,_実数,_),
        float(_実数),!.
実数入力診断(Line,_実数) :-
        writef('入力された %t は実数表現になっていません。再入力をお願いします。\n',[Line]),
        fail.

区分間距離を入力する(_区分間距離) :-
        write('区分間距離を入力してください : '),
        実数入力(_区分間距離),!.
区分間距離を入力する(_区分間距離) :-
        区分間距離を入力する(_区分間距離).

'台形近似法を用いて積分する'(K,_,_積分範囲上限,_区分間距離,0.0) :-
        K >= _積分範囲上限,!.
'台形近似法を用いて積分する'(X_1,Y_1,_積分範囲上限,_区分間距離,_積分値) :-
        X_2 is X_1 + _区分間距離,
        f(X_2,Y_2),
        _台形面積 is (_Y_1 + _Y_2) * _区分間距離 / 2,
        '台形近似法を用いて積分する'(X_2,Y_2,_積分範囲上限,_区分間距離,_積分値_2),
        _積分値 is _台形面積 + _積分値_2.