このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/216
#  [1] 授業単元:C言語基礎実習  
#  [2] 問題文(含コード&リンク):0未満の数が入力されるまで  
#  入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。  
#  なお、0未満の数は回数と最大値、最小値に含めないものとする。 
#  また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。  
#  
# [5] その他の制限:最大値、最小値についてはそれぞれ関数を作って作成すること
# 
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。なお、0未満の数は回数と最大値、最小値に含めないものとする。また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。' :-
        数の入力(N),
        N >= 0,
        '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数,_入力された数ならび),
        _入力された数ならび = [A|R]),
        最大値(R,A,_最大値),
        最小値(R,A,_最小値),
        write_formatted('入力された回数は %t,最大値は %t,最小値は %tです\n',[_回数,_最大値,_最小値]),!.
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の最大値と最小値を表示するプログラムを作成しなさい。なお、0未満の数は回数と最大値、最小値に含めないものとする。また、0未満の値の入力だけで終わった場合は最大値、最小値は表示しない。' .

'0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数,_回数,[]) :-
        N < 0,!.
'0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N,_回数1,_回数,[N|R]) :-
        N >= 0,
        _回数2 is _回数1 + 1,
        数の入力(N2),
        '0未満の数が入力されるまで入力を求め、その入力した回数を得る'(N2,_回数2,_回数,R).

最大値([],_最大値,_最大値) :- !.
最大値([N|R],_最大値1,_最大値) :-
        N > _最大値1,
        最大値(R,N,_最大値).
最大値([N|R],_最大値1,_最大値) :-
        N =< _最大値1,
        最大値(R,_最大値1,_最大値).

最小値([],_最小値,_最小値) :- !.
最小値([N|R],_最小値1,_最小値) :-
        N < _最小値1,
        最小値(R,N,_最小値).
最小値([N|R],_最小値1,_最小値) :-
        N >= _最小値1,
        最小値(R,_最小値1,_最小値).

数の入力(N) :-
        write_formatted('数を入力してください(0未満を入力すると終了となります) : '),
        get_line(Line),
        数入力の診断(Line,N),!.
数の入力(N) :-
        write_formatted('入力された %t から適切な数を得られませんでした。再入力をお願いします\n',[Line]),
        fail.

数入力の診断(Line,N) :-
        atom_to_term(Line,N,_),
        number(N),!.