このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/523
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  入力された2つの行列の積算を行い、結果を示せ。 
#  1.行列の行、列数の入力を求める 
#  2.2つの行列の積算 
#  3.行列として結果を表示 
#  

'2つの行列の積算'(_行列1,_行列2,_行列の積) :-
        行列を入力する(_行列1),
        write('入力された行列は\n'),
        行列の表示(_行列1),
        行列を入力する(_行列2),
        write('入力された行列は\n'),
        行列の表示(_行列2),
        行列の積(_行列1,_行列2,_行列の積),
        write('積行列は\n'),
        行列の表示(_行列の積).

行列を入力する(_行列) :-
        行列の行、列数の入力を求める(_行数,_列数),
        findall(L1,(
                    for(1,N,_行数),
                    length(L1,_列数),
                    write('1行分入力します\n'),
                    行の入力(L1)),
                _行列).

行の入力([]) :- !.
行の入力([_値|R]) :-
        write('値を入力してください : '),
        get_line(Line),
        行の入力診断(Line,_値),
        行の入力(R).
行の入力(L) :- 行の入力(L).

行の入力診断(Line,_値) :-
        atom_to_term(Line,_値,_),
        number(_値),!.
行の入力診断(Line,V) :-
        write_formatted('%tは行列の要素としては適切でありません。再入力が必要です。\n',[Line]),
        fail.

行列の行、列数の入力を求める(_行数,_列数) :-
        行数の入力(_行数),
        列数の入力(_列数),!.

行数の入力(_行数) :-
        write('行数を入力してください : '),
        get_line(Line),
        行数入力の診断(Line,_行数),!.
行数の入力(_行数) :- 行数の入力(_行数).

列数の入力(_列数) :-
        write('列数を入力してください : '),
        get_line(Line),
        列数入力の診断(Line,_列数),!.
列数の入力(_列数) :- 列数の入力(_列数).

行数入力の診断(Line,_行数) :-
        atom_to_term(Line,_行数,_),
        integer(_行数),
        _行数 > 0,!.
行数入力の診断(Line,_行数) :-
        write_formatted('%tは適切な行数ではありません。再入力が必要です。\n',[Line]),
        fail.

列数入力の診断(Line,_列数) :-
        atom_to_term(Line,_列数,_),
        integer(_列数),
        _列数 > 0,!.
列数入力の診断(Line,_列数) :-
        write_formatted('%tは適切な列数ではありません。再入力が必要です。\n',[Line]),
        fail.

行列の積(L1,L2,X) :-
        行列の転置(L2,L4),
        行列の積_1(L1,L4,X).

行列の積_1([],_,[]) :- !.
行列の積_1([A|R1],L,[S1|R3]) :-
        行列の積_2(A,L,S1),
        行列の積_1(R1,L,R3).

行列の積_2(_,[],[]) :- !.
行列の積_2(A,[B|R2],[C|R3]) :-
        行列の積_3(A,B,C),
        行列の積_2(A,R2,R3).

行列の積_3([],[],0) :- !.
行列の積_3([A|R1],[B|R2],S) :-
        S1 is A * B,
        行列の積_3(R1,R2,S2),
        S is S1 + S2.

行列の転置([],[],[]) :- !.
行列の転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        行列の転置(R2,R3,R4).

行列の転置([[]|_],[]) :- !.
行列の転置(L,[L1|R2]) :-
        行列の転置(L,L2,L1),
        行列の転置(L2,R2).

行列の表示([]) :- write(']\n'),!. 
行列の表示([L]) :- write_formatted(' %t]\n',[L]),!. 
行列の表示([L|R]) :- write_formatted(' %t\n',[L]),行列の表示(R),!