このディレクトリの索引
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」を入力すると終了する) : '),
        length(Ln,100),
        get_line(_行),
        成績データを得る(Ln,_行,_成績ならび).

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

成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび) :-
        sort(_成績ならび,_点数が少ない順に整列した成績ならび),
        reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび).

上位11名の選別(L,X) :-
        length(X,11),
        append(X,_,L),!.
上位11名の選別(X,X).

上位11名を表示する(_上位11名ならび) :-
        append(_,[[A,B,C]|R],_上位11名ならび),
        writef('%t %t\n',[C,A]),
        R = [],!.