このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/78
#  [1] 授業単元:C言語 
#  [2] 問題 http://ime.nu/codepad.org/yV0KrZox 
#  
#  問題2
#  以下2つの3行3列の行列の和を求め、表示するプログラムを、配列を用いて作成しなさい。
#  ----------------------------------------------------------------------
#  A =
#  8 6 9
#  1 5 2
#  2 5 5
#  B =
#  3 2 3
#  8 6 7
#  2 5 1
#  A + B =
#  11 8 12
#  9 11 9
#  4 10 6
#  ---------------------------------------------------------------------

'2つの3行3列の行列の和を求め、表示する'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :-
        '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]),
        表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]).


'2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :-
        _C_1_1 is _A_1_1 + _B_1_1,
        _C_1_2 is _A_1_2 + _B_1_2,
        _C_1_3 is _A_1_3 + _B_1_3,
        _C_2_1 is _A_2_1 + _B_2_1,
        _C_2_2 is _A_2_2 + _B_2_2,
        _C_2_3 is _A_2_3 + _B_2_3,
        _C_3_1 is _A_3_1 + _B_3_1,
        _C_3_2 is _A_3_2 + _B_3_2,
        _C_3_3 is _A_3_3 + _B_3_3.

表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]])  :-

        'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]),
        'B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]),
        'A+B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]).


'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]) :-
        write('A =\n'),
        append(_,[[_A_1,_A_2,_A_3]|R],[[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]),
        atomic_list_concat([_A_1,_A_2,_A_3],' ',S),
        writef('%t\n',[S]),
        R = [].

'B行列の表示'([[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]) :-
        write('B =\n'),
        append(_,[[_B_1,_B_2,_B_3]|R],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]),
        atomic_list_concat([_B_1,_B_2,_B_3],' ',S),
        writef('%t\n',[S]),
        R = [].

'A+B行列の表示'([[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :-
        write('A + B  =\n'),
        append(_,[[_C_1,_C_2,_C_3]|R],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]),
        atomic_list_concat([_C_1,_C_2,_C_3],' ',S),
        writef('%t\n',[S]),
        R = [].



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'2つの3行3列の行列の和を求め、表示する'(_A,_B,_行列の和) :-
        すべての同一位置の要素の和を求める(_A,_B,_行列の和),
        表示する([['A',_A],['B',_B],['A + B',_行列の和]]).

すべての同一位置の要素の和を求める(_A,_B,_行列の和) :-
        findall(_同一列の和ならび,(
                    nth1(_nth1,_A,_行_A),
                    nth1(_nth1,_B,_行_B),
                    同一列の和を求める(_行_A,_行_B,_同一列の和ならび)),
                _行列の和).

同一列の和を求める(_行_A,_行_B,_同一列の和ならび) :-
        findall(_列の和,(
                    nth1(_nth1,_行_A,_列の値_1),
                    nth1(_nth1,_行_B,_列の値_2),
                    _列の和 is _列の値_1 + _列の値_2),
                _同一列の和ならび).

表示する(LL) :-
        append(_,[_行列のシンボル,_行列]|R],LL),
        writef('%t =\n',[_行列のシンボル]),
        行列の表示(_行列),
        R = [].

行列の表示(_行列) :-
        append(_,[[_行_1,_行_2,_行_3]|R_1],_行列),
        atomic_list_concat([_行_1,_行_2,_行_3],' ',_行表示),
        writef('%t\n,[_行表示]),
        R = [],!.