`nb_setarg` used to get the max number

I have found a wild way to get maximum number of a set defined by a predicate p/1. It uses nb_setarg/3. Usually findall/3 might be used to collect all the numbers into a list. However, this widely recommended method was difficult to be applied to my case which is related to iterated deepening for a theorem prover.

% ?- Max=max(0), max_of_p(Max).
%@ Max = max(3).

max_of_p(Max):- p(X),
				Max = max(M),
				M0 is max(M, X),
				nb_setarg(1, Max, M0),
				fail.
max_of_p(_).

p(1).
p(2).
p(3).