Coroutining deals with having Prolog goals scheduled for execution as soon as some conditions are fulfilled. In Prolog the most commonly used condition is the instantiation (binding) of a variable. Scheduling a goal to execute immediately after a variable is bound can be used to avoid instantiation errors for some built-in predicates (e.g. arithmetic), do work lazy, prevent the binding of a variable to a particular value, etc. Using freeze/2 for example we can define a variable can only be assigned an even number:
?- freeze(X, X mod 2 =:= 0), X = 3 No
freeze
. Use frozen(Var, Goal)
to find
out whether and which goals are delayed on Var.true
.?=(X, Y)
, nonvar(X)
, ground(X)
,
,
(Cond1, Cond2)
or ;
(Cond1,
Cond2)
. See also freeze/2
and dif/2.
The implementation can deal with cyclic terms in X and Y.
The when/2
predicate is realised using attributed variable associated with the
module when
. It is defined in the autoload library
library(when)
.
dif(X, Y) :- when(?=(X, Y), X \== Y)
. See also ?=/2.
The implementation can deal with cyclic terms.
The dif/2
predicate is realised using attributed variable associated with the
module dif
. It is defined in the autoload library
library(dif)
.
The predicate has considerable implications. During the execution of Goal, the garbage collector does not reclaim attributed variables. This causes some degradation of GC performance. In a well-behaved program there are no such variables, so the space impact is generally minimal. The actual collection of Vars is implemented using a scan of the trail- and global stacks.