|Did you know ...||Search Documentation:|
|Single Sided Unification Guards|
Using the construction
Head, Guard => Body, the Guard
is executed after the single sided head unification. If the
Guard succeeds the clause executes a cut (!/0)
and proceeds normally. There are no restrictions on the guard code. A
well behaved guard is a test. Notably:
semidet. Non-deterministic calls are allowed. If the guard succeeds with choicepoints these are pruned before the body is entered.
As a special exception, explicit unification against a variable in
the head is moved into the head. See section
2.18.3. In the example below, the
X = f(I) is moved
into the head and (thus) is executed using single sided unification.
p(X), X = f(I), integer(I) => q(X).
Warning Moving the guard unification into the head changes the semantics of the unification. This may be defended by the rules above that claim one should not unify against the head arguments in the guard. Future versions may use a dedicated operator to indicate that the unification may be moved into the head.