このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1337692704/378
#  課題:http://ime.nu/www.dotup.org/uploda/www.dotup.org3502064.jpg 
#  ファイル名はKadai01.javaとする。 
#  【 形態 】1. Javaアプリケーション(main()で開始)  
#  【 GUI  】制限なし  
#  【 期限 】10月14(日曜日まで)  
#  【 Ver  】javac 1.7.0_07 
# 
#  行列A,Bに対して,和A+B,積ABおよびBAを計算するプログラムを作成し実行しなさい.ただし
#  
#  A =
#  1 2 3
#  4 5 6
#  7 8 9
#  
#  B =
#  1 1 0
#  2 0 1
#  0 2 3
#  
#  とする.
#  

'行列A,Bに対して,和A+B,積ABおよびBAを計算するプログラムを作成し実行しなさい'(_行列A,_行列B,_行列の和,_行列の積AB,_行列の積BA) :-
        '和A+B'(_行列A,_行列B,_行列の和),
        積AB(_行列A,_行列B,_行列の積AB),
        積BA(_行列A,_行列B,_行列の積BA).

'和A+B'([],[],[]).
'和A+B'([L1|R1],[L2|R2],[L3|R3]) :-
        列ごとに加算(L1,L2,L3),
        '和A+B'(R1,R2,R3).

列ごとに加算([],[],[]).
列ごとに加算([A|R1],[B|R2],[C|R3]) :-
        分数を含む加算(A,B,C),
        列ごとに加算(R1,R2,R3).

積AB(_行列A,_行列B,_行列の積AB) :-
        行列の積(_行列A,_行列B,_行列の積AB).

積BA(_行列A,_行列B,_行列の積BA) :-
        行列の積(_行列B,_行列A,_行列の積BA).

行列の積(L1,L2,X) :-
        転置(L2,L4),
        行列の積_1(L1,L4,X).

行列の積_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([A1 / A2|R1],[B1 / B2|R2],S) :-
        S01 is A1 * B1,
        S02 is A2 * B2,
        約分(S01 / S02,S1),
        行列の積_3(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
行列の積_3([A1 / A2|R1],[B|R2],S) :-
        S0 is A1 * B,
        約分(S0 / A2,S1),
        行列の積_3(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
行列の積_3([A|R1],[B1 / B2|R2],S) :-
        S0 is A * B1,
        約分(S0 / B2,S1),
        行列の積_3(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.
行列の積_3([A|R1],[B|R2],S) :-
        S1 is A * B,
        行列の積_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),!.

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

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

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