Prologでまったり Part3
■ このスレッドは過去ログ倉庫に格納されています
0657デフォルトの名無しさん
2008/11/27(木) 19:20:50行列演算((+),[],[],[]).
行列演算((+),_行列1,_行列2,X) :- 行列の和(_行列1,_行列2,X).
行列演算((*),_行列1,_行列2,X) :- 行列の積(_行列1,_行列2,X).
行列の和([],[],[]).
行列の和([A|R1],[B|R2],[C|R]) :- 加算(A,B,C),行列の和(R1,R2,R).
行列の積(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 <- A * B,行列の積_3(R1,R2,S2),S <- S1 + S2.
行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3).
行列の転置([[]|_],[]) :- ! .
行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2),行列の転置(R2,R1),!.
'行列?'([[_|_]|_]).
加算([],[],[]) :- !.
加算([A|R1],[B|R2],[C|R]) :- C <- A + B,加算(R1,R2,R).
■ このスレッドは過去ログ倉庫に格納されています