このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/296
#  [1] 授業単元:  
#  [2] 問題文(含コード&リンク):  
#  下のプログラム(簡単なスタックマシン)を次のように改造せよ  
#  1,Enterが入力されても何もしない  
#  2,演算子 +.-,*,/.%,^のいずれかが入力されたら  
#  スタックに2つ以上数値が積まれているか確認する  
#  2-1,積まれていなかった場合は"EROOR"を表示  
#  2-2,積まれていた場合は、スタックから2つのデータをポップして  
#  指定の演算を行い、その結果をプッシュする  
#  3,プロンプトを表示して次の入力まで待機  
#  問題のプログラムは↓の 10949.cです  
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm  
#  

簡単なスタックマシン(Stack1,Stack2) :-
        rawmode,
        write('?- '),
        get_char(_文字),
        評価(_文字,Stack1,Stack3),
        簡単なスタックマシン(Stack3,Stack2).

評価('\n',Stack1,Stack2) :-
        get_char(_文字),
        評価(_文字,Stack1,Stack2),!.
評価(_文字,Stack1,Stack2) :-
        append(_,[_文字|_],['+','-','*','/','%','^']),
        式評価(_文字,Stack1,Stack2,U),

評価(_文字,Stack1,Stack2) :-
        \+(append(_,[_文字|_],['+','-','*','/','%','^'])),
        数値の切り取り(_文字,L,_次の文字),
        number_chars(_数値,L),
        push(_数値,Stack1,Stack3),
        評価(_次の文字,Stack3,Stack2).

式評価('%',Stack1,Stack4,U) :- 式評価(mod,Stack1,Stack4,U),!.
式評価(_文字,Stack1,Stack2,U) :-
        pop(_値2,Stack1,Stack3),
        pop(_値1,Stack3,Stack4),
        _式 =.. [_文字,_値1,_値2],
        U is _式,
        write_formatted('%t\n',[U]),
        push(U,Stack4,Stack2),!.
式評価(_文字,Stack1,Stack2,_) :-
        write('ERROR\n'),
        get_char(_文字),
        評価(_文字,Stack1,Stack2).

数値の切り取り('\n',[],'\n') :- !.
数値の切り取り(_次の文字,[],_次の文字) :-
        \+(member(_次の文字,['0','1','2','3','4','5','6','7','8','9','.'])),!.
数値の切り取り(_文字,[_文字|R],_次の文字) :-
        get_char(_文字2),
        数値の切り取り(_文字2,R,_次の文字).

push(A,Stack,[A|Stack]).

pop(A,[A|Stack],Stack).