このディレクトリの索引
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 
# 
# 

'二つの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型の表形式で出力する' :-
        これらの二つの行列の宣言(A,B),
        'C≡A+B C≡A-Bを算出して'(A,B,C),
        '2×3型の表形式で出力する'(C),
        '2×3型の表形式で出力する'(D).

これらの二つの行列の宣言(A,B) :-
        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を算出して'(A,B,C) :-
        行列の和(A,B,C),
        行列の差(A,B,D).

行列の和([],[],[]).
行列の和([L1|R1],[L2|R2],[L3|R3]) :-
        行の和(L1,L2,L3),
        行列の和(R1,R2,R3).

行の和([],[],[]).
行の和([A|R1],[B|R2],[C|R3]) :-
        分数を含む加算(A,B,C),
        行の和(R1,R2,R3).

行列の差([],[],[]).
行列の差([L1|R1],[L2|R2],[L3|R3]) :-
        行の差(L1,L2,L3),
        行列の差(R1,R2,R3).

行の差([],[],[]).
行の差([A|R1],[B|R2],[C|R3]) :-
        B_1 is B * (-1).
        分数を含む加算(A,B_1,C),
        行の差(R1,R2,R3).

分数を含む加算(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×3型の表形式で出力する'(LL) :-
        'M×Nの表形式で出力する'(2,3,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',_行表示形式).