| 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.