このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/124
#  [1] 授業単元:プログラミング演習 1 
#  [2] 問題文(含コード&リンク) 
#  結果が以下のようになるC言語プログラムを作りなさい。 
#  行列A,Bの各要素はscanf関数を使って標準入力から設定すること 
#   
#  Matrix A 
#      5.0    4.0    3.0 
#      4.0    3.0    2.0 
#      3.0    2.0    1.0 
#   
#  Matrix B 
#      1.0    2.0    3.0 
#      2.0    3.0    4.0 
#      3.0    4.0    5.0 
#   
#  Matrix C = A - B 
#      4.0    2.0    0.0 
#      2.0    0.0   -2.0 
#      0.0   -2.0   -4.0 
#   
#  Matrix D = A * B 
#     22.0   34.0   46.0 
#     16.0   25.0   34.0 
#     10.0   16.0   22.0        
#   
#  [3.1] OS: unix  
#  [3.2] コンパイラ名とバージョン: gcc  
#  [3.3] 言語: C  
#  [4] 期限:6月29日  
#  よろしくお願いします。 
 
'MatrixA'([[5.0,4.0,3.0],
            4.0,3.0,2.0],
            3.0,2.0,1.0]]).

'MatrixB'([[1.0,2.0,3.0],
           [2.0,3.0,4.0],
           [3.0,4.0,5.0]]).
   
'Matrix C = A - B' :-
        'MatrixA'(_行列A),
        'MatrixB'(_行列B),
        行列の差(_行列A,_行列B,_行列C),
        行列表示(_行列C).

行列の差([],[],[]) :- ! .
行列の差([A|R1],[B|R2],[C|R3]) :-
        行列の差の一(A,B,C),
        行列の差(R1,R2,R3),!.

行列の差の一([],[],[]) :- !.
行列の差の一([A|R1],[B|R2],[C|R3]) :-
        C is A - B,
        行列の差の一(R1,R2,R3),!.
行列の積(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([A|R1],[B|R2],S) :-
        S1 is A * B,
        行列の積_3(R1,R2,S2),
        S is S1 + S2.

行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :-
        行列の転置(R1,R2,R3).

行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :-
        行列の転置(L,B,R2),
        行列の転置(R2,R1),!.

行列表示(_行列) :-
        append(_,[L|R],_行列),
        append(_,[A|R1],L),
        writef('%8r',[A]),
        R1 = [],
        write('\n'),
        R = [],!.