このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/881
#  【2】 
#   
#   
#  2次元配列の問題です 
#  m行n列の配列aの 
#  各行ごとの合計 gyouwa[i] i=0,1,・・・,m 
#  各列ごとの合計 retuwa[j] j=0,1,・・・,n 
#  を計算するプログラムの作成をお願いします 
#   
#  •行列サイズ m,n は実行時に 100以内であれば自由に設定してデータを再入力させる機能をつける  
#  ◦配列サイズの上限はプログラム中で配列を宣言するとき「100 個」として下さい。これは,プログラム中で大き目の配列を宣言しておいて,指定されたサイズに応じて必要分を使うための練習です。  
#   
#  【3】c言語 
#  【4】10月30日まで 
# 
# 


'm行n列の配列aの各行ごとの合計 gyouwa[i] i=0,1,・・・,m各列ごとの合計 retuwa[j] j=0,1,・・・,nを計算する'(LL,_行の和ならび,_列の和ならび) :-
        行の和ならびを求める(LL,_行の和ならび),
        列の和ならびを求める(LL,_列の和ならび).

行の和ならびを求める(LL,_行の和ならび) :-
        findall(_行の和,(
                    append(_,[L|_],LL),
                    sum(L,_行の和)),
                _行の和ならび).

列の和ならびを求める(LL,_列の和ならび) :-
        転置(LL,LL2),
        行の和ならびを求める(LL2,_列の和ならび).



'指定したサイズの行列にキーボードから入力して、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :-
        '指定したサイズの行列にキーボードから入力して'(_行列),
        行の和ならびを求める(_行列,_行の和ならび),
        列の和ならびを求める(_行列,_列の和ならび).

'指定したサイズの行列にキーボードから入力して'(_行列) :-
        指定したサイズの(_行数,_列数),
        行列にキーボードから入力して(_行数,_列数,_行列).


'指定したサイズの行列に乱数を使って値を埋め、各行ごとの合計と各列ごとの合計を求める'(_行列,_行の和ならび,_列の和ならび) :-
        '指定したサイズの行列に乱数を使って値を埋め'(_行列),
        行の和ならびを求める(_行列,_行の和ならび),
        列の和ならびを求める(_行列,_列の和ならび).

'指定したサイズの行列に乱数を使って値を埋め'(_行列) :-
        指定したサイズの(_行数,_列数),
        行列に乱数を使って値を埋め(_行数,_列数,_行列).


指定したサイズの(_行数,_列数) :-
        行数の入力(_行数),
        列数の入力(_列数).

行数の入力(_行数) :-
        write('行数を入力してください : '),
        get_line(Line),
        行数の入力診断(Line,_行数),!.
行数の入力(_行数) :-
        行数の入力(_行数).

行数の入力診断(Line,_行数) :-
        atom_to_term(Line,_行数,_),
        integer(_行数),
        _行数 >= 1,
        _行数 =< 100,!.
行数の入力診断(Line,_行数) :-
        write('入力された%tからは適切な行数が得られません。再入力をお願いします。\n',[Line]),
        fail.

列数の入力(_列数) :-
        write('列数を入力してください : '),
        get_line(Line),
        列数の入力診断(Line,_列数),!.
列数の入力(_列数) :-
        列数の入力(_列数).

列数の入力診断(Line,_列数) :-
        atom_to_term(Line,_列数,_),
        integer(_列数),
        _列数 >= 1,
        _列数 =< 100,!.
列数の入力診断(Line,_列数) :-
        write('入力された%tからは適切な列が得られません。再入力をお願いします。\n',[Line]),
        fail.

行列にキーボードから入力して(_行数,_列数,_行列) :-
        length(_行列,_行数),
        findall(_行,(
                   append(L01,[_行|_],_行列),
                   行の値をキーボードから入力する(_行,L01,_列数)),
                _行列).

行の値をキーボードから入力する(_行,L01,_列数) :-
        length(_行,_列数),
        findall(_列の値,(
                   append(L02,[_|_],_行),
                   行列要素の値の入力(L01,L02,_列の値)),
                _行).

行列要素の値の入力(L01,L02,_列の値) :-
        行列要素の位置を求める(L01,L02,M行,N列),
        writef('%t行%t列の値 : ',[M行,N列]),
        get_integer(_列の値).

行列要素の位置を求める(L01,L02,M行,N列) :-
        length([_|L01],M行),
        length([_|L02],N列).

行列に乱数を使って値を埋め(_行数,_列数,_行列) :-
        length(_行列,_行数),
        findall(_行,(
                   append(_,[_行|_],_行列),
                   行を乱数値で埋める(_行,_列数)),
                _行列).

行を乱数値で埋める(_行,_列数) :-
        length(_行,_列数),
        findall(_列の値,(
                   append(_,[_|_],_行),
                   '-100~100の範囲の値を入力'(_列の値)),
                _行).

'-100~100の範囲の値を入力'(_列の値) :-
        _列の値 is (random(200)+1) - 100).


%  
%  行列の転置述語は 転置/2 は http://nojiriko.asia/prolog/gyoretsu_no_tenchi.html
%