このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/337
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):次の書きこみにまとめます。 
#  
#  地図データmap.dat に対して、出発点の交差点番号をキーボードから入力すると、 
#  A. 隣接する交差点名と交差点番号および出発点からの距離をディスプレイに表示 
#  する 
#  B. 表示された交差点の中から次に進む交差点を選択できる 
#  C. 選択された交差点に対して、A. の手順に戻り、順々に道案内する 
#  プログラムを作成しなさい。手順A の距離は、出発点からの直線距離ではなく、 
#  経路の累計移動距離を計算すること。また、プログラムを途中で終了させるコマ 
#  ンドも用意すること。 
#   
#   
#  という問題について次のようなソースを書いたのですが、これでは経路の累計移動距離が計算されないため、不十分だと言われました。 
#  http://ime.nu/codepad.org/1hcQfHlM 
#  地図データはこちらに上げてあります 
#  http://ime.nu/www1.axfc.net/uploader/Sc/so/202935.dat 
#  どこをどう直せばいいのか、どなたかお願いします 
#   
#  1, 0.0, 0.0, A, 2, 2, 4
#  2, -0.6, 0.15, B, 3, 1, 3, 11
#  3, -0.83, 0.0, C, 4, 2, 4, 9, 10
#  4, -0.6, -0.38, D, 3, 1, 3, 5
#  5, -0.38, -0.68, E, 3, 4, 6, 7
#  6, 6.0, -0.3, F, 1, 5
#  7, -0.18, -1.02, G, 2, 5, 8
#  8,-0.84, -1.58, H, 3, 7, 9, 18
#  9, -0.9, -0.98, I, 2, 3, 8
#  10, -0.98, 0.15, J, 3, 3, 11, 13
#  11, -0.78, 0.3,  K, 3, 2, 10, 12
#  12, -1.28, 0.68, L, 2, 11, 13
#  13, -1.32, 0.53, M, 4, 10, 12, 14, 15
#  14, -1.8, 0.98, N, 2, 13, 20
#  15, -1.43, -0.15, O, 2, 13, 16
#  16, -1.73, -0.26, P,3, 15, 17, 20 
#  17, -1.8, -1.43, Q, 3, 16, 18, 19
#  18, -1.2, -1.73, R, 2, 8, 17
#  19, -2.48, -1.2, S, 2, 17, 20
#  20, -2.33, -0.51, T, 3, 14, 16, 19

交差点を進む(_出発交差点,_移動記録,_移動累積距離) :-
        地図データを読み込む(_地図データ),
        地図データの登録(_地図データ),
        交差点を進む(_出発交差点,0.0,[],_移動記録,_移動累積距離).

交差点を進む(_交差点,_移動記録1,_移動累積距離1,_移動記録,_移動累積距離) :-
        隣接交差点を表示する(_交差点),
        write_formatted('ここまでの移動累積距離は%tです\n',[_移動累積距離1]),
        write('どの交差点に進みますか ? '),
        get_line(_隣接交差点),
        隣接交差点との距離(_交差点,_隣接交差点,_距離),
        _移動累積距離2 is _距離 + _移動累積距離1,
        交差点を進む(_交差点,[_隣接交差点|_移動記録1],_移動累積距離2,_移動記録,_移動累積距離).
交差点を進む(_交差点,_移動記録,_移動累積距離,_移動記録,_移動累積距離) :-
        write_formatted('交差点%tは存在しません\nここまでの移動累積距離は%tでした\nプログラムを終了します\n',[_交差点,_累積移動距離]).

隣接交差点を表示する(_交差点) :-
        findall(_隣接交差点,隣接交差点(_交差点,_隣接交差点),_隣接交差点ならび),
        \+(_隣接交差点ならび=[]),
        concat_atom(_隣接交差点ならび,',',_隣接交差点表示),
        write_formatted('隣接交差点は %t があります\n',[_隣接交差点表示]).

隣接交差点との距離(_交差点,_隣接交差点,_距離) :-
        交差点位置(_交差点,X1,Y1),
        隣接交差点(_交差点,X2,Y2),
        _距離 is sqrt((X2 - X1) ^2 + (Y2 - Y1) ^ 2).

地図データを読み込む(_地図データ) :-
        get_split_lines('map.dat',[','],LL).

地図データの登録(_地図データ) :-
        交差点位置の登録(_地図データ),
        隣接交差点の登録(_地図データ).

交差点位置の登録(_地図データ) :-
        abolish(交差点位置/3),
        append(_,[[_,X,Y,_交差点|_]|R],_交差点データ),
        assertz(交差点位置(_交差点,X,Y)),
        R = [].

隣接交差点の登録(_地図データ) :-
        abolish(隣接交差点/2),
        append(_,[[_交差点ID,_,_,_交差点|_隣接交差点ならび]|R],_地図データ),
        隣接交差点を得る(_地図データ,_隣接交差点IDならび,_隣接交差点),
        assertz(隣接交差点(_交差点,_隣接交差点)),
        R = [].

隣接交差点を得る(_地図データ,[_隣接交差点ID|R],_隣接交差点) :-
        list_nth(_隣接交差点ID,_地図データ,[_,_,_,_隣接交差点|_]).
隣接交差点を得る(_地図データ,[_|R],_隣接交差点) :-
        隣接交差点を得る(_地図データ,R,_隣接交差点).