このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/943
#  これらが5個の課題です。 
#  お願いします。 
#   
#  (5) 3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認するプログラムを作成せよ.プログラムは以下を満たすものとする. 
#   整数のデータの入力では,for文を用いること. 
#   予め3×3個の整数の要素を持つ二次元配列を準備する. 
#   縦は3本,横は3本,斜め2本のそれぞれの合計が等しいかを確認する必要がある. 
# 

'予め3×3個の整数の要素を持つ二次元配列を準備する'(_二次元配列) :-
        length(_二次元配列,3),
        findall(L,(
                    append(L0,[L|_],_二次元配列),
                    length(L,3),
                    findall(_要素,(
                                append(L01,[_要素|_],L),
                                length([_|L0],_何行目),
                                length([_|L01],_何列目),
                                writef('[%t][%t] : ',[_何行目,_何列目]),
                                get_integer(_要素)),
                            L)),
                _二次元配列),
        assertz(予め用意した二次元配列(_二次元配列)),!.

'3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認する' :-
        予め用意した二次元配列(_二次元配列),
        行合計が一致する(_二次元配列,_一致した合計),
        転置(_二次元配列,_転置された二次元配列),
        行合計が一致する(_転置された二次元配列,_一致した合計),
        斜め要素の合計(_二次元配列,_一致した合計).

行合計が一致する(_二次元配列,_一致した合計) :-
        findsum(_合計,(
                    append(_,[_行|_],_二次元配列),
                    sum(_行,_合計)),
                L),
        all(L,_一致した合計).

斜め要素の合計(_二次元配列,_一致した合計) :-
        findsum(_斜め要素,(
                    for(1,N,3),
                    nth1(N,_二次元配列,_行),
                    nth1(N,_行,_斜め要素)),
                _一致した合計),
        findsum(_斜め要素,(
                    for(1,N,3),
                    nth1(N,_二次元配列,_行),
                    reverse(_行,_反転した行),
                    nth1(N,_反転した行,_斜め要素)),
                _一致した合計),!.