このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/477
#  [1] 授業単元:C言語 
#  [2] 問題文:3*3の逆行列Aをもとめよ 
#  http://ime.nu/ideone.com/erZBk 
#  

'3*3の逆行列Aをもとめよ'(_a,_逆行列A) :-
        var(_a),
        '3行3列の行列aを入力'(_a),
        逆行列(_a,_逆行列A).
'3*3の逆行列Aをもとめよ'(_a,_逆行列A) :-
        \+(var(_a)),
        逆行列(_a,_逆行列A).

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

行列に単位行列を結合して(_行列,_行列の二) :-
        length(_行列,N),
        単位行列(N,L),
        行列の結合(_行列,L,_行列の二).

行列の結合(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,N,[]) :-
        M > N.
変数正方行列(M,N,[L|R]) :-
        length(L,N),
        M2 is M + 1,
        変数正方行列(M2,N,R).

'3行3列の行列aを入力'(_a) :-
        length(_a,3),
        findall(L,(
                    append(L0,[L|_],_a),
                    length(L,3),
                    length(L0,_行位置),
                    '3列入力する'(_行位置,1,L)),
               _a).

'3列入力する'(_,_,[]).
'3列入力する'(_行位置,_列位置,[V|R]) :-
        writef('列入力[_行位置][_列位置] : '),
        get_line(Line),
        atom_to_term(Line,V,_),
        _列位置_2 is _列位置 + 1,
        '3列入力する'(_行位置,_列位置_2,R).