このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/456
#  {1] 授業単元:プログラミング演習  
#  [2] 問題文:  
#  100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 
#  

'100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :-
        '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび),
        得点の高い順に出力する(_10人分の点数ならび).

'100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :-
        '10人分'(_10人分の点数ならび),
        findall(_点数,(
                    append(L1,[_点数|_],_10人分の点数ならび),
                    '100点満点の試験の点数を入力'(L1,_点数)),
                _10人分の点数ならび).

'10人分'(_10人分の点数ならび) :-
        length(_10人分の点数ならび,10).

'100点満点の試験の点数を入力'(Ln,_点数) :-
        length([_|Ln],_何人目),-
        writef('%t人目の点数を入力してください : ',[_何人目]),
        get_line(Line),
        '100点満点の試験の点数を入力診断'(Line,_点数),!.
'100点満点の試験の点数を入力'(Ln,_点数) :-
        '100点満点の試験の点数を入力'(Ln,_点数).

'100点満点の試験の点数を入力診断'(Line,_点数) :-
        atom_to_term(Line,_点数,_),
        integer(_点数),
        '100点満点の'(_点数),!.
'100点満点の試験の点数を入力診断'(Line,_点数) :-
         writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]),
        fail.

'100点満点の'(_点数) :-
        _点数 >= 0,
        _点数 =< 100,!.

得点の高い順に出力する(_点数ならび) :-
        得点の高い順に(_点に数ならび,_大きい順に整列された点数ならび),
        出力する(_大きい順整列された点数ならび).

出力する([_点数]) :-
        writef('%t\n',[_点数]),!.
出力する([_点数|R]) :-
        writef('%t ',[_点数]),
        出力する(R).

得点の高い順に([],[]).
得点の高い順に(L1,L2) :-
        L1 = [_軸要素|R1],
        得点の高い順に(_軸要素,R1,L2).

得点の高い順に(_軸要素,L1,L2) :-
        得点の高い順に分割(_軸要素,L1,_軸要素に等しいかより大きいならび,_軸要素より小さいならび),
        得点の高い順に(_軸要素に等しいかより大きいならび,_整列された軸要素に等しいかより大きいならび),
        得点の高い順に(_軸要素より小さいならび,_整列された軸要素より小さいならび),
        append(_整列された軸要素に等しいかより大きいならび,[_軸要素|_整列された軸要素より小さいならび).

得点の高い順に分割(_軸要素,[],[],[]).
得点の高い順に分割(_軸要素,[A|R1],[A|R2],R3) :-
        A @>= _軸要素,
        得点の高い順に分割(_軸要素,R1,R2,R3).
得点の高い順に分割(_軸要素,[A|R1],R2,[A|R3]) :-
        A @< _軸要素,
        得点の高い順に分割(_軸要素,R1,R2,R3).