このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/421
#  [1] 授業単元:C言語 
#  [2] 問題文:ガウスの消去法を使ってn元連立方程式を解け 
#  http://ime.nu/ideone.com/2GwBp 
#  

ガウスの消去法を使ってn元連立方程式を解け(_n元,_解ならび) :-
        拡大係数行列を得る(_n元,_拡大係数行列),
        既約ガウス行列に変形(_拡大係数行列,_既約ガウス行列),
        最終列を取り出す(_既約ガウス行列,_解ならび).

拡大係数行列を得る(_n元,_拡大係数行列) :-
        M is _n元 + 1,
        length(_拡大係数行列,_n元),
        findall(_行,(
                    append(Ln,[_行|R],_拡大係数行列),
                    length(_行,M),
                    length([_|Ln],_何行目),
                    係数の入力(_何行目,1,_n元,_行)),
                _拡大係数行列).

係数の入力(_何行目,1,_n元,_行) :-
        writef('%t行目 : ',[_何行目]),
        findall(_係数,(
                    for(1,N,_n元),
                    writef('A * X[%t] : ',[N]),
                    数を得る(_係数)),
                _係数ならび),
        write(' = A :'),
        数を得る(_最後の係数),
        append(_係数ならび,[_最後の係数],_行),!.
                    
最終列を取り出す(_行列,_最終列) :-
        転置(_行列,_最終列),
        append(_,[_最終列],_転置された行列).

数を得る(_数) :-
        get_line(Line),
        数を得る診断(Line,_数),!.
数を得る(_数) :-
        数を得る(_数).

数を得る診断(Line,_数) :-
        atom_to_term(Line,_数,_),
        数の形式検査(_数),!.
数を得る診断(Line,_数) :-
        writef('入力された %t からは適切な係数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

数の形式検査(_数) :-
        number(_数),!.
数の形式検査(_数1 / _数2) :-
        number(_数1),
        number(_数2).