このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/486
#  [1] 授業単元:C言語演習  
#  [2] 問題文: 1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに 
#  入力された値の合計値を表示するプログラムを作成しなさい。ただし 
#  1〜100以外の数字が入力されたときは”エラー”と表示させる。 

'1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに入力された値の合計値を表示する'(_合計値) :-
    findsum(X,(repeat,get_integer(X),(X=0,!,fail;範囲範囲チェック(X)),_合計値),
    write_formatted('合計は%t\n',[_合計値]).

整数範囲チェック(X):- X > 0,X =< 100.
整数範囲チェック(X):- \+((X >0,X =<100)),write('整数範囲エラー\n'),fail.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% *** user: findsum / 3 ***
findsum(_選択項,_項,_合計値) :-
    findall(_選択項,_項,_値ならび),
    加算(_値ならび,_合計値),!.

% *** user: 加算 / 2 ***
加算([],0) :- !.
加算(X,S) :-
    加算_1(X,0,S) .

% *** user: 加算_1 / 3 ***
加算_1([],S,S) :- !.
加算_1([A|R],Y,S) :-
    Z is A + Y,
    加算_1(R,Z,S).

% *** user: get_integer / 1 ***
get_integer(N) :-
    get_line(Line),
    (
        Line = end_of_file,
        !,
        fail
    ;
        atom_to_term(Line,N,_),
        integer(N)
    ),
    ! .
get_integer(N) :-
    get_integer(N) .

% *** user: get_line / 1 ***
get_line(X) :-
    get_char(C),
    get_line_1(C,Chars),
    atom_chars(X,Chars).

% *** user: get_line_1 / 2 ***
get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[]) :- !.
get_line_1(C,[C|R]) :-
    get_char(C2),
    get_line_1(C2,R) .