このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/398
#  [1] 授業単元:2次元配列の利用  
#  [2] 問題文(含コード&リンク):  
#  5つの要素を持つ、2つの1次元配列A、Bを用意する。 
#  各配列の要素に、値を入力させる(0〜99の整数)。 
#  値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する。 
#  求めた2次元配列を表示する。 
#  例 A0〜A4の5個の値を入力    5 4 3 2 1 
#    5 4 3 2 1      2 10 8 6 4 2 
#    B0〜B4の5個の値を入力  2 10 8 6 4 2 
#    2 2 0 1 1      0  0 0 0 0 0 
#                 1   5  4  3  2  1 
#                               1   5  4  3  2  1 
#  

'5つの要素を持つ、2つの1次元配列A、Bを用意する。各配列の要素に、値を入力させる(0〜99の整数)。値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する。求めた2次元配列を表示する' :-
        '5つの要素を持つ、2つの1次元配列A、Bを用意する'(_A,_B),
        '各配列の要素に、値を入力させる(0〜99の整数)'(_A,_B),
        '値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する'(_B,_A,LL),
        第一引数と第二引数の順序が反転したことに注意,
        求めた2次元配列を表示する(_B,_A,LL).

'5つの要素を持つ、2つの1次元配列A、Bを用意する'(_A,_B) :-
        length(_A,5),
        length(_B,5).

'各配列の要素に、値を入力させる(0〜99の整数)'(_A,_B) :-
        findall(M1,(
                    append(_,[M1|_],_A),
                    M is random(100)),
                _A),
        findall(M2,(
                    append(_,[M2|_],_B),
                    M is random(100)),
                _B),!.

'値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する'([],_,[]).
'値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する'([N|R1],L2,[L|R3]) :-
        findall(M,(
                    append(_,[M1|_],L2),
                    M is N * M1),
                L),
        '値が入力された各配列の要素を掛け合わせた結果を5×5の2次元配列に格納する'(R1,L2,R3).

'求めた2次元配列を表示する'(_B,_A,LL) :-
         一行目表示(_A),
         二行目以降表示(_B,LL).

一行目表示(_A) :-         
         write('   '),
         append(_,[N|R],_A),
         writef('%4r ',[N]),
         R = [N2],
         writef('%4r\n',[N2]),!.

二行目以降表示([],[]).
二行目以降表示([N1|R1],[L|R2]) :-
        writef('%2r ',[N1]),
        append(_,[N|R],L),
        writef('%4r ',[N]),
        R = [N2],
        writef('%4r\n',[N2]),
        二行目以降表示(R1,R2).

第一引数と第二引数の順序が反転したことに注意.