このディレクトリの索引
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 
#   
#  

'のぞみ料金表を"http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt"から読み取り、述語 料金表/1 を定義する' :-
get_www_lines('http://nojiriko.asia/prolog/nozomi_ryoukinhyo.txt',Lines),
カンマを取り除く(Lines,_カンマを取り除いたLines),
'述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表),
assertz(料金表(_料金表)).

カンマを取り除く([],[]).
カンマを取り除く([_行|R1],[_カンマを取り除いた行|R2]) :-
行の中のカンマを取り除く(_行,_カンマを取り除いた行),
カンマを取り除く(R1,R2).

行の中のカンマを取り除く(_行,_カンマを取り除いた行) :-
findall(_文字,(
カンマ以外の文字(_行,_文字)),_カンマ以外の文字ならび),
atom_chars(_カンマを取り除いた行,_カンマ以外の文字ならび).

カンマ以外の文字(_行,_文字) :-
sub_atom(_行,_,1,_,_文字),
\+(_文字=',').

'述語 料金表/1 を定義する'(_カンマを取り除いたLines,_料金表) :-
findall(L,(
member(Line,Lines),
split(Line,[' '],L)),LL),
LL = [L1|R],
_料金表 = [[''|L1]|R].


get_www_lines(URL,Lines) :-
atomic_list_concat(['w3m -dump ',URL],S),
shs(S,Lines).

shs(Command,X) :-
popen(Command,L),
shs_2(L,X).

shs_2([],[]) :- !.
shs_2(L,[S|R]) :-
append(L0,['\n'|R1],L),
atom_chars(S,L0),
shs_2(R1,R),!.
shs_2(L,[S]) :-
atom_chars(S,L).

popen(Command,Chars) :-
open(pipe(Command),read,Instream),
get_char(Instream,Char),
popen(Instream,Char,Chars),
close(Instream),!.

popen(Instream,end_of_file,[]) :- !.
popen(Instream,Char,[Char|R]) :-
get_char(Instream,Char2),
popen(Instream,Char2,R).

%split/3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

料金表([['',新大阪,京都,名古屋,新横浜],
        [東京,14920,14390,11540,3180],
        [新横浜,14600,13660,10910],
        [名古屋,6840,6100],
        [京都,3240]]). 

料金表からのぞみ料金述語を定義する :-
料金表(_料金表),
料金表からのぞみ料金述語を定義する(_料金表).

料金表からのぞみ料金述語を定義する([[_|_行き先ならび]|_出発点付き料金表]) :-
新幹線のぞみ料金述語の定義する(_行き先ならび,_出発点付き料金表).

新幹線のぞみ料金述語を定義する(_,[]).
新幹線のぞみ料金述語を定義する(_行き先ならび,[[_出発点|_料金ならび]|R]) :-
出発点からの料金を定義する(_出発点,_行き先ならび,_料金ならび),
新幹線のぞみ料金述語を定義する(_行き先ならび,R).

出発点からの料金を定義する(_,_,[]).
出発点からの料金を定義する(_出発点,[_行き先|R1],[_料金|R2]) :-
assertz(新幹線のぞみ料金(_出発点,_行き先,_料金)),
出発点からの料金を定義する(_出発点,R1,R2).

'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする' :-
split('なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする',[が,と,','],L),
append(_,[',',_駅名,'が,N|_],L).
assertz(駅番号(_駅名,N)),
fail.
'なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする'.