Declare Name to be an operator of type Type with
precedence
Precedence. Name can also be a list of names, in
which case all elements of the list are declared to be identical
operators.
Precedence is an integer between 0 and 1200. Precedence 0
removes the declaration. Type is one of: xf
, yf
,
xfx
, xfy
, yfx
, fy
or
fx
. The‘f
’indicates the position
of the functor, while
x
and y
indicate the position of the
arguments.‘y
’should be interpreted as “on
this position a term with precedence lower or equal to the precedence of
the functor should occur” . For‘x
’the
precedence of the argument must be strictly lower. The precedence of a
term is 0, unless its principal functor is an operator, in which case
the precedence is the precedence of this operator. A term enclosed in
parentheses ( ...
has precedence 0.
The predefined operators are shown in table
5. Operators can be redefined, unless prohibited by one of the
limitations below. Applications must be careful with (re-)defining
operators because changing operators may cause (other) files to be
interpreted
differently. Often this will lead to a syntax error. In other
cases, text is read silently into a different term which may lead to
subtle and difficult to track errors.
- It is not allowed to redefine the comma (
','
).
- The bar (
|
) can only be (re-)defined as infix operator
with priority not less than 1001.
In SWI-Prolog, operators are local to a module (see also
section 6.9). Keeping
operators in modules and using controlled import/export of operators as
described with the module/2
directive keep the issues manageable. The module system
provides the operators from table
5 and these operators cannot be modified. Files that are loaded from
the SWI-Prolog directories resolve operators and predicates from this system
module rather than user
, which makes the semantics of the
library and development system modules independent of operator changes
to the user
module. See section
4.25 for details about the relation between operators and modules.
1200 | xfx | --> , :- , => , ==> |
1200 | fx | :- , ?- |
1150 | fx | dynamic, discontiguous, initialization,
meta_predicate,
module_transparent, multifile, public,
thread_local, thread_initialization, volatile |
1105 | xfy | | |
1100 | xfy | ; |
1050 | xfy | -> , *-> |
1000 | xfy | , |
990 | xfx | := |
900 | fy | \+ |
700 | xfx | < , = , =.. , =@= , \=@= ,
=:= , =< , == ,
=\= , > , >= , @< , @=< , @> ,
@>= , \= , \== , as, is,
>:< , :< |
600 | xfy | : |
500 | yfx | + , - , /\ , \/ , xor |
500 | fx | ? |
400 | yfx | * , / , // , div, rdiv,
<< , >> , mod, rem |
200 | xfx | ** |
200 | xfy | ^ |
200 | fy | + , - , \ |
100 | yfx | . |
1 | fx | $ |
Table 5 : System operators