このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/785
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  2*2行列 X の逆行列を計算し、出力するプログラムを作れ 
#  (公式を使って構わない) 
#   
#  ただし、行列 X の要素は全て浮動小数点型であるとする 
#  要素の値は標準入力で与える 
#   
#  ヒント 
#  逆行列が定義できないときはエラーを出力して終わる 
#   

'2*2行列Xの逆行列を計算し、出力する' :-
        行列の入力([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]),
        '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]),
        逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]),!.

'2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :-
        '2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値),
        '2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]).

'2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0.0,[[Y11,Y12],[Y21,Y22]]) :-
        write('逆行列は作れません\n'),!,fail.
'2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],0,[[Y11,Y12],[Y21,Y22]]) :-
        write('逆行列は作れません\n'),!,fail.
'2×2行列の逆行列の計算'([[X11,X12],[X21,X22]],_行列式の値,[[Y11,Y12],[Y21,Y22]]) :-
        Y11 is X22 / _行列式の値,
        Y12 is ((-1) * X12) / _行列式の値,
        Y21 is ((-1) * X21) / _行列式の値,
        Y22 is X11 / _行列式の値.

'2×2行列の行列式の計算'([[X11,X12],[X21,X22]],_行列式の値) :-
        _行列式の値 is X11 * X22 - X12 * X21.

行列の入力(LL) :-
        length(LL,2),
        findall(L1,
                    append(L0,[L1|_],LL),
                    length([_|L0],Nth),
                    write_formatted('行列の%t行目をカンマ区切りで2列入力してください\n',[Nth]),
                    カンマ区切りによる二項入力(L1)),
                LL).

カンマ区切りによる二項入力(L) :-
        get_line(Line),
        カンマ区切りによる二項入力診断(Line,L),!.
カンマ区切りによる二項入力(L) :- カンマ区切りによる二項入力(L).

カンマ区切りによる二項入力診断(Line,L) :-
        split(Line,[','],L),
        length(L,2),
        すべて数値(L),!.
カンマ区切りによる二項入力診断(Line,L) :-
        write('入力された%tからは二項を取り出すことができません。再入力をお願いします。\n'),
        fail.

すべて数値([]) :- !.
すべて数値([V|R]) :- number(V),すべて数値(R).

逆行列表示([[X11,X12],[X21,X22]],[[Y11,Y12],[Y21,Y22]]) :-
        行列表示([[X11,X12],[X21,X22]]),
        write('の逆行列は\n'),
        行列表示([[Y11,Y12],[Y21,Y22]]).