このディレクトリの索引
http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110)
# [1] 授業単元:プログラミング1
# [2] 問題文(含コード&リンク):
# 述語 成績表は学籍番号と成績を引数として持つ。
# このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。
# ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいのデータを優先するものとする。
# 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。

成績上位11名 :-
降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび),
学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび),
上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび).

降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :-
setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび),
reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび).

学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび) :-
setof([_学籍番号,_成績],[_学籍番号,_成績] ^ 成績(_学籍番号,_成績),_学籍番号を鍵に昇順に整列した成績ならび).

上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび) :-
once(上位11名を選別する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_上位11名)),
上位11名を表示する(_上位11名).

上位11名を選別する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_上位11名ならび) :-
findnsols(11,[_学籍番号,_成績],
'降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_学籍番号,_成績),_上位11名ならび).

'降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_学籍番号,_成績) :-
member(_成績,_降順に整列した成績鍵ならび),
member([_学籍番号,_成績],_学籍番号を鍵に昇順に整列した成績ならび).

上位11名を表示する(_上位11名ならび) :-
forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])).