このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/478
#  [1] 授業単元: プログラミング実習 
#  [2] 問題文: 構造体の型の成績をqsortを用いて 
#  点数を高いものから順に並び替えよ 
#  動作例: 
#  student[1]:76 
#  student[2]:65 
#  student[3]:82 
#    ・ 
#    ・ 
#  ------------------------ 
#  成績順にソートしました。 
#  ------------------------ 
#  student[3]:82 
#  student[1]:76 
#  student[2]:65 
#    ・ 
#    ・ 
#    ・ 
#   
#  

'成績をqsortを用いて点数を高いものから順に並び替えよ' :-
        成績の入力(L1),
        qsort(L1,L2),
        点数の高いものから順に表示(L2,L1).

qsort([_軸要素|R1],L2) :-
        分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),
        qsort(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび),
        qsort(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび),
        append(_整列した軸要素より大きい要素ならび,[_軸要素|_整列した軸要素より小さい要素ならび],L2).

成績の入力(L1) :-
        findall(_成績,(
                    append(L0,_,_),
                    length([_|L0],Nth),
                    writef('student[%t]:',[Nth]),
                    get_line(Line),
                    (   Line='',!,fail;
                        入力を成績に変換(Line,_成績))),
                L1).

分割([],[],[]).,
分割(_軸要素,[A|R1],[A|_軸要素より大きい要素ならび],_軸要素より小さい要素ならび) :-
        A @> _軸要素,
        分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!.
分割(_軸要素,[A|R1],_軸要素より大きい要素ならび,[A|_軸要素より小さい要素ならび]) :-
        A @< _軸要素,
        分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!.

入力を成績に変換(Line,_成績) :-
        atom_to_term(Line,_成績,_),
        integer(_成績),
        _成績 >= 0,
        _成績 =< 100.

点数の高いものから順に表示(L2,L1) :-
        append(_,[_点数|R],L2),
        append(L0,[_点数|_],L1),
        length([_|L0],Nth),
        writef('student[%t]:%t\n',[Nth,_点数]),
        R = [].