このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289913298/698
#  [1] 授業単元:コンピュータ基礎  
#  [2] 問題文(含コード&リンク):  
#  キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。 
#  ただし、総和を求める部分はmain関数と別の関数を作ること。(たとえばN=3とする) 
#  (注)2次元配列の入力には注意が必要。 
#  scanf("%if",&x); 
#  a[i][j] =x; 
#  のように2段構えの入力が必要になる場合もある。 
#   
#  

'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(N,_総和) :-
        'N×Nの枠を得る'(LL),
        各要素に値を入力する(LL),
        総和を求める(LL,_総和),!.

'N×Nの枠を得る'(LL) :-
        length(LL,N),
        findall(L,(
                    append(_,[L|_],LL),
                    length(L,N)),
                LL),!.

各要素に値を入力する(LL) :-
        findall(L,(
                    append(L0,[L|_],LL),
                    length(L0,N0),
                    _行 is N0 + 1,
                    行データを得る(L)),
                LL),!.

行データを得る(L) :-
        findall(_実数,(
                    append(L01,[_実数|_],L),
                    length(L01,N01),
                    _列 is N01 + 1,
                    実数を得る(_行,_列,_実数)),
                L).

実数を得る(_行,_列,_実数) :-
        writef('%t行,%t列の実数を入力してください : ',[_行,_列]),
        get_line(Line),
        実数入力診断(Line,_実数),!.
実数を得る(_行,_列,_実数) :- 実数を得る(_行,_列,_実数).

実数入力診断(Line,_実数) :-
        atom_to_term(Line,_実数,_),
        float(_実数),!.
実数入力診断(Line,_実数) :-
        writef('入力された %t からは実数値を得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

総和を求める(L,_総和) :-
        findsum(Sum,(
                        append(_,[L1|_],L),
                        sum(L1,Sum)),
                _総和),!.


%  この例のように
%  行列の枠組みの生成から始まる課題では findall/3 を重ねて使用すればよい。
%  Prologとはappend/3とfindall/3で書くものだ。