このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/201
#  【質問テンプレ】  
#  [1] 授業単元: C 
#  [2] 問題文(含コード&リンク): 
#  次のアルファベットのキーワードを入力して計算する(例:sin45 sin0.78539)関数電卓プログラムを作成。 
#  なお、関数を容易に変更、修正、増加できるように。 
#  sin(正弦)、cos(余弦)、tan(正接)、arcsin(逆正弦)、arccos(逆余弦)、arctan(逆正接)、ln(自然対数)、log(常用対数)、exp(指数関数)、sqr(平方)、 
#  rad(入力データをラジアン単位にする)、deg(入力データを度を単位とする)、sinh(双曲線正弦)、cosh(双曲線余弦)、tanh(双曲線正接) 
#   
#  

関数電卓 :-
        findall([_関数名,関数記号],(
                    clause(関数(_関数名,_関数記号,_,_,_),_)),
                _関数名_関数記号ならび),
        関数メニュー表示(_関数名_関数記号ならび),
        関数の選択(_何番目),
        関数電卓(_何番目).

関数電卓(0) :- !.
関数電卓(_何番目) :-
        nth1(_何番目,_関数名_関数記号ならび,[_関数名,_関数記号]),
        式の入力(_式),
        関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値),
        関数メニュー表示(_関数名_関数記号ならび),
        関数の選択(_次の選択),
        関数電卓(_次の選択).

関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値) :-
        関数電卓の関数を評価する(_関数名,_関数,_式,_値),
        値を表示する(_関数,_値).

関数電卓の関数を評価する(_関数名,_関数,_式) :-
        関数(_関数名,_,_関数,_式,_値),!.
関数電卓の関数を評価する(_関数名,_関数,_式) :-
        writef('%tの関数評価に失敗しました\n',[_関数名]),
        fail.

値を表示する(_関数,_値) :-
        writef('%t <- %t \n',[_値,_関数]).

関数メニュー表示(_関数名_関数記号ならび) :-
        write('関数を番号で選択してください\n0..関数電卓の終了\n'),
        append(L0,[[_関数名,_関数記号]|R],_関数名_関数記号ならび),
        length([_|L0],Nth),
        writef('%t..%t,%t\n',[Nth,_関数名,_関数記号]),
        R = [],!.

関数の選択(_何番目) :-
        get_integer(_何番目).

式の入力(_式) :-
        write('式を入力してください : '),
        get_line(Line),
        式の診断(Line,_式),!.

式の診断(Line,_式) :-
        parse_atom(Line,_式,_),!.
式の診断(Line,_) :-
        writef('入力された %t からは適切な式が取り出せません。\n',[Line]),
        fail.

関数(正弦,sin,sin(_式),_式,_値) :- _値 is sin(_式).
関数(余弦,cos,cos(_式),_式,_値) :- _値 is cos(_式).
関数(正接,tan,tan(_式),_式,_値) :- _値 is tan(_式).
関数(逆正弦,arcsin,arcsin(_式),_式,_値) :- _値 is sin(_式) ^ (-1).
関数(逆余弦,arccos,arccos(_式),_式,_値) :- _値 is cos(_式) ^ (-1).
関数(逆正接,arctan,arctan(_式),_式,_値) :- _値 is tan(_式) ^ (-1).
関数(自然対数,ln,ln(_式),_式,_値) :- _値 is ln(_式).
関数(常用対数,log,log(_式),_式,_値) :- _値 is log(_式).
関数(指数関数,exp,exp(_式),_式,_値) :- _値 is exp(_式).
関数(平方,sqr,sqr(_式),_式,_値) :- _値 is sqr(_式).
関数(入力データをラジアン単位にする,rad,rad(_式,_値),_式,_値) :- rad(_式,_値).
関数(入力データを度を単位とする,deg,deg(_式,_値),_式,_値) :- deg(_式,_値).
関数(双曲線正弦,sinh,sinh(_式),_式,_値) :- _値 is sinh(_式),!.
関数(双曲線余弦,cosh,cosh(_式),_式,_値) :- _値 is cosh(_式),!.

rad(X,Y) :-
        Y is (X / 180) * pi.

deg(X,Y) :-
        Y is (X / pi) * 180.