このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/681
#  [1] 授業単元:計算機プログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec5kadai0.html 
#  
#  
#  以下のテンプレートを用いて,N×N行列AとBをキーボードから入力し,
#  行列A,行列B,及び行列AとBの積C=ABを出力するプログラムを完成せよ。

'N×N行列AとBをキーボードから入力し,行列A,行列B,及び行列AとBの積C=ABを出力する' :-
        'N×N行列AとBをキーボードから入力し'(_N,_A,_B),
        '行列A,行列B,及び行列AとBの積C=ABを出力する'(_A,_B).

'N×N行列AとBをキーボードから入力し'(_N,_A,_B) :-
        'N×N行列Aを入力する'(_N,_A),
        'N×N行列Bを入力する'(_N,_B).

'N×N行列Aを入力する'(_N,_A) :-
        正方行列を入力する(_N,A).

'N×N行列Bを入力する'(_N,_B) :-
        正方行列を入力する(_N,B).

正方行列の入力(_N,_A) :-
        length(_A,_N),
        findall(_行,(
                    append(L0,[_行|_],_A),
                    length([_|L0],_行目),
                    正方行要素の入力(_行目,_N,_行)),
                _A).

正方行要素の入力(_行目,_N,_行) :-
        length(_行,_N),
        findall(_要素,(
                    append(L0,[_|_],_行),
                    length([_|L0],_要素目),
                    要素入力(_行目,_要素目,_要素)),
               _行).

要素入力(_行目,_要素目,_要素) :-
        writef('第%t行%t列 : ',[_行目,_要素目]),
        get_line(Line),
        要素入力診断(Line,_要素),!.
要素入力(_行目,_要素目,_列) :-
        要素入力(_行目,_要素目,_列).

要素入力診断(Line,_要素) :-
        atom_to_term(Line,_要素,_),
        number(_要素),!.
要素入力診断(Line,_要素) :-
        atom_to_term(Line,A/B,
        number(_要素),!.

'行列A,行列B,及び行列AとBの積C=ABを出力する'(_A,_B) :-
        '行列Aを出力する'(_A),
        '行列Bを出力する'(_B),
        '行列AとBの積C=ABを出力する'(_A,_B).

'行列Aを出力する'(_A) :-
        行列を出力する(_A).

'行列Bを出力する'(_B) :-
        行列を出力する(_B).

'行列AとBの積C=ABを出力する'(_A,_B) :-
        '行列AとBの積C=ABを'(_A,_B,_C),
        '行列Cを出力する'(_C).

'行列Cを出力する'(_C) :-
        行列を出力する(_C).

行列を出力する(_行列) :-
        append(_,[_行|R],_行列),
        writef('%t\n',[_行]),
        R = [].

'行列AとBの積C=ABを'(_A,_B,_C) :-
        行列の掛算(_A,_B,_C).

行列の掛算/3