このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/978
#  [1] 授業単元:2次元配列 
#  [2] 問題文(含コード&リンク): 
#  新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 
#  出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 
#  なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 
#  但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 
#        新大阪  京都 名古屋 新横浜  
#  東京       14,920   14,390  11,540  3,180 
#  新横浜     14,600   13,660  10,910   
#  名古屋      6,840    6,100 
#  京都        3,240 
#   
#  
%  駅番号/2 と 新幹線のぞみ料金/3 の定義


駅番号(東京,1).
駅番号(新横浜,2).
駅番号(名古屋,3).
駅番号(京都,4).
駅番号(新大阪,5).

新幹線のぞみ料金(東京,新大阪,14920).
新幹線のぞみ料金(東京,京都,14390).
新幹線のぞみ料金(東京,名古屋,11540).
新幹線のぞみ料金(東京,新横浜,3180).
新幹線のぞみ料金(新横浜,新大阪,14600).
新幹線のぞみ料金(新横浜,京都,13600).
新幹線のぞみ料金(新横浜,名古屋,10910).
新幹線のぞみ料金(名古屋,新大阪,6840).
新幹線のぞみ料金(名古屋,京都,6100).
新幹線のぞみ料金(京都,新大阪,3340).

'新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示する。なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。' :-
        repeat,
        出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅),
        料金を表示する(_出発駅,_到着駅),
        '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する'.

出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅) :-
        出発駅を駅番号で入力(_出発駅番号),
        駅番号(_出発駅,_出発駅番号),
        到着駅を駅番号で入力(_出発駅番号,_到着駅番号),
        駅番号(_到着駅,_到着駅番号),!.

出発駅を駅番号で入力(_出発駅番号) :-
        駅名メニュー表示(出発,[],_駅名メニュー表示),
        writef('%t\n',[_駅名ニュー表示]),
        駅番号の入力([],_出発駅番号),!.

到着駅を駅番号で入力(_出発駅番号,_到着駅番号) :-
        駅名メニュー表示(到着,[_出発駅番号],_駅名メニュー表示),
        writef('%t\n',[_駅名メニュー表示]),
        駅番号の入力(_出発駅番号,_到着駅番号),!.

駅名メニュー表示(_出発か到着,_回避駅番号ならび,_駅名メニュー表示) :-
        駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび),
        atomic_list_concat([_出発か到着,'駅を駅番号で入力します。 0..最初から入力し直し '|_表示駅名ならび],_駅名メニュー表示).

駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび) :-
         findall(_表示駅名,(
                     駅番号(_,_駅番号),
                     回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号,_表示駅名)),
                 _表示駅名ならび).                     

回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号ならび,_表示駅名) :-
        \+(member(_駅番号,_回避駅番号ならび)),
        駅番号(_駅名,_駅番号),
        atomic_concat_list([_駅番号,'..',_駅名,' '],_表示駅名).

駅番号の入力(_回避駅番号ならび,_駅番号) :-
        write('駅番号を入力してください : '),
        get_line(Line),
        駅番号の入力診断(Line,_駅番号),!.
駅番号の入力(_回避駅番号ならび,_駅番号) :-
        駅番号の入力(_回避駅番号ならび,_駅番号).

駅番号の入力診断(Line,_回避駅番号ならび,_駅番号) :-
        atom_to_term(Line,_駅番号,_),
        '駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび),!.
駅番号の入力診断(Line,_,_) :-
        writef('入力された %t からは適切な駅番号が得られません。再入力をお願いします。\n',[Line]),
        fail.

'駅番号は整数で回避駅番号ならびにない'(0,_) :-
        '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる',!.
'駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび) :-
        integer(_駅番号),
        駅番号(_,_駅番号),
        その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび).

その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :-
        \+(member(_駅番号,_回避駅番号ならび)),!.
その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :-
        writef('駅番号%tは既に使われています\n',[_駅番号]),
        fail.

料金を表示する(_出発駅,_到着駅) :-
        料金を(_出発駅,_到着駅,_料金),
        表示する(_料金).

料金を(_出発駅,_到着駅,_料金) :-
        新幹線のぞみ料金(_出発駅,_到着駅,_料金),!.
料金を(_出発駅,_到着駅,_料金) :-
        新幹線のぞみ料金(_到着駅,_出発駅,_料金).

表示する(_料金) :-
        writef('料金は %t 円です\n',[_料金]).

'料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する' :-
        write('選択してください。 1.. 処理の繰り返し  0.. 終了 : '),
        get_integer(_処理番号),
        _処理番号 = 0.

'駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'.