このディレクトリの索引
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の逆行列).

'二つの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),
                    readln([_値1,_値2,_値3])),
                _A).

'_Bを入力する'(_B) :-
        findall([_値1,_値2,_値3],(
                    append(_,[_|_],_B),
                    readln([_値1,_値2,_値3])),
                _B).

それぞれの逆行列を出力する(_A,_B,_Aの逆行列,_Bの逆行列) :-

        '_Aの逆行列を出力する'(_A,_Aの逆行列),
        '_Bの逆行列を出力する'(_B,_Bの逆行列).

'_Aの逆行列を出力する'(_A,_Aの逆行列) :-
        逆行列(_A,_Aの逆行列),
        行列を出力する(_A),
        write('の逆行列は\n'),
        行列を出力する(_Aの逆行列),!.

'_Bの逆行列を出力する'(_B,_Bの逆行列) :-
        逆行列(_B,_Bの逆行列),
        行列を出力する(_B),
        write('の逆行列は\n'),
        行列を出力する(_Bの逆行列),!.

逆行列(_行列,_逆行列) :-
        length(_行列,N),
        単位行列(N,L),
        行列の結合(_行列,L,_行列の二),
        既約ガウス行列に変形(_行列の二,_既約ガウス行列),
        変数正方行列(1,N,_逆行列),
        行列の結合(_,_逆行列,_既約ガウス行列).

行列の結合(Len1,Len2,[_行1],[_行2],[_行3]) :-
        append(_行1,_行2,_行3),
        length(_行1,Len1),
        length(_行2,Len2).
行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :-
        append(_行1,_行2,_行3),
        行列の結合(Len1,Len2,R1,R2,R3),
        length(_行1,Len1),
        length(_行2,Len2).

行列の結合([_行1|R1],[_行2|R2],_結合された行列) :-
        行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列),
        Len1 > 0,
        Len2 > 0.

単位行列(M,N1,N,[]) :-
        N1 > N,!.
単位行列(M,M,N,[1|R]) :-
        N2 is M + 1,
        単位行列(M,N2,N,R).
単位行列(M,N1,N,[0|R]) :-
        \+(N1 = M),
        N2 is N1 + 1,
        単位行列(M,N2,N,R).

単位行列(M,N,[]) :-
        M > N,!.
単位行列(M,N,[_行|R]) :-
        単位行列(M,1,N,_行),
        M2 is M + 1,
        単位行列(M2,N,R).

単位行列(N,_単位行列) :-
        単位行列(1,N,_単位行列).

単位行列(_単位行列) :-
        正方行列(_単位行列),
        length(_単位行列,_次数),
        単位行列(_次数,_単位行列) .

変数正方行列(M,N,[]) :-
        M > N.
変数正方行列(M,N,[L|R]) :-
        length(L,N),
        M2 is M + 1,
        変数正方行列(M2,N,R).

%  
%  ガウス行列に変形/2は http://nojiriko.asia/prolog/Gauss_gyoretsu_ni_henkei.html
%  既約ガウス行列に変形/2 は http://nojiriko.asia/prolog/kiyaku_Gauss_gyoretsu_ni_henkei.html
%  を参照して下さい。
%