09/07/11 04:24:30
>>432
% Prolog
t432 :-
_行列1 = [[1,2,3],[4,5,6],[7,8,9]],
_行列2 = [[3,4,5],[6,7,8],[9,10,11]],
write('行列1:\n'),行列表示(_行列1),
write('行列2:\n'),行列表示(_行列2),
行列の積(_行列1,_行列2,_行列3),
write('行列1と行列2の積は\n'),行列表示(_行列3).
行列表示([]).
行列表示([_行|R]) :- concat_atom(_行,',',[_表示文字列]),write_formatted('%t\n',[_表示文字列]),行列表示(R).
行列の積(L1,L2,X) :- 行列の転置(L2,L3),行列の積の一(L1,L3,X).
行列の積の一([],_,[]) :- !.
行列の積の一([A|R1],L,[S1|R3]) :- 行列の積の二(A,L,S1),行列の積の一(R1,L,R3).
行列の積の二(_,[],[]) :- !.
行列の積の二(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C),行列の積の二(A,R2,R3).
行列の積の三([],[],0) :- !.
行列の積の三([A|R1],[B|R2],S) :- S1 is A * B,行列の積の三(R1,R2,S2),S is S1 + S2 .
行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3) .
行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2),行列の転置(R2,R1),!.