このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/339
#  [1] 授業単元: プログラミング 
#  [2] 問題文(含コード&リンク):5人の学生の3教科(国・数・英)の点数を 
#  読み込んで、2次元配列を用いて以下の条件を満たすプログラムを作成せよ。 
#  (1)科目別の最高点を求める。 
#  (2)各学年の3教科の平均を求める。 
#  これらを表にして表示する。  
# 

'5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点、3教科の平均を表示' :-
    findall(L,(for(1,N,5),get_line(Line),split(Line,[','],L)),_学生の得点ならび),
    科目別最高点(_学年の得点ならび,[_国最高点,_数最高点,_英最高点]),
    write('科目別最高点,国,数,英\n'),
    write_formatted(',%t,%t,%t\n',[_国最高点,_数最高点,_英最高点]),
    各学年の3教科の合計(_学生の得点ならび,[],_各学年の3教科の合計),
    各学年の3教科の平均(_各学年の3教科の合計,_各学年の3教科の平均),
    write('学年別、科目別平均点\n'),
    member([_学年,_国平均,_数平均,_英平均],_各学年の3教科の平均),
    write_formatted('%t,%t,%t,%t\n',[_学年,_国平均,_数平均,_英平均]),
    fail.
'5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点、3教科の平均を表示'.

科目別最高点(_学年の得点ならび,_科目別最高点) :-
    行列の転置(_学年の得点ならび,[_|L1]),
    findall(Max,(member(L2,L1),max(L2,Max)),_科目別最高点).

各学年の3教科の合計([],X,X).
各学年の3教科の合計([[_学年,_国,_数,_英]|R1],Y,X) :-
    '3教科合計に加算'(_学年,_国,_数,_英,Y,Y2),
    各学年の3教科の合計(R1,Y2,X).

'3教科合計に加算'(_学年,_国,_数,_英,[],[[_学年,1,_国合計,_数合計,_英合計]]).
'3教科合計に加算'(_学年,_国,_数,_英,[_学年,_人数,_国合計,_数合計,_英合計|R],[[_学年,_人数2,_国合計2,_数合計2,_英合計2]|R]) :-
    _国合計2 is _国 + _国合計,
    _数合計2 is _数 + _数合計,
    _英合計2 is _英 + _英合計,
    _人数2 is _人数 + 1,!.
'3教科合計に加算'(_学年,_国,_数,_英,[L1|R1],[L1|R2]) :-
    '3教科合計に加算'(_学年,_国,_数,_英,R1,R2).

各学年の3教科の平均([],[]).
各学年の3教科の平均([[_学年,_人数,_国合計,_数合計,_英合計]|R1],[[_学年,_国平均,_数平均,_英平均]|R2]) :-
    _国平均 is _国合計 / _人数,
    _数平均 is _数合計 / _人数,
    _英平均 is _英合計 / _人数,
    各学年の3教科の平均(R1,R2).