このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/625
#  [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 
#  

:- dynamic('クラス・氏名・順位'/3).


'クラス・氏名・順位'(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).


'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして定義し直す' :-
クラス毎に順位の昇順にソートして(_クラス毎に昇順にソートされたならび),
定義し直す(_クラス毎に昇順にソートされたならび).


'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして'(_クラス毎に昇順にソートされたならび) :-
findall([_クラス,_順位,_氏名],retract('クラス・氏名・順位'(_クラス,_氏名,_順位)),_クラス_氏名_順位ならび),
整列(_クラス_氏名_順位ならび,_クラス毎に昇順にソートされたならび).


定義し直す(_クラス毎に昇順にソートされたならび) :-
append(_,[[_クラス,_順位,_氏名]|R],_クラス毎に昇順にソートされたならび),
assertz('クラス・氏名・順位'(_クラス,_氏名,_順位)),
R = [].