title(0,'% ****************************************** '). title(1,'% Prolog によるオートマトンの実現'). title(2,'% 経営システム科学 ジュース販売機の例題'). title(3,'% 例題の参照文献:'). title(4,'% 猪平ら,『インターネット時代の情報管理概論』,共立出版.'). title(5,'% created: Apr 2002; modified: Feb 2003. '). '状態集合'(['100円表示','50円表示','0円表示']). '入力集合'(['100円','50円','0円']). '出力集合'(['ジュース']). '販売価格'(['150円']). '状態遷移関数'('状態'('0円表示'), '状態'('0円表示'), '入力'('0円')). '状態遷移関数'('状態'('50円表示'),'状態'('0円表示'), '入力'('50円')). '状態遷移関数'('状態'('100円表示'), '状態'('0円表示'), '入力'('100円')). '状態遷移関数'('状態'('50円表示'), '状態'('50円表示'), '入力'('0円')). '状態遷移関数'('状態'('100円表示'), '状態'('50円表示'), '入力'('50円')). '状態遷移関数'('状態'('0円表示'), '状態'('50円表示'), '入力'('100円')). '状態遷移関数'('状態'('100円表示'), '状態'('100円表示'), '入力'('0円')). '状態遷移関数'('状態'('0円表示'), '状態'('100円表示'), '入力'('50円')). '状態遷移関数'('状態'('0円表示'), '状態'('100円表示'), '入力'('100円')). '出力関数'('出力'('なし') , '状態'('0円表示'), '入力'('0円')). '出力関数'('出力'('なし') , '状態'('0円表示'), '入力'('50円')). '出力関数'('出力'('なし') , '状態'('0円表示'), '入力'('100円')). '出力関数'('出力'('なし') , '状態'('50円表示'), '入力'('0円')). '出力関数'('出力'('なし') , '状態'('50円表示'), '入力'('50円')). '出力関数'('出力'('ジュース') , '状態'('50円表示'), '入力'('100円')). '出力関数'('出力'('なし') , '状態'('100円表示'), '入力'('0円')). '出力関数'('出力'('ジュース') , '状態'('100円表示'), '入力'('50円')). '出力関数'('出力'('ジュースと50円') , '状態'('100円表示'), '入力'('100円')). go:- '初期化', '販売'(_X1,_Y,_W,_Z). '初期化':- title, abolish('状態',1), X = '0円表示', assert('状態'(X)). '販売'(X,Y,W,Z) :- '状態'(X), show(X), stop_or_continue(1), '入力'(Y), '状態遷移関数'('状態'(W),'状態'(X),'入力'(Y)), '更新'(X,W), % trace, '出力関数'('出力'(Z),'状態'(X),'入力'(Y)), '出力'(Z), '販売'(W,_Y1,_W1,_Z1). '入力'(Y):- '入力集合'(IN), subtract(IN,['0円'],A), nl,write('使えるお金は'),nl, wnl(A), write('です'), nl, write('お金を投入(数字とピリオドとEnter)'), nl, tab(5),write('>>>>'), read(Y1), concat(Y1,'円',Y2), anomal(Y,Y2,IN), nl. '出力'('なし'). '出力'(X):- member(X,['ジュース','ジュースと50円']), Y =['どうぞ ',X,' をお受け取りください。'], wnl(Y),nl, write('...ooo [DRINK]'), nl. '更新'(X,W):- retract('状態'(X)), assert('状態'(W)). wl([]). wl([X|Y]):- write(X),wl(Y). stop_or_continue(Y):- write(' (続けますか(y/n))'), read(Y1), (member(Y1,[n,'N',no,'No',end,quit])->Y=0;Y=1), nl. anomal(Y,Y2,IN):- ( member(Y2,IN) -> Y = Y2 ; ( Y = '0円', write('この金額は受け付けません'), write('...ooo'), nl ) ). show(Y):- '状態'(Y), title(0,V), write(V), concat(X,'表示',Y), nl,tab(3),write('現在の投入金額='),write(X), nl, title(0,V), write(V), nl. title :- title(0,V), title(1,X), title(2,Y), wnl([V,X,Y,V]), wnl(['ジュースの自動販売機のシミュレーション']), nl. wnl([]):- nl. wnl([X|Y]):- write(X),nl,wnl(Y). %:-go.