このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/175
#  [1] 授業単元:情報工学 
#  [2]  
#      2次正方行列AとBの各成分の値をキーボードから読み込み 
#       AとBの積、各行列式の値を求めるプログラムを作成せよ。 
#  

'2次正方行列AとBの各成分の値をキーボードから読み込み、AとBの積、各行列式の値を求める' :-
        '2次正方行列AとBの各成分の値をキーボードから読み込み'(_A,_B),
        '2次正方行列AとBの積、各行列式の値を求める'(_A,_B,_行列AとBの積,_Aの行列式の値,_Bの行列式の値),
        'AとBの積を表示する'(_行列AとBの積),
        '行列Aの行列式の値を表示する'(_Aの行列式の値),
        '行列Bの行列式の値を表示する'(_Bの行列式の値),!.

'2次正方行列AとBの各成分の値をキーボードから読み込み'(_A,_B) :-
        '2次正方行列AとBの'(_A,_B),
        '各成分の値をキーボードから読み込み'(_A,_B).

'2次正方行列AとBの'(_A,_B) :-
        length(_A,2),
        findall(L1,(
                    append(_,[_|_],_A),
                    length(L1,2)),
                _A),
        length(_B,2),
        findall(L2,(
                    append(_,[_|_],_B),
                    length(L2,2)),
                _B).

'各成分の値をキーボードから読み込み'(_A,_B) :-
        write('行列Aの成分の値を入力します\n'),
        findall(L1,(
                    append(_,[L1|_],_A),
                    write('行をカンマ区切りで入力してください : '),
                    readln(L1)),
                _A),
        write('行列Bの成分の値を入力します\n'),
        findall(L2,(
                    append(_,[L2|_],_B),
                    readln(L2)),
                _B),!.

'2次正方行列AとBの積、各行列式の値を求める'(_A,_B,_行列AとBの積,_Aの行列式の値,_Bの行列式の値) :-
        '2次正方行列AとBの積'(_A,_B,_行列AとBの積),
        '各行列式の値を求める'(_A,_B,_Aの行列式の値,_Bの行列式の値).        

'2次正方行列AとBの積'([[A1,A2],[A3,A4]],[[B1,B2],[B3,B4]],[[C1,C2],[C3,C4]]) :-
        C1 is A1 * B1 + A2 * B3,
        C2 is A1 * B2 + A2 * B4,
        C3 is A3 * B1 + A4 * B3,
        C4 is A3 * B2 + A4 * B4.

'各行列式の値を求める'([[A1,A2],[A3,A4]],[[B1,B2],[B3,B4]],_Aの行列式の値,_Bの行列式の値) :-
        _Aの行列式の値 is A1 * A4 - A2 * A3,
        _Bの行列式の値 is B1 * B4 - B2 * B3.

'AとBの積を表示する'([[C1,C2],[C3,C4]]) :-
        writef('[[%t,%t]\n',[C1,C2]),
        writef(' [%t,%t]]\n',[C3,C4]).

'行列Aの行列式の値を表示する'(_Aの行列式の値) :-
        writef('2次正方行列Aの行列式の値は %t です\n',[_Aの行列式の値]).

'行列Bの行列式の値を表示する'(_Bの行列式の値) :-
        writef('2次正方行列Bの行列式の値は %t です\n',[_Bの行列式の値]).