[ 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