このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/911
#   
#  [1] 授業単元:基礎C言語 
#  [2] 問題文(含コード&リンク):二つの3×3行列A.Bを入力して、その積と、それぞれの逆行列を出力するプログラムを作れ。 
#  

'二つの3×3行列A.Bを入力して、その積と、それぞれの逆行列を出力する' :-
        '二つの3×3行列A.Bを入力して'(_A,_B),
        'その積と'(_A,_B,_Aと_Bの積),
        'それぞれの逆行列を出力する'(_A,_B,_Aの逆行列,_Bの逆行列).

'二つの3×3行列A.Bを入力して'(_A,_B) :-
        '二つの3×3行列A.B'(_A,_B) ,
        '入力して'(_A,_B).

'二つの3×3行列A.B'(_A,_B) :-
        length(_A,3),
        length(_B,3),
        findall(L1,(
                    append(_,[L1|_],_A)),
                _A),
        findall(L2,(
                    append(_,[L2|_],_B)),
                _B).

'入力して'(_A,_B) :-
        '_Aを入力する'(_A),
        '_Bを入力する'(_B).

'_Aを入力する'(_A) :-
        findall([_値1,_値2,_値3],(
                    append(_,[_|_],_A),
                    write('行データ(3項)をカンマ区切りで入力してください : '),
                    readln([_値1,_値2,_値3])),
                _A).

'_Bを入力する'(_B) :-
        findall([_値1,_値2,_値3],(
                    append(_,[_|_],_B),
                    write('行データ(3項)をカンマ区切りで入力してください : '),
                    readln([_値1,_値2,_値3])),
                _B).

'二つの3×3行列A.Bの積'(_A,_B,_評価された行列の積) :-
        _A = [[_a11,_a12,_a13],
              [_a21,_a22,_a23],
              [_a31,_a32,_a33]],
        _B = [[_b11,_b12,_b13],
              [_b21,_b22,_b23],
              [_b31,_b32,_b33]],
        _C = [[_a11*_b11+_a12*_b21+_a13*_b31,_a11*_b12+_a12*_b22+_a13*_b32,_a11*_b13+_a12*_b23+_a13*_b33],
              [_a21*_b11+_a22*_b21+_a23*_b31,_a21*_b12+_a22*_b22+_a23*_b32,_a21*_b13+_a22*_b23+_a23*_b33],
              [_a31*_b11+_a32*_b21+_a33*_b31,_a31*_b12+_a32*_b22+_a33*_b32,_a31*_b13+_a32*_b23+_a33*_b33]],
        行列要素を評価する(_C,_評価された行列の積).

行列要素を評価する(LL1,LL2) :-
        findall(L2,(
                    append(_,[L1|_],LL1),
                    行の評価(L1,L2)),
                LL2).

行の評価(L1,L2) :-
        findall(_評価値,(
                    append(_,[_式|_],L1),
                    _評価値 is _式),
                L2).


%  
%  この課題のポイントは'二つの3×3行列A.Bの積'(_A,_B,_評価された行列の積) という述語。
%  Prologプログラムが高校生の参考書の役割を担うとすればどのような様式になるかを
%  考えてみた。
%