[ Predicate Database and Compiler | Reference Manual | Alphabetic Index ]
demon +SpecList
Declares the procedure(s) specified by SpecList to be demons.
- SpecList
- Comma-separated sequence of expressions of the form Atom/Integer.
Description
   The demon annotation specifies that the listed predicates are to
   be treated as demons. The only difference between a normal predicate
   and a demon is the behaviour on waking: When a normal predicate is
   delayed and gets woken, the delayed goal disappears. When a delayed
   demon gets woken, the delayed goal stays around.
   The only way to remove a demon is to explicitly kill it.
Modes and Determinism
Modules
This predicate is sensitive to its module context (tool predicate, see @/2).
Exceptions
- (4) instantiation fault 
- SpecList is not instantiated.
- (5) type error 
- SpecList is
	instantiated, but not to a sequence of    expressions of the form Atom/Integer.
- (62) inconsistent procedure redefinition 
- Predicate in SpecList already defined and is not a demon
Examples
     % 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
     report(X, Susp) :-
	     nonvar(X),
	     writeln(instantiated(X)),
             kill_suspension(Susp).    % remove from the resolvent
     [eclipse 1]:  report(X),
             notify_constrained(X), wake,
             notify_constrained(X), wake.
     constrained(X)
     constrained(X)
     X = X
     Delayed goals:
                 report(X)
     yes.
     [eclipse 2]:  report(X),
             notify_constrained(X), wake,
             X=123.
     constrained(X)
     instantiated(123)
     X = 123
     yes.
See Also
kill_suspension / 1, make_suspension / 3, notify_constrained / 1, schedule_suspensions / 2, set_suspension_data / 3, get_suspension_data / 3