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

成績上位11名 :-
'成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび),
降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび),
上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび).

'成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :-
write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '),
get_line(_行),
length(Ln,100),
成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび).

成績データを得る(_,'0 0',[]) :- !.
成績データを得る([],_,[]).
成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :-
split(_行,[' '],[_学籍番号,_成績]),
get_line(_行_2),
成績データを得る(Ln,_行_2,R).

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

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

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

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

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