Schelog provides special predicates for probing logic variables, without risking their getting bound.
The goal
(%== X Y)
succeeds if X and Y are identical objects. This
is not quite the unification predicate %=, for %==
doesn’t touch unbound objects the way %= does. Eg,
%== will not equate an unbound logic variable with a
bound one, nor will it equate two unbound logic variables
unless they are the same variable.
The predicate %/== is the negation of %==.
The goal
(%var X)
succeeds if X isn’t completely bound — ie, it has at
least one unbound logic variable in its innards.
The predicate %nonvar is the negation of %var.
Schelog lets the user protect a term with variables from
unification by allowing that term to be treated as a
(completely) bound object. The predicates provided for this
purpose are
%freeze,
%melt, %melt‑new, and %copy.
The goal
(%freeze S F)
unifies F to the frozen version of S. Any lack
of bindings in S are preserved no matter how much you
toss F about.
The goal
(%melt F S)
retrieves the object frozen in F into S.
The goal
(%melt-new F S)
is similar to %melt,
except that when S is made, the unbound variables in
F are replaced by brand-new unbound variables.
The goal
(%copy S C)
is an abbreviation for (%freeze S F)
followed by (%melt‑new F C).