このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1269438098/855
#  [1] 授業単元: プログラム演習  
#  [2] 問題文(含コード&リンク): 2×2行列Aと二次元ベクトルxとの積Axを計算する関数linear_trans()を実装しなさい。ただし、関数linear_trans()は以下のような仕様とする。 
#  void linear_trans(double matA [2][2], double vecx[2], double vecy[2]) 
#  { 
#     /*matA × vecx = vecy を実装*/ 
#  } 
#  

2×2行列Aと二次元ベクトルxとの積Axを計算する(_行列A,_ベクトルx,_積Ax) :-
        ならびを着る(_ベクトルx,L1),
        行列の積(_行列A,L1,_行列A_2),
        ならびを脱ぐ(_行列A_2,_積Ax).

行列の積(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).

ならびを着る([],[]) :- !.
ならびを着る([_項|_残りならび],[[_項]|_残りならびの二]) :-
        ならびを着る(_残りならび,_残りならびの二),!.

ならびを脱ぐ([],[]) :- !.
ならびを脱ぐ([A|R],L) :-
        list(A),!,
        ならびを脱ぐ(A,L1),
        ならびを脱ぐ(R,L2),
        append(L1,L2,L) .
ならびを脱ぐ([A|R],[A|R1]) :-
        ならびを脱ぐ(R,R1) .