このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/868
#  [1] 授業単元:プログラミング基礎I 
#  [2] 問題文(含コード&リンク): 
#  発展課題 13..1 
#  ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 
#  氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. 
#  立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. 
#  野路花子の口座番号は5678で,預金残高を987,600円に設定する. 
#  衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. 
#  暗証番号は口座番号に1111を足して10000で割った余りに設定する. 
#  ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること. 
#  上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること. 
#  % ./initAccount 預金残高は次のとおりです. 
#  立命太郎 (1234) 1234560 円 
#  野路花子 (5678) 987600 円 
#  衣笠一郎 (9012) 538600 円 
#  % 
#  

:- dynamic([口座名義/2,暗証番号/2,口座残高/2]).

'発展課題 13..1 ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現する' :-
        'ATM(Automated Teller Machine; 現金自動預け払い機)システム'.

'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :-
        口座番号を得る(_口座番号),
        '入金/出金/残高参照'(_口座番号),
        fail.
'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :-
        'ATM(Automated Teller Machine; 現金自動預け払い機)システム'.

口座番号を得る(_口座番号) :-
        整数を得る('口座番号 : ',between(0,9999999,_口座番号),_口座番号),
        口座名義(_口座番号,_口座名義),
        writef('%t 様ですね\n',[_口座名義]),
        整数を得る('暗証番号 : ',between(0,9999,_暗証番号),_暗証番号),
        暗証番号(_口座番号,_暗証番号),!.

'入金/出金/残高参照'(_口座番号) :-
        メニュー表示,
        整数を得る('0-4の数字',between(0,3,_選択),_選択),
        '入金/出金/残高参照'(_選択,_口座番号).

メニュー表示 :-
         writef('\n0..終了\n\n1..入金\n2..出金\n3..残高参照\n\n').

'入金/出金/残高参照'(0,_) :- !.
'入金/出金/残高参照'(1,_口座番号) :-
        入金(_口座番号).
'入金/出金/残高参照'(2,_口座番号) :-
        出金(_口座番号).
'入金/出金/残高参照'(3,_口座番号) :-
        残高参照(_口座番号).

入金(_口座番号) :-
        write('紙幣を入力してください : '),
        紙幣を数える(_入力額,正常終了),
        writef('%t 円入力されました : \n',[_入力額]),
        口座残高の入金更新(_口座番号,_入金額).

口座残高の入金更新(_口座番号,_入金額) :-
        retract(口座残高(_口座番号,_口座残高)),
        _更新された口座残高 is _口座残高 + _入金額,
        assertz(口座残高(_口座番号,_更新された口座残高)).

出金(_口座番号) :-
        整数を得る('出金額を入力してください : ',true,_出金額),
        '診断:: 出金額の入力'(_口座番号,_出金額),
        紙幣を出力して口座残高の出金更新(_口座番号,_出金額),!.
出金(_口座番号) :-
        出金(_口座番号).

'診断:: 出金額の入力'(_口座番号,_出金額) :-
        口座残高(_口座番号,_口座残高),
        _口座残高 >= _出金額,!.
'診断:: 出金額の入力'(_口座番号,_出金額) :-
        writef('入力された出金額%tは残高不足です\n再入力をお願いします\n',[_出金額]),
        fail.


紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :-
        紙幣を出力して(_出金額,正常終了),
        口座残高の出金更新(_口座番号,_出金額),!.
紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :-
        write('現在紙幣の出力ができません。\nなお、口座残高は変更ございません\n'),
        fail.

口座残高の出金更新(_口座番号,_出金額) :-
        retract(口座残高(_口座番号,_口座残高)),
        _更新された口座残高 is _口座残高 - _出金額,
        assertz(口座残高(_口座番号,_更新された口座残高)).

残高参照(_口座番号) :-
        個人口座残高の表示(_口座番号).

紙幣を数える(_入力額,正常終了).

紙幣を出力して(_出金額,正常終了).

'立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.' :-
        assertz(口座名義(1234,立命太郎)),
        暗証番号(1234,_暗証番号),
        assertz(暗証番号(1234,_暗証番号)),
        assertz(口座残高(1234,1234560)).

'野路花子の口座番号は5678で,預金残高を987,600円に設定する.' :- 
        assertz(口座名義(5678,野路花子)),
        暗証番号(5678,_暗証番号),
        assertz(暗証番号(5678,_暗証番号)),
        assertz(口座残高(5678,987600)).

'衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.'  :-
        assertz(口座名義(9012,衣笠一郎)),
        暗証番号(9012,_暗証番号),
        assertz(暗証番号(9012,_暗証番号)),
        assertz(口座残高(9012,538600)).

'暗証番号は口座番号に1111を足して10000で割った余りに設定する. ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること.'(_口座番号,_暗証番号) :-
        暗証番号(_口座番号,_暗証番号).

暗証番号(_口座番号,_暗証番号) :-
        _暗証番号 is (_口座番号 + 1111) mod 10000.

'上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること.' :-
        '立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.',
        '野路花子の口座番号は5678で,預金残高を987,600円に設定する.',
        '衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.',
        設定された3人の預金残高を画面へ出力する.

設定された3人の預金残高を画面へ出力する :-
        口座名義(_口座番号,_),
        個人口座残高の表示(_口座番号),
        fail.
設定された3人の預金残高を画面へ出力する.

個人口座残高の表示(_口座番号) :-
        口座名義(_口座番号,_口座名義),
        口座残高(_口座番号,_口座残高),
        writef('%t (%t) %t 円\n',[_口座名義,_口座番号,_口座残高]).