are interpreted; the mode declarations
- The argument is a term that is used to reference a predicate with N
more arguments than the given argument term. For example:
- The argument is module-sensitive, but does not directly refer to a
predicate. For example:
- This extension is used to denote the possibly
^-annotated goal of setof/3, bagof/3, aggregate/3 and aggregate/4. It is processed similar to‘0', but leaving the
- The argument is a DCG body. See phrase/3.
- All these have the same semantics, declaring the argument to be not
module sensitive. The
notation is an alias for
for compatibility with e.g., Logtalk. The specific mode has merely documentation value. See section 4.1.1 for details.
Each argument that is module-sensitive (i.e., marked 0..9,
) is qualified with the context module of the
caller if it is not already qualified. The implementation ensures that
the argument is passed as <module>:<term>,
where <module> is an atom denoting the name of a module
and <term> itself is not a
term where the first argument is an atom. Below is a simple declaration
and a number of queries.
:- meta_predicate meta(0, +). meta(Module:Term, _Arg) :- format('Module=~w, Term = ~q~n', [Module, Term]).
?- meta(test, x). Module=user, Term = test ?- meta(m1:test, x). Module=m1, Term = test ?- m2:meta(test, x). Module=m2, Term = test ?- m1:meta(m2:test, x). Module=m2, Term = test ?- meta(m1:m2:test, x). Module=m2, Term = test ?- meta(m1:42:test, x). Module=42, Term = test
The meta_predicate/1 declaration is the portable mechanism for defining meta-predicates and replaces the old SWI-Prolog specific mechanism provided by the deprecated predicates module_transparent/1, context_module/1 and strip_module/3. See also section 6.16.