Some predicates take goals as arguments (i.e.
meta-predicates). These arguments must include a
module specification stating which module the goal
refers. Some other predicates also need module information
i.e. compile/1. The property of needing module
information is declared with a meta-predicate declaration
(see Meta Decl). Goals for these predicates are
module name expanded to ensure the module information.
Goals appearing in queries and meta-calls are expanded
prior to execution while goals in the bodies of clauses and
directives are expanded at compile time. The expansion is
made by preceding the relevant argument with `Module:'.
If the goal is prefixed by `Module:', Module is
used for the expansion; otherwise, the source/type-in module is
used. An argument is not expanded if:
Some examples:
| ?- [user].
| :- meta_predicate p(:), q(:).
| r(X) :- p(X).
| q(X) :- p(X).
| ^D
% consulted user in module user, 0 msec 424 bytes
| ?- listing.
r(A) :-
p(user:A).
q(A) :-
p(A).
Here, p/1 and q/1 are declared as meta-predicates
while r/1 is not. Thus the clause r(X) :- p(X) will
be transformed to r(X) :- p(M:X), by item 2 above, where
M is the type-in module, whereas q(X) :- p(X) will
not.
| ?- m:assert(f(1)).
Here, assert/1 is called in the module m. However,
this does not ensure that f(1) is asserted into m. The
fact that assert/1 is a meta-predicate makes the system
module name expand the goal, transforming it to
m:assert(m:f(1)) before execution. This way, assert/1 is
supplied the correct module information.