このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/921
#  [1]授業単元:プログラミング 
#  [2]問題文:(1)scanfにより3つの正の整数a,b,cの値を入力する。 
#       (2)(i,j)要素がj+(a-1)*iであるa×b行列を定義する。 
#        (3)(i,j)要素がj-(b-1)*iであるb×c行列を定義する。 
#       (4)2つの行列の積を計算し、結果を表示する。 
#  [3]環境:windows,C++ 
#  [4]期限:5月25日 
#  [5]なし 
#   
#  よろしくおねがいします。 
# 

'(4)2つの行列の積を計算し、結果を表示する' :-
        '3つの正の整数a,b,cの値を入力する'(_a,_b,_c),
        '(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列1),
        '(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列2),
        行列の積(_行列1,_行列2,_行列の積),
        行列の表示(_行列の積).

'3つの正の整数a,b,cの値を入力する'(_a,_b,_c) :-
        get_split_line([' '],[_a,_b,_c]).

'(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列) :-
        findall(L2,(for(1,_i,_a),findall(U,(for(1,_j,_b),U is _j + ( _a - 1 ) * _i),L2)),_行列).

'(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列) :-
        findall(L2,(for(1,_i,_b),findall(U,(for(1,_j,_c),U is _j - ( _b - 1 ) * _i),L2)),_行列).

行列の積(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|R1]|R2],[R1|R3],[A|R4]) :-
        行列の転置(R2,R3,R4).

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

行列の表示([]) :- write(']\n'),!. 
行列の表示([L]) :- write_formatted(' %t]\n',[L]),!. 
行列の表示([L|R]) :- write_formatted(' %t\n',[L]),行列の表示(R),!