<operator> ::= <opForm> [ : <signature> ]
<opForm> ::= <functionId> | <simpleOpForm> | <bracketedOp> | <ifOp>
<functionId> ::= <simpleId>
<simpleOpForm> ::= [ __ ] <simpleOp> [ __ ] | [ __ ] . <simpleId>
<simpleOp> ::= <opId> | <escapedId>
<bracketedOp> ::= [ __ ] <openSym> __*, <closeSym> [ __ ]
<openSym> ::= { | "[" | \( | \<
<closeSym> ::= } | "]" | \) | \>
<ifOp> ::= if __ then __ else __
Note: All markers (__) may be omitted from a <simpleOpForm> when there
is exactly one declared operator (with the indicated signature) that can be
formed by adding some number of markers to the <simpleOpForm>.
<functionId> f 0 gcd
<simpleOpForm> -__ __<=>__ __\in__ __\Post __.first
<simpleOp> - <=> \in \Post
<bracketedOp> __[__] {}
Identifiers for most operators can be overloaded, that is, they can be used to represent operators with different signatures or with markers in different places. LP uses context to disambiguate overloaded identifiers.
The arity of an operator is the number of its arguments, that is, the number of sorts in its domain. A unary operator has arity 1, a binary operator has arity 2, and a constant has arity 0.