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.