:- object(numberlist,
	implements(numberlistp),
	extends(list)).


	:- info([
		version is 1.0,
		authors is 'Paulo Moura',
		date is 2000/7/24,
		comment is 'List of numbers predicates.']).


	average([], 0).

	average([N| Ns], Average) :-
		average([N| Ns], 0, 0, Average).


	average([], Length, Sum, Average) :-
		Average is Sum / Length.

	average([N| Ns], Lacc, Sacc, Average) :-
		Lacc2 is Lacc + 1,
		Sacc2 is Sacc + N,
		average(Ns, Lacc2, Sacc2, Average).


	min([N| Ns], Min) :-
		min(Ns, N, Min).

	min([], Min, Min).

	min([N| Ns], Aux, Min) :-
		N < Aux ->
			min(Ns, N, Min)
			;
			min(Ns, Aux, Min).


	max([N| Ns], Max) :-
		max(Ns, N, Max).

	max([], Max, Max).

	max([N| Ns], Aux, Max) :-
		N > Aux ->
			max(Ns, N, Max)
			;
			max(Ns, Aux, Max).


	sum(List, Sum) :-
		sum(List, 0, Sum).


	sum([], Sum, Sum).

	sum([N| Ns], Acc, Sum) :-
		Acc2 is Acc + N,
		sum(Ns, Acc2, Sum).


	valid(List) :-
		nonvar(List),
		\+ \+ valid2(List).


	valid2([]).

	valid2([Head| Tail]) :-
		number(Head),
		valid2(Tail).


:- end_object.