このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/290
#  [1] 授業単元:C 
#  [2] 問題文(含コード&リンク): 
#    逆ポーランド記法の電卓を実装をする 
#    なお、電卓の条件は以下です 
#  条件及び動作例:http://www.dotup.org/uploda/www.dotup.org1758622.txt.html 
#  
#  条件
#  ・入力はコンソールでする
#  ・数式の終わりは;を入力
#  ・数式は後置記法で入力
#  ・数値計算はdouble型可能な範囲
#  ・演算は、四則演算及びsqr (2乗を求める関数)とする。
#  ・スタック、キュー、木構造のいずれか(または複数)を利用すること。
#   なお、これらのデータ構造の実装にはポインタを使うこと。
#  ・自由拡張
#   ・前置記法で書かれた数式(文字列)を後置記法に変換する関数を作成せよ。
#    また、この関数を用いて、前置記法で書かれた数式に対する電卓を実現
#   ・ユーザ入力ミスの対応と説明文の表示
#  
#  動作例
#  % ./a.out
#  5.1 3 + ;
#  8.10000
#  2 4 * ;
#  8.00000
#  8 sqr ;
#  64.00000
#  quit
#  % □


逆ポーランド記法の電卓を実装をする :-
        逆ポーランド記法の電卓を実装をする([]).

逆ポーランド記法の電卓を実装をする(_スタック_1) :-
        入力(_逆ポーランド式),
        \+(_逆ポーランド式=quit),
        sPLIT(_逆ポーランド式,[+,-,*,/,sqr],L),
        式をスタックにプッシュする(L,_スタック_1,_スタック_2),
        演算評価(_スタック2,_スタック3),
        _スタック_3 = [_答え|_],
        writef('%t\n',[_答え]),
        逆ポーランド記法の電卓を実装をする(_スタック_3).
逆ポーランド記法の電卓を実装をする(_スタック_1).

演算評価([],[]) :- !.
演算評価([-|R1],[C|R2]) :-
        演算評価(R1,[A,B|R2]),
        C is A - B,!.
演算評価([+|R1],[C|R2]) :-
        演算評価(R1,[A,B|R2]),
        C is A + B,!.
演算評価([*|R1],[C|R2]) :-
        演算評価(R1,[A,B|R2]),
        C is A * B,!.
演算評価([/|R1],[C|R2]) :-
        演算評価(R1,[A,B|R2]),
        C is A / B,!.
演算評価([sqr|R1],[C|R2]) :-
        演算評価(R1,[A|R2]),
        C is A * A,!.
演算評価([V|R1],[V|R2]) :-
        number(V),
        演算評価(R1,R2).

式をスタックにプッシュする([],_スタック,_スタック) :- !.
式をスタックにプッシュする([' '|R],_スタック_1,_スタック_2) :-
        式をスタックにプッシュする(R,_スタック_1,_スタック_2).
式をスタックにプッシュする([A|R],_スタック_1,_スタック_2) :-
        式をスタックにプッシュする(R,[A|_スタック_1],_スタック_2).