Confused by
"The argument is a term that is used to reference a predicate with N more arguments than the given argument term. For example: call(0)
or maplist(1, +)
."
?
You are not alone. Read this:
Did you know ... | Search Documentation: |
Predicate meta_predicate/1 |
:
, ^
and //
are interpreted; the mode declarations +
, -
, *
and ?
are ignored.
call(0)
or maplist(1, +)
.:
consult(:)
.^
^
-annotated
goal of
setof/3, bagof/3, aggregate/3
and aggregate/4.
It is processed similar to‘0’, but leaving the ^
/2
intact.//
-
?
*
+
*
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,
or
:
) 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.
:
/2
:- 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.
Confused by
"The argument is a term that is used to reference a predicate with N more arguments than the given argument term. For example: call(0)
or maplist(1, +)
."
?
You are not alone. Read this: