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

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

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

成績データと整列鍵を得る(_,'0 0',[],[]) :- !.
成績データと整列鍵を得る(100,_,[],[]).
成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :-
split(_行,[' '],[_学籍番号,_成績]),
succ(M,M_2),
get_line(_行_2),
成績データと整列鍵を得る(M_2,_行_2,R1,R2).

成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :-
sort(_整列鍵ならび,_整列した整列鍵ならび),
成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび).

成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび).
成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :-
nth1(M,_成績ならび,[_学籍番号,_成績]),
成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび).

上位11名の選別(L,_上位11名ならび) :-
findnsols(11,X,member(X,L),_上位11名ならび),!.

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