|Did you know ...||Search Documentation:|
|Pack delay -- prolog/delay.pl|
Term =.. [Name|Args]. This predicate is exported to placate the cross-referencer. It's intended to be called as
delay(univ(T,N,As)). Although it can be used as a normal goal, if wanted.
call(Goal)but postpones execution until Goal's arguments are bound enough to avoid errors like: "Arguments are not sufficiently instantiated". This is currently realized with attributed variables and when/2, so execution timing is identical. For example,
t :- delay(atom_codes(A,C)), A = hello, C == "hello".
does not throw an exception on the first line. One is simply declaring that A and C have a given relationship without stating when the predicate (atom_codes/2) will execute. This declarative style is especially valuable when different modes of a predicate require different goal order.
The following predicates are currently supported:
delay(length(L,Len)) warrants additional explanation. length/2
doesn't throw instantiation exceptions. It simply iterates all
possible lists and their respective lengths. This isn't always
ideal. Using delay/1 with length/2 yields the same semantics but
performs much less backtracking. It waits until either L
or Len is bound then length/2 evaluates without any choicepoints.
L must become a proper list to trigger, so incrementally binding
its head is OK.