## 4.1 Notation of Predicate Descriptions

We have tried to keep the predicate descriptions clear and concise. First the predicate name is printed in bold face, followed by the arguments in italics. Arguments are preceded by a mode indicator There is no complete agreement on mode indicators in the Prolog community. We use the following definitions:21These definitions are taken from PlDoc. The current manual has only one mode declaration per predicate and therefore predicates with mode (+,-) and (-,+) are described as (?,?). The `@`-mode is often replaced by ``+``.

+ | Argument must be fully instantiated to a term that satisfies the required argument type. Think of the argument as input.
- | Argument must be unbound. Think of the argument as output.
? | Argument must be bound to a partial term of the indicated type. Note that a variable is a partial term for any type. Think of the argument as either input or output or both input and output. E.g. In `stream_property(S, reposition(Bool))`, the `reposition` part of the term is input and the uninstantiated Bool is output.
: | Argument is a meta-argument. Implies ``+``. See section 5 for more information on module-handing.
@ | Argument is not further instantiated. Typically used for type-tests.
! | Argument contains a mutable structure that may be modified using setarg/3 or nb_setarg/3.

Referring to a predicate in running text is done using a predicate indicator. The canonical and most generic form of a predicate indicator is a term <module>:<name>/<arity>. If the module is irrelevant (built-in predicate) or can be inferred from the context it is often omitted. Compliant to the ISO standard draft on DCG (see section 4.11), SWI-Prolog also allows for [<module>]:<name>//<arity> to refer to a grammar rule. For all non-negative arity, <name>//<arity> is the same as <name>/<arity+2>, regardless on whether or not the referenced predicate is defined or can be used as a grammar rule. The //-notation can be used in all places that traditionally allow for a predicate indicator, e.g. the module declaration, spy/1, and dynamic/1.