:- module(terms, [numbervars/3]). :- use_module(library(error)). numbervars(Term, N0, N) :- catch(internal_numbervars(Term, N0, N), error(E,Ctx), ( ( var(Ctx) -> Ctx = numbervars/3 ; true ), throw(error(E,Ctx) ) ) ). internal_numbervars(Term, N0, N) :- must_be(integer, N0), can_be(integer, N), term_variables(Term, Vars), numberlist(Vars, N0, N). numberlist([], N, N). numberlist(['$VAR'(N0)|Vars], N0, N) :- N1 is N0+1, numberlist(Vars, N1, N).