このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1322562648/28
#  [1] 授業単元: C言語  
#  [2] 問題文(含コード&リンク):http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=4900   
#  
#  後置記法で書かれた数式を計算するプログラムを作成せよ。
#  ●入力:後置記法による数式の書かれたファイル1つ。
#   後置記法の数式は、整数または四則演算子(+,-,*,/)が1個以上並んだ文字列とする。整数や四則演算子は、1個の空白または1個の改行で区切られているものとする。
#   式の長さや式中に現れる整数には制限を設けない。すなわち、どれだけ式の長さが長くても、またどのような整数が出現しても正しく動作するようにすること。
#  ●出力:入力の数式を計算した結果。標準出力に出力する。
#  ●動作に関する仕様:/の結果は小数点以下切り捨てとする。
#  
#  プログラムの実行例は次のようになる。以下の例では、作成したプログラム名は
#  a.outであり、カレントディレクトリに置かれているとしている。
#  
#  % cat testdata.txt
#  16 3 + 3 /
#  -2 -
#  % ./a.out testdata.txt
#  8
#  

後置記法電卓 :-
        行を入力する(Line),
        後置記法電卓(Line).

後置記法電卓('') :- !.
後置記法電卓(_入力文字列) :-
        入力文字列を計算要素に分解(_入力文字列,_計算要素ならび),
        後置記法で書かれた数式を計算する(L,X),
        writef('%t\n',[X]),
        行を入力する(Line2),
        後置記法電卓(Line2).

入力文字列を計算要素に分解(_入力文字列,_計算要素ならび) :-
        sPLIT(Line,['+','-','*','/'],L).

後置記法で書かれた数式を計算する(L,X) :-
        演算子までを切り取る(L,L1,_演算子,R1),
        数式を計算する(L,_演算子,R1,L2),
        後置記法で書かれた数式を計算する(L2,X),!.
後置記法で書かれた数式を計算する([X],X).

数式を計算する(L1,_演算子,R,L2) :-
        append(L0,[A,B],L1),
        _式 =.. [_演算子,A,B],
        Y is _式,
        append(L0,[Y|R],L2),!.
        
演算子までを切り取る(L,L1,_演算子,R) :-
        append(L1,[A|R],L),
        演算子(A,_演算子),!.

演算子((+),(+)).
演算子((-),(-)).
演算子((*),(*)).
演算子((/),(//)).