このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/183
#  [2]xy平面上の10 個の点(0〜9 番とする) の(x, y) 座標を入力させ 
#  つぎのようにソートするプログラムを作れ. 
#  大きさ10の配列x, y を用いて,i番目の点の座標をそれぞれx[i], y[i] に入れる. 
#   
#  (梅) x座標の値の昇順 
#   
#  (原点より近い点から遠い点の順) 
#  注意:点を入れ替える時には,x 座標だけでなく,y座標も入れ替えること. 
#   

'座標点ならびを確保して、座標点を10個入力し、原点から近い順に整列する'(_整列された座標点ならび) :-
        '座標点ならびを確保して'(_座標点ならび),
        '座標点を10個入力し'(_座標点ならび),
        '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび).

'座標点ならびを確保して'(_座標点ならび) :-
        length(_座標点ならび,10).

'座標点を10個入力し'(_座標点ならび) :-
        findall((X,Y),(
                    append(L0,[(X,Y)|_],_座標点ならび),
                    座標点の入力(L0,X,Y)),
                _座標点ならび).

座標点の入力(L0,X,Y) :-
        length([_|L0],_個目),
        writef('[%t個目] x,y座標をカンマ区切りで入力してください : ',[_個目]),
        get_line(Line),
        座標点入力診断(Line,X,Y),!.
座標点の入力(L0,X,Y) :- 座標点の入力(L0,X,Y).

座標点入力診断(Line,X,Y) :-
        split(Line,[',',' '],[X,Y]),
        number(X),
        number(Y),!.
座標点入力診断(Line,X,Y) :-
        writef('入力された%tからは適切な座標点が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび) :-
        原点からの距離を付加する(_座標点ならび,_原点からの距離を付加された座標点ならび),
        整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび),
        距離を削除する(_整列した原点からの距離を付加された座標点ならび,_整列された座標点ならび).

原点からの距離を付加する([],[]) :- !.
原点からの距離を付加する([(X,Y)|R1],[(D,X,Y)|R2]) :-
        D is sqrt(X^2+Y^2),
        原点からの距離を付加する(R1,R2).

整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび) :-
        sort(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび).

距離を削除する([],[]).
距離を削除する([(_,X,Y)|R1],[(X,Y)|R2]) :-
        距離を削除する(R1,R2).