このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1267796762/157
#  【 課題 】なるべく分岐(if,switchなど)を使わずに、使いやすい電卓を作りなさい。  
#  【 形態 】1. Javaアプリケーション  
#  【 期限 】6/22まで  
#  【 Ver  】java version "1.6.0_20"  
#  【 補足 】上で投稿したものです。上はやっていただかなくてけっこうですので、こちらをお願いします。難しいものは書いてくださらなくてけっこうですのでシンプルなものをお願いします。  
#   
#   
# 
# 

:- op(450,fx,(+)).
:- op(450,fx,(-)).
:- op(450,fx,(*)).
:- op(450,fx,(/)).
:- op(450,fx,(//)).
:- op(450,fx,(^)).
:- op(450,fx,mod).

関数(A,A) :- number(A),!.
関数(N,+ A,C) :- 関数(_,A,A1),C is N + A1,!.
関数(N,- A,C) :- 関数(_,A,A1),C is N - A1,!.
関数(N,* A,C) :- 関数(_,A,A1),C is N * A1,!.
関数(N,/ A,C) :- 関数(_,A,A1),C is N / A1,!.
関数(N,// A,C) :- 関数(_,A,A1),C is N // A1,!.
関数(N,^ A,C) :- 関数(_,A,A1),C is N ^ A1,!.
関数(N,mod A,C) :- 関数(_,A,A1),C is N mod A1,!.
関数(_,A + B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 + B1,!.
関数(_,A - B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 - B1,!.
関数(_,A * B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 * B1,!.
関数(_,A / B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 / B1,!.
関数(_,A // B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 // B1,!.
関数(_,A ^ B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 ^ B1,!.
関数(_,A mod B,C) :- 関数(_,A,A1),関数(_,B,B1),C is A1 mod B1,!.
関数(_,F,C) :- 関数(_,F,F1),C is F1.
関数(_,sin(A),C) :- 関数(_,A,A1),C is sin(A1).
関数(_,cos(A),C) :- 関数(_,A,A1),C is cos(A1).
関数(_,tan(A),C) :- 関数(_,A,A1),C is tan(A1).
関数(_,exp(A),C) :- 関数(_,A,A1),C is exp(A1).
関数(_,sqrt(A),C) :- 関数(_,A,A1),C is sqrt(A1).

電卓 :- clear_screen,write('0\n# '),get_line(Line),電卓(Line,0).

電卓(q,_) :- !.
電卓(c,_) :- !,電卓.
電卓(Line,N) :-
        atom_to_term(Line,Term,_),
        関数(N,Term,_値),
        write_formatted('%t\n# ',[_値]),
        get_line(Line2),
        電卓(_値,Line2).