### 7` `Manipulating Racklog Variables

Racklog provides special predicates for probing logic variables, without risking their getting bound.

#### 7.1` `Checking for Variables

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 —

The predicate %nonvar is the negation of %var.

#### 7.2` `Preserving Variables

Racklog 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).