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)`

.