このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/87
#  [1] 授業単元:基礎プログラミング 
#  [2] 問題文(含コード&リンク): 
#  次のように1行に氏名、科目ごとの成績が記録されたファイル 
#  (ファイル名:result.dat)があるとする。 
#  Name      English   Science   Math   Sociology 
#  Ichiro      100        30          40      90 
#  Jiro        100        80          70      100 
#  Saburo     80         90         100      60 
#  Shiro       95         90          95       80 
#  Goro       73          85         90       98 
#  このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 
#  (表示には平均点を含む) 
#  

'1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :-
        get_lines('result.dat',[_第一行|LL]),
        findall([_平均点,_氏名],(
                    member(Line,LL),
                    split(Line,[' '],[_|_得点ならび]),
                    avg(_得点ならび,_平均点)),
                _平均点ならび),
        平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび).

平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :-
        平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび),
        行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび),
        表示する(_表示行ならび).

平均点の高い順に(_平均点ならび,LL,_行のならび) :-
        sort(_平均点ならび,_整列した平均点),
        reverse(_整列した平均点,_平均点の高い順にならび替えた行),
        findall(_氏名,(
                    member([_,_氏名],_平均点の高い順にならび替えた行)),
                _平均点の高い順の氏名ならび).

行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :-
        findall([_氏名,Line],(
                    member(Line,LL),
                    split(Line,[' '],[_氏名|_])),
                LL1),
        findall(L,(
                    member(_氏名,_平均点の高い順の氏名ならび),
                    member([_氏名,Line],LL1)),
                _表示行ならび).

表示する(_表示行ならび) :-
        append(_,[_表示行|R],_表示行ならび),
        writef('%t\n',[_表示行]),
        R = [].