largestInt(X) :- X is 10^32.

num(raw,X,X).
num(rounded,X,Y) :-  Y is round(X).

intp(X)    :-  largestInt(Max),    within(-1*Max,Max,roundedNum,X).
posintp(X) :-  largestInt(Max),   within(0,Max,roundedNum,X).
agep(X)    :-  within(0,120,X).

within(Min,Max,Filter,X) :- 
	var(X) -> within0(Min,Max,Filter,X) ; within1(Min,Max,X).

within1(Min,Max,X) :- number(X), X >= Min, X =< Max. 
within0(Min,Max,Filter,X) :- 
	largestInt(M),
	X0 is Min + random(M)/M*(Max - Min),
	call(Filter,X0,X).
