このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/271

#  [1] 授業単元:プログラミング基礎 
#  [2] 問題文(含コード&リンク):バブルソート法を使って、map.datに対して交差点名(アルファベット)を
#  入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する
#  プログラムを書きなさい。 
#  1    0.0    0.0    H   2   2   4   0   0
#  2   -0.6    0.15   D   3   1   3  11   0
#  3   -0.83   0.0    K   4   2   4   9  10
#  4   -0.6   -0.38   O   3   1   3   5   0
#  5   -0.38  -0.68   M   3   4   6   7   0
#  6    6.0   -0.3    T   1   5   0   0   0
#  7   -0.18  -1.02   U   2   5   8   0   0
#  8   -0.84  -1.58   N   3   7   9  18   0
#  9   -0.9   -0.98   V   2   3   8   0   0
#  10  -0.98   0.51   R   3   3  11  13   0
#  11  -0.78   0.3    P   3   2  10  12   0
#  12  -1.28   0.68   E   2  11  13   0   0
#  13  -1.32   0.53   I   4  10  12  14  15
#  14  -1.8    0.98   C   2  13  20   0   0
#  15  -1.43  -0.15   J   2  13  16   0   0
#  16  -1.73  -0.26   P   3  15  17   0   0
#  17  -1.8   -1.43   W   3  16  18  19   0
#  18  -1.2   -1.73   S   2   8  17   0   0
#  19  -2.48  -1.2    Z   2  17  20   0   0
#  20  -2.33  -0.51   B   3  14  16  19   0
#  

'バブルソート法を使って、map.datに対して交差点名(アルファベット)を入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する' :-
        get_split_lines('map.dat',[','],LL),
        交差点名の入力(_交差点名),
        append(_,[[N,X,Y,_交差点名,_,_,_,_,_]|_],LL),
        その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(_整列した直線距離の二乗ならび・交差点名ならび),
        表示する(_整列した直線距離の二乗ならび・交差点名ならび).

交差点名の入力(_交差点名) :-
        write('交差点名を入力してください : '),
        get_line(_交差点名),!.

その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(LL,_整列した直線距離の二乗ならび・交差点名ならび) :-
        findall([_直線距離の二乗,_交差点名1],(
                    append(_,[[N1,X1,Y1,_交差点名1,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5]|_],LL),
                    \+(_交差点名=_交差点名),
                    交差点はNと隣接している(N,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5),
                    _直線距離の二乗 is (X1-X) ^ 2 + (Y1-Y) ^ 2),
                _直線距離の二乗ならび・交差点名ならび),
        バブルソート(_直線距離の二乗ならび・交差点名ならび,_整列した直線距離の二乗ならび・交差点名ならび),!.

交差点はNと隣接している(N,N,_,_,_,_) :- !.
交差点はNと隣接している(N,_,N,_,_,_) :- !.
交差点はNと隣接している(N,_,_,N,_,_) :- !.
交差点はNと隣接している(N,_,_,_,N,_) :- !.
交差点はNと隣接している(N,_,_,_,_,N) :- !.

バブルソート(_対象ならび,_整列済みならび) :-
        交換(_対象ならび,_対象ならびの一),!,
        バブルソート(_対象ならびの一,_整列済みならび).
バブルソート(_整列済みならび,_整列済みならび).

交換([],[]) :- !,fail.
交換([A,B|R],[B,A|R]) :-
        A @> B,!.
交換([A|R1],[A|R2]) :-
        交換(R1,R2).

表示する(_整列した直線距離の二乗ならび・交差点名ならび) :-
        append(_,[[_直線距離の二乗,]|R],_整列した直線距離の二乗ならび・交差点名ならび),
        write_formatted('%t,%t\n',[_隣接交差点名,_直線距離の二乗]),
        R = [],!.