library(varnumbers)The built-in predicate numbervars/3 makes a term
ground by binding the variables in it to subterms of the form '$VAR'(N)
where N is an integer. Most of the calls to numbervars/3 look like
numbervars(Term, 0, _)
which can be abbreviated to
numbervars(Term)
if you use this package.
varnumbers/3 is a partial inverse to numbervars/3:
varnumbers(Term, N0, Copy)
unifies Copy with a copy of Term in which subterms of the form
'$VAR'(N) where N is an integer not less than N0 (that is, subterms
which might have been introduced by numbervars/3 with second argument
N0) have been consistently replaced by new variables. Since 0 is the
usual second argument of numbervars/3, there is also
varnumbers(Term, Copy)
This provides a facility whereby a Prolog-like data base can be
kept as a term. For example, we might represent append/3 thus:
Clauses = [
(append([], '$VAR'(0), '$VAR'(0)) :- true),
(append(['$VAR'(0)|'$VAR'(1), '$VAR'(2), ['$VAR'(0)|'$VAR(3)]) :-
append('$VAR'(1), '$VAR'(2), '$VAR'(3)))
]
and we might access clauses from it by doing
prove(Goal, Clauses) :-
member(Clause, Clauses),
varnumbers(Clause, (Goal:-Body)),
prove(Goal).
Exported predicates:
numbervars(+Term)'$VAR'(N) with
values of N ranging from 0 up.
varnumbers(+Term, -Copy)numbervars(Term)
and Copy is a copy of Term with such subterms replaced by variables.
varnumbers(+Term, +N0, -Copy)numbervars(Term, N0, N)
(so that all subterms '$VAR'(X) have integer(X), X >= N0)
and Copy is a copy of Term with such subterms replaced by variables.