このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/571
#  【質問テンプレ】 
#  [1] 授業単元:プログラミング 
#  [2] 問題文: 
#        台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分するプログラムを作成。 
#        ただし、積分区間の分割数nはキーボードから入力する。 
#  

func(X,Y) :- Y is X * exp(X).

'台形則により関数 f(x)=xe^xをx=0からx=1まで数値積分する'(X) :-
        積分区間の分割数nはキーボードから入力する(_分割数),
        台形公式による積分(_分割数,0,1,X).

積分区間の分割数nはキーボードから入力する(_分割数) :-
        項目名・制約付き整数入力(分割数,(_分割数 > 1,0 is _分割数 mod 2),_分割数).

台形公式による積分(_分割数,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).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

項目名・制約付き整数入力(_項目名,_制約,_整数) :-
        writef('%tを入力してください : '),
        get_line(Line),
        項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数),!.
項目名・制約付き整数入力(_項目名,_制約,_整数) :-
        項目名・制約付き整数入力(_項目名,_制約,_整数).

項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),
        call(_制約),!.
項目名・制約付き整数入力診断(Line,_項目名,_制約,_整数) :-
        writef('入力された %t からは適切な%tが得られませんでした。再入力をお願いします。\n',[Line,_項目名]),
        fail.