10.45 An Inverse of numbervars/3—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)

makes Term ground by binding variables to subterms '$VAR'(N) with values of N ranging from 0 up.

varnumbers(+Term, -Copy)

xo succeeds when Term was a term producing by calling numbervars(Term) and Copy is a copy of Term with such subterms replaced by variables.

varnumbers(+Term, +N0, -Copy)

succeeds when Term was a term produced by calling 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.



Send feedback on this subject.