このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/384
#   
#  [1] 授業単元:2次元配列の利用 
#  [2] 問題文(含コード&リンク): 
#  新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示するプログラムを作成しなさい。 
#  なお、駅番号は、東京が1、新横浜が2、名古屋が3、京都が4、新大阪が5とする。 
#  但し、料金を表示してから後で、1を入力すると上記の処理を繰り返し、0を入力するとプログラムを終了するものとする。 
#      新大阪 京都  名古屋 新横浜 
#  東京  14920 14390 11540  3180 
#  新横浜 14600 13660 10910 
#  名古屋 6840 6100 
#  京都  3240 
#  

:- のぞみ料金表の生成('のぞみ料金表.txt').

出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :-
        出発駅を得る(_出発駅),
        到着駅を得る(_到着駅),
        のぞみ料金(_出発駅,_到着駅,_料金),
        料金を表示する(_出発駅,_到着駅,_料金),
        write('0..終了 1..別の料金を検索する : '),
        get_line('0'),!. 
出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する :-
        出発駅と到着駅をそれぞれ駅番号で入力し、料金を表示する.

出発駅を得る(_出発駅) :-
        駅番号駅名表示(_駅番号駅名表示),
        writef('出発駅を番号で選択してください。%t : ',[_駅番号駅名表示]),
        駅番号で入力する(_駅番号),
        駅番号(_駅番号,_出発駅),!.
出発駅を得る(_出発駅) :- 出発駅を得る(_出発駅).

到着駅を得る(_到着駅) :-
        駅番号駅名表示(_駅番号駅名表示),
        writef('到着駅を番号で選択してください。%t : ',[_駅番号駅名表示]),
        駅番号で入力する(_駅番号),
        駅番号(_駅番号,_到着駅),!.
到着駅を得る(_到着駅) :- 到着駅を得る(_到着駅).

駅番号駅名表示(_駅番号駅名表示) :-
        findall(S,(
                    駅番号(_駅番号,_駅名),
                    concat_atom([_駅番号,'..',_駅名],S)),
                L),
        concat_atom(L,' ',_駅番号駅名表示),!.

駅番号で入力する(_駅番号) :-
        get_line(Line),
        駅番号入力診断(Line,_駅番号),!.

駅番号入力診断(Line,_駅番号) :-
        atom_to_term(Line,_駅番号,_),
        integer(_駅番号),
        _駅番号 >= 1,
        _駅番号 =< 5,!.
駅番号入力診断(Line,_駅番号) :-
        writef('入力された %t から適切な駅番号が得られません。再入力をお願いします\n',[Line]),
        fail.

料金を表示する(_出発駅,_到着駅,_料金) :-
        writef('%t から %t までの料金は %t 円です。\n',[_出発駅,_到着駅,_料金]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

のぞみ料金表の作成(File) :-
        get_split_lines(File,[' '],Lines),
        Lines = [_駅名横ならび|R1],
        findall(_駅名,(
                    append(LL0,[[_駅名|_]|R],R1)),
                _駅名縦ならび),
        駅番号の登録(_駅名縦ならび),
        findall(_料金ならび,(
                    append(LL0,[[_|_料金ならび]|_],R1)),
                _料金表),
        のぞみ料金表の作成(_駅名縦ならび,_駅名横ならび,_料金表).

駅番号の登録(_駅名縦ならび) :-
        append(_駅名縦ならび,[新大阪],_駅名縦ならびのニ),
        append(L0,[_駅名|R],_駅名縦ならびのニ),
        length([_|L0],Len),
        assertz((駅番号(Len,_駅名) :- !)),
        R = [].

のぞみ料金表の作成([],_,_) :- !.
のぞみ料金表の作成([_駅名|R1],_駅名横ならび,[L3|R3]) :-
        駅単位料金表(_駅名,_駅名横ならび,L3),
        のぞみ料金表の作成(R1,_駅名横ならび,R3).

起点駅単位料金登録(_,_,[]) :- !.
起点駅単位料金登録(_駅名,[_駅名2|R2],[_料金|R3]) :-
        assertz(のぞみ料金(_駅名,_駅名2,_料金)),
        assertz(のぞみ料金(_駅名2,_駅名,_料金)),
        起点駅単位料金表(_駅名,R2,R3).