このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/306
#  [1] 授業単元:C 
#  [2] n個の数の総和 
#  n個の数の総和を求める。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する。
#  

総和の限界(1000).

'n個の数の総和を求め表示する。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する' :-
        'n個の数'(_n,L),
        総和の限界(_総和の限界),
        総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和),
        総和を表示する(_加算対象数値ならび,_総和,_総和の限界).

'n個の数'(_n,L) :-
        length(L,_n),
        findall(N,(
                    m個目の数(L,N)),
                L).

m個目の数(L,N) :-
        append(L0,[N|_],L),
        length([_|L0],_m個目),
        swritef(_催促,'%t/%t個目の数字 : ',[_m個目,_n]),
        催促付き整数入力(_催促,N).

催促付き整数入力(_催促,N) :-
        writef('%t : ',[_催促]),
        get_line(Line),
        整数入力検査(Line,N),!.
催促付き整数入力(_催促,N) :-
        get_integer(_催促,N).

整数入力検査(Line,N) :-
        atom_to_term(Line,N,_),
        integer(N),!.
整数入力検査(Line,N) :-
        writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和) :-
        '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,0,_総和).

'総和を求める。総和が限界数を超えた時には計算を打ち切る'([],_総和の限界,[],_総和,_総和).
'総和を求める。総和が限界数を超えた時には計算を打ち切る'(_,_総和の限界,[],_総和,_総和) :-
        _総和 > _総和の限界,!.
'総和を求める。総和が限界数を超えた時には計算を打ち切る'([N|R1],_総和の限界,[N|R2],_総和1,_総和) :-
        _総和2 is _総和1 + N,
        '総和を求める。総和が限界数を超えた時には計算を打ち切る'(R1,_総和の限界,R2,_総和2,_総和).

総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :-
        _総和 > _総和の限界,
        concat_atom(_加算対象数値ならび,'+',_加算対象項文字列),
        writef('(総和の限界=%t) %t=%t\n',[_総和の限界,_加算対象項文字列,_総和]),!.
総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :-
        concat_atom(_加算対象数値ならび,'+',_加算対象項文字列),
        writef('%t=%t\n',[_加算対象項文字列_総和]),!.