
suspend(+Goal, +Prio, +CondList, -Susp)

   Suspend the Goal and wake it with priority Prio as soon as one of the
conditions in CondList occurs.

Arguments
   Goal                A callable term.
   Prio                An integer.
   CondList            A term of the form Vars->Cond or trigger(Atom) or a list of such terms.
   Susp                A free variable used to return the created suspension.

Type
   Advanced Control and Suspensions

Description
   The specified goal Goal is suspended, subject to the given trigger
   conditions and priority, as with suspend/3.  The only difference to
   suspend/3 is that the Susp argument returns a handle for the created
   suspension. This handle can, for example, be passed as an argument to
   the suspended goal itself, which is useful for demon goals which need
   to kill their own suspension under certain circumstances.

   See suspend/3 for details of arguments and operation.



Modes and Determinism
   suspend(+, +, +, -) is det

Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Exceptions
     6 --- CondList is ill-formed.

Examples
   
[eclipse]: suspend(writeln(hello), 2, X->inst, Susp),
        get_suspension_data(Susp, goal, Goal),
        get_suspension_data(Susp, module, Module).

X = X
Goal = writeln(hello)
Susp = 'SUSP-_321-susp'
Module = eclipse

Delayed goals:
        writeln(hello)
yes.


[eclipse]: suspend(writeln(hello), 2, X->inst, Susp),
        kill_suspension(Susp),     % killed before woken
	X=1.

Susp = 'SUSP-_308-dead'
X = 1
yes.



% A demon that wakes whenever X becomes more constrained
report(X) :-
      suspend(report(X, Susp), 1, X->constrained, Susp).

:- demon(report/2).
report(X, Susp) :-
      ( var(X) ->
          writeln(constrained(X))   % implicitly re-suspend
      ;
          writeln(instantiated(X)),
          kill_suspension(Susp)     % remove from the resolvent
      ).


See Also
   demon / 1, make_suspension / 3, insert_suspension / 3, suspend / 3, attach_suspensions / 2
