Coroutining deals with having Prolog goals scheduled for execution as soon as some conditions is fulfilled. In Prolog the most commonly used conditions 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, so get_attr(Var, freeze, AttVal)
can be used 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.
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.