このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/733
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  2 行2 列の行列a(int 型の2 次元配列とする)の行 
#  列式を計算する関数int determinant(int a[2][2]) 
#  を作成せよ.以下の実行例のように,2 行2 列行列の各 
#  要素を入力すると,determinant 関数を用いて行列式 
#  の値を表示し,行列式が0 でない場合には逆行列(要素 
#  は実数)を表示するプログラムを作成せよ. 
#  

'2行2列行列の各要素を入力すると,行列式の値を表示し,行列式が0 でない場合には逆行列(要素は実数)を表示する' :-
        '2行2列行列の各要素を入力すると'(_2行2列の行列),
        行列式の値を表示し(_2行2列の行列,_行列式の値),
        '行列式が0 でない場合には逆行列(要素は実数)を表示する'(_行列式の値,_2行2列の行列).

'2行2列行列の各要素を入力すると'(_2行2列の行列) :-
        length(_2行2列の行列,2),
        findall(L,(
                    append(_,[L|_],_2行2列の行列),
                    length(L,2),
                    行要素の入力(L)),
                _2行2列の行列),

行要素の入力(L) :-
        write('行要素(2列)をカンマ区切りで入力してください : '),
        readln(L),!.
行要素の入力(L) :- 行要素の入力(L).

行列式の値を表示し(_2行2列の行列,_行列式の値) :-
        '2行2列の行列式の値を求める'(_2行2列の行列,_行列式の値),
        writef('行列式の値は%tです\n',[_行列式の値]).

'行列式が0 でない場合には逆行列(要素は実数)を表示する'(_行列式の値,_2行2列の行列) :-
        '2行2列の逆行列を求める'([[_値_1,_値_2],[_値_3,_値_4]],_2行2列の逆行列),
        逆行列を表示する(_2行2列の行列,_2行2列の逆行列),!.
'行列式が0 でない場合には逆行列(要素は実数)を表示する'(_行列式の値,_2行2列の行列).

'2行2列の行列式の値を求める'([[_値_1,_値_2],[_値_3,_値_4]],_行列式の値) :-
        _行列式の値 is _値_1 * _値_4 - _値_2 * _値_3.

'2行2列の逆行列を求める'([[_値_1,_値_2],[_値_3,_値_4]],_2行2列の逆行列) :-
        '2 行2 列の行列式の値を求める'([[_値_1,_値_2],[_値_3,_値_4]],_行列式の値),
        逆行列要素の割り出し(_行列式の値,_値_1,_値_1_2),
        逆行列要素の割り出し(_行列式の値,_値_2,_値_2_2),
        逆行列要素の割り出し(_行列式の値,_値_3,_値_3_2),
        逆行列要素の割り出し(_行列式の値,_値_4,_値_4_2),!.

逆行列要素の割り出し(0,_,_) :- !,fail.
逆行列要素の割り出し(0.0,_,_) :- !,fail.
逆行列要素の割り出し(0 / _,_,_) :- !,fail.
逆行列要素の割り出し(0.0 / _,_,_) :- !,fail.
逆行列要素の割り出し(_行列式の値,_値,_値_2) :-
        _値_2 is 1 / _行列式の値 * _値,!.

逆行列を表示する(_2行2列の行列,_2行2列の逆行列) :-
        write('行列\n'),
        '2行2列の行列を表示する'(_2行2列の行列),
        write('の逆行列は\n'),
        '2行2列の行列を表示する'(_2行2列の逆行列),
        write('です\n').

'2行2列の行列を表示する'([[_値_1,_値_2],[_値_3,_値_4]]) :-
        writef('[[%t,%t]\n',[_値_1,_値_2]),
        writef(' [%t,%t]]\n',[_値_3,_値_4]).