このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/22
#  表現がよくないと思ったので、修正します。 
#   
#  [1] 授業単元:自己参照構造体 双方向チェーンの並び替え 
#  [2] 問題文(含コード&リンク):  
#  以下のクラス・氏名・順位が定義された自己参照構造体チェーンをクラス毎に順位の昇順にソートしてポインタをなさい。  
#  3-1 A君 3位 
#  3-1 B君 2位 
#  3-1 C君 4位 
#  3-1 D君 1位 
#  3-2 P君 2位 
#  3-2 Q君 3位 
#  3-2 R君 1位 
#  3-3 X君 1位 
#  3-3 Y君 2位 
#  ****************  
#  結果  
#  3-1 D 1 
#  3-1 B 2 
#  3-1 A 3 
#  3-1 C 4 
#  3-2 R 1 
#  3-2 P 2 
#  3-2 Q 3 
#  


'クラス・氏名・順位が定義された自己参照構造体チェーンをクラス毎に順位の昇順にソートする'(LL1,LL2) :- !.
        クラスの整列選別(LL1,_整列したクラスならび),
        'クラス毎に順位の昇順にソートする'(_整列したクラスならび,LL1,LL1_2),
        要素順を元に戻しながらクラスを解く(LL1_2,LL2).

クラスの整列選別([],L,L) :- !.
クラスの整列選別([[_クラス,_,_]|R1],L1,L) :-
        挿入(_クラス,L1,L2),
        クラスの整列選別(R1,L2,L).

挿入(_クラス,[],[_クラス]) :- !.
挿入(_クラス,[_クラス|R],[_クラス|R]) :- !.
挿入(_クラス,[_クラス_1|R],[_クラス,_クラス_1|R]) :-
        _クラス @< _クラス_1,!.
挿入(_クラス,[_クラス_1|R1],[_クラス_1|R2]) :-
        _クラス @> _クラス_1,
        挿入(_クラス,R1,R2),!.


'クラス毎に順位の昇順にソートする'(_整列したクラスならび,LL1,LL2) :-
        findall(LL,(
                    member(_クラス,_整列したクラスならび),
                    クラスを選別し順位の昇順にソートする(_クラス,LL1,LL)),
                LL2).

クラスを順位の昇順にソートする(_クラス,LL1,LL2) :-
        findall([_順位,_クラス,_氏名],(
                    member([_クラス,_氏名,_順位],LL1)),
               LL),
        整列(LL,LL2).

整列([_軸要素|R1],LL2) :-
        整列(_軸要素,R1,LL2).

整列(_,[],[]).
整列(_軸要素,LL1,LL2) :-
        分割(_軸要素,LL1,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび),
        整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび),
        整列(_軸要素に等しいか大きい要素ならび,_整列した軸要素に等しいか大きい要素ならび),
        append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素に等しいか大きい要素ならび],LL2).

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

要素順を元に戻しながらクラスを解く(LL,L) :-
        要素順を元に戻しながら平坦化する(LL,[],L).

要素順を元に戻しながらクラスを解く([],L,L) :- !.
要素順を元に戻しながらクラスを解く([L|R],X,Y) :-
        list(L),
        要素順を元に戻しながら追加する(L,X,Z),
        要素順を元に戻しながらクラスを解く(R,Z,Y).

要素順を元に戻しながら追加する([],L,L).
要素順を元に戻しながら追加する([[_順位,_名前,_クラス]|R],L1,[[_クラス,_名前,_順位]|R3]) :-
        要素順を元に戻しながら追加する(R,L1,R3).