
:- object(integer,
	extends(number)).


	:- info([
		version is 1.0,
		author is 'Paulo Moura',
		date is 2000/7/24,
		comment is 'Integer data type predicates.']).


	:- public(between/3).

	:- mode(between(+integer, +integer, ?integer), zero_or_more).

	:- info(between/3, [
		comment is 'Returns integers in the interval defined by the two first arguments.',
		argnames is ['Lower', 'Upper', 'Integer']]).


	between(Lower, Upper, Integer) :-
		integer(Lower),
		integer(Upper),
		(var(Integer) ->
			Lower =< Upper,
			generate(Lower, Upper, Integer)
			;
			integer(Integer),
			Lower =< Integer,
			Integer =< Upper).


	generate(Lower, _, Lower).

	generate(Lower, Upper, Integer) :-
		Lower < Upper,
		Next is Lower + 1,
		generate(Next, Upper, Integer).


	valid(Integer) :-
		integer(Integer).


:- end_object.


:- object(integer,
	extends(number)).

	:- info([
		version is 1.1,
		author is 'Paulo Moura',
		date is 2007/4/20,
		comment is 'Integer data type predicates.']).

	:- public(between/3).
	:- mode(between(+integer, +integer, +integer), zero_or_one).
	:- mode(between(+integer, +integer, -integer), zero_or_more).
	:- info(between/3, [
		comment is 'Returns integers in the interval defined by the two first arguments.',
		argnames is ['Lower', 'Upper', 'Integer']]).

	between(Lower, Upper, Integer) :-
		integer(Lower),
		integer(Upper),
		(	var(Integer) ->
			Lower =< Upper,
			generate(Lower, Upper, Integer)
		;	integer(Integer),
			Lower =< Integer,
			Integer =< Upper
		).

	generate(Lower, _, Lower).
	generate(Lower, Upper, Integer) :-
		Lower < Upper,
		Next is Lower + 1,
		generate(Next, Upper, Integer).

	valid(Integer) :-
		integer(Integer).

:- end_object.
