このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/386
#  二つの2×3型行列を 
#  A=1.1 -2.2 0.9 
#   -0.2  2.7  0.3 
#   
#  B= 1.8   0.5  1.3 
#     -0.4  0.6   -0.3 
#  と定義する。 
# 
#  これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して 
#  2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 
#  配列とし、関数内の演算を行うこと 
#   
#  上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 
#  形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは 
#  なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で 
#  演算を行うこと。 
#   
#   
#  だれかこのプログラムおしえてくださいm(_ _)m 
# 
# 

'行列A、Bを用いて、積C≡ABt を算出し、2×2型の表形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのではなく、Bより作成すること。'(A,B,C) :-
        転置(B,Bt),
        行列の掛算_1(A,Bt,C),
        '2×2型の表形式で出力せよ'(C).

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

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

行列の掛算_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) :-
        分数を含む掛算(A,B,S1),
        行列の掛算_3(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.

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

約分の二(0,_,0) :- !.
約分の二(0.0,_,0) :- !.
約分の二(_分子,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).

'2×2型の表形式で出力せよ'(LL) :-
        'M×Nの表形式で出力する'(2,2,LL).

'M×Nの表形式で出力する'(M,N,LL) :-
        'N列カンマ区切り行表示形式'(N,_行表示形式),
        nth1(_nth1,LL,L),
        writef(_行表示形式,L),
        _nth1 = M.

'N列カンマ区切り行表示形式'(N,_行表示形式) :-
        findall('%t',between(1,N,_),PL),
        atomic_list_concat(PL,',',S1),
        atom_concat(S1,'\n',_行表示形式).