このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/563
#  http://ime.nu/codepad.org/bsGYVXWW  
# 
#  4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する。
#  

'4名の学生別に3科目の成績を入力してその学生別平均と科目別平均を表示する' :-
        '4名の学生別に3科目の成績を入力して'(LL),
        'その学生別平均と'(LL,_学生別平均ならび),
        '科目別平均を'(LL,_科目別平均ならび),
        '表示する'(_学生別平均ならび,_科目別平均ならび).

'4名の学生別に3科目の成績を入力して'(LL) :-
        '4名の'(LL,4),
        findall(L,(
                    学生別に(LL,L),
                    '3科目の成績を入力する'(L)),
                LL).

'4名の'(LL) :-
        length(LL,4).

学生別に(LL,L) :-
        append(_,[L|_],LL).

'3科目の成績を入力する'(L) :-
        '3科目の'(L),
        findall(_成績,(
                    成績を(L,_成績),
                    入力する(_成績)),
                L).

'3科目の'(L) :-
        length(L,3).

成績を(L,_成績) :-
        append(_,[_成績|_],L).

入力する(_成績) :-
        get_line(Line),
        成績入力検査(Line,_成績),!.
入力する(_成績) :-
        入力する(_成績).

成績入力検査(Line,_成績) :-
        atom_to_term(Line,_成績,_),
        '成績は0点以上100点以下の整数とする'(_成績),!.
成績入力検査(Line,_成績) :-
        writef('入力された%tからは科目成績として適切な整数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'成績は0点以上100点以下の整数とする'(_成績) :-
        integer(_成績),
        _成績 >= 0,
        _成績 =< 100.

'その学生別平均と'(LL,_学生別平均ならび) :-
        findall(_平均,(
                    append(_,[L|_],LL),
                    相加平均(L,_平均)),
                _学生別平均ならび).

'科目別平均を'(LL,_科目別平均ならび) :-
        転置(LL,LL1),
        findall(_平均,(
                    append(_,[L|_],LL1),
                    相加平均(L,_平均)),
                _科目別平均ならび).

相加平均([],N,S,M) :-
        M is S / N,!.
相加平均([A|R],N,S,M) :-
        S1 is S + A,
        相加平均(R,N,S1,M).

相加平均(L,M) :-
        length(L,N),
        相加平均(L,N,0.0,M).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).