このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/562
#  以下のような行列の積を求めるプログラムを作成して下さい 
#   
#  行列xを表示 
#  1 2 
#  3 4 
#  5 6 
#   
#  行列yを表示 
#  1 2 4 
#  3 6 9 
#   
#  行列xとyの積を表示 
#   
#   
#  ^^^^^^^^^^^^^^^^^^^^^^^ 
#  行列xとyの積を表示の下には計算結果を表示するようなプログラムを教えて下さい 
#  お願いします 
# 

行列の積(L1,L2,X) :-
        転置(L2,L4),
        二つの行列の要素の全ての行と行の組合せに対して要素を乗算した上で合計した値による行列を作る(L1,L4,X).

二つの行列の要素の全ての行と行の組合せに対して要素を乗算した上で合計した値による行列を作る([],_,[]) :- !.
二つの行列の要素の全ての行と行の組合せに対して要素を乗算した上で合計した値による行列を作る([_行_1|R1],_行列_2,[_合計ならび|R3]) :-
        二つのならびの要素を順に乗算した値の合計のならび(_行_1,_行列_2,_合計ならび),
        二つの行列の要素の全ての行と行の組合せに対して要素を乗算した上で合計した値による行列を作る(R1,_行列_2,R3).

二つのならびの要素を順に乗算した値の合計のならび(_,[],[]) :- !.
二つのならびの要素を順に乗算した値の合計のならび(L1,[L2|R2],[_合計値|R3]) :-
        二つのならびの要素を順に乗算した値の合計を取る(L1,L2,_合計値),
        二つのならびの要素を順に乗算した値の合計のならび(L1,R2,R3).

二つのならびの要素を順に乗算した値の合計を取る([],[],0) :- !.
二つのならびの要素を順に乗算した値の合計を取る([A1 / A2|R1],[B1 / B2|R2],S) :-
        S01 is A1 * B1,
        S02 is A2 * B2,
        約分(S01 / S02,S1),
        二つのならびの要素を順に乗算した値の合計を取る(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
二つのならびの要素を順に乗算した値の合計を取る([A1 / A2|R1],[B|R2],S) :-
        S0 is A1 * B,
        約分(S0 / A2,S1),
        二つのならびの要素を順に乗算した値の合計を取る(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
二つのならびの要素を順に乗算した値の合計を取る([A|R1],[B1 / B2|R2],S) :-
        S0 is A * B1,
        約分(S0 / B2,S1),
        二つのならびの要素を順に乗算した値の合計を取る(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
二つのならびの要素を順に乗算した値の合計を取る([A|R1],[B|R2],S) :-
        S1 is A * B,
        二つのならびの要素を順に乗算した値の合計を取る(R1,R2,S2),
        分数を含む加算(S1,S2,S).

分数を含む加算(A1 / A2,B1 / B2,C) :-
        S1 is A1 * B2 + A2 * B1,
        S2 is A2 * B2,
        約分(S1 / S2,C),!.
分数を含む加算(A1 / A2,B,C) :-
        S1 is A1 + A2 * B,
        約分(S1 / A2,C),!.
分数を含む加算(A,B1 / B2,C) :-
        S1 is B1 + B2 * A,
        約分(S1 / B2,C),!.
分数を含む加算(A,B,C) :-
        C is A + B.

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

約分(B / A,X) :-
        最大公約数(B,A,C),
        _分子 is B // C,
        _分母 is A // C,
        約分の二(_分子,_分母,X),!.

約分の二(_分子,1,_分子) :- !.
約分の二(_分子,1.0,_分子) :- !.
約分の二(_分子,_分母,_分子 / _分母).

最大公約数(M,N,X) :-
        最大公約数をユークリッドの互除法で求める(M,N,X),!.

最大公約数をユークリッドの互除法で求める(M,N,N) :-
        0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
        Mod is M mod N,
        最大公約数をユークリッドの互除法で求める(N,Mod,X).