このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/289
#  [1] 授業単元: プログラム 
#  [2] 問題文(含コード&リンク): 
#    M*R次元の行列(mat1)とR*N次元の行列(mat2)の乗算を行いM*N次元の行列(mat3)を 
#   得る関数(matMul)を作成せよ。ただし、関数のプロトタイプにおいて行列を表す引数部分には、 
#   2つの行列のサイズを表す引数と、行列データそのものを表す引数(2次元配列)を含めること。 
#  

行列の乗算(M*R,LL1,R*N,LL2,M*N,X) :-
        length(LL1,R),
        LL1 = [L1|_],
        length(L1,M),
        length(LL2,N),
        LL2 = [L2|_],
        length(L2,R),
        length(X,N),
        findall(L,(
                    append(_,[L|_],X),
                    length(L,M)),
                X),
        行列の乗算(LL1,LL2,X).

行列の乗算(LL1,LL2,X) :-
        行列の転置(LL2,LL4),
        行列の乗算(LL1,LL4,X).

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

行列の乗算_2(_,[],[]) :- !.
行列の乗算_2(L1,[L2|R2],[L3|R3]) :-
        行列の乗算_3(L1,L2,L3),
        行列の乗算_2(L1,R2,R3).

行列の乗算_3([],[],0) :- !.
行列の乗算_3([N1|R1],[N2|R2],M) :-
        M1 is N1 * N2,
        行列の乗算_3(R1,R2,M2),
        M is M1 + M2.

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

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