このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/212
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文: 
#  3行3列の実数行列A=[a_ij]とB[b_ij]の積ABを計算せよ。  
#  ただし、乗算結果の行列を[c_ij]として次の計算を行うものとする。 
#  行列の要素への入力は、代入文あるいは初期化子をもちいること。 
#  c_ij=Σa_ik×b_kj (Σはk=0で、2までです) 
# 

行列の掛け算(_行列a,_行列b,_行列c) :-
    findall(L1,(for(1,N,3),length(L1,3)),_行列c),
    findall(W,重複順列([1,2,3],2,W),_重複順列),
    行列の掛け算(_重複順列,_行列a,_行列b,_行列c),!.

行列の掛け算([],_,_,_) :- !.
行列の掛け算([[I,J]|R1],_行列a,_行列b,_行列c) :-
    findsum(U,(   for(1,K,3),
                  行列要素(_行列a,I,K,N1),
                  行列要素(_行列b,K,J,N2),
                  U is N1 * N2),S),
    行列要素(_行列c,I,J,S),
    行列の掛け算(R1,_行列a,_行列b,_行列c).
  
行列要素(_行列,_行,_列,_値) :-
    list_nth(_行,_行列,_行の値ならび),
    list_nth(_列,_行の値ならび,_値). 

重複順列(L,N,X) :- length(X,N),重複順列(L,X).
重複順列(L,[]).
重複順列(L,[A|R]) :- member(A,L),重複順列(L,R).