| X  | ::= variable  | { domain variable }
  | 
  | 
| Constant  | ::= integer
  | 
 | | inf  | { minus infinity }
  | 
 | | sup  | { plus infinity }
  | 
  | 
| Term  | ::= Constant
  | 
 | | X  | { suspend until assigned }
  | 
 | | min(X)  | { min. of domain of X }
  | 
 | | max(X)  | { max. of domain of X }
  | 
 | | card(X)  | { size of domain of X }
  | 
 | | - Term
  | 
 | | Term + Term
  | 
 | | Term - Term
  | 
 | | Term * Term
  | 
 | | Term /> Term  | { division rounded up }
  | 
 | | Term /< Term  | { division rounded down }
  | 
 | | Term mod Term
  | 
  | 
| TermSet  | ::= {Term,...,Term}
  | 
  | 
| Range  | ::= TermSet
  | 
 | | dom(X)  | { domain of X }
  | 
 | | Term .. Term  | { interval }
  | 
 | | Range /\ Range  | { intersection }
  | 
 | | Range \/ Range  | { union }
  | 
 | | \ Range  | { complement }
  | 
 | | - Range  | { pointwise negation }
  | 
 | | Range + Range  | { pointwise addition }
  | 
 | | Range - Range  | { pointwise subtraction }
  | 
 | | Range mod Range  | { pointwise modulo }
  | 
 | | Range + Term  | { pointwise addition }
  | 
 | | Range - Term  | { pointwise subtraction }
  | 
 | | Term - Range  | { pointwise subtraction }
  | 
 | | Range mod Term  | { pointwise modulo }
  | 
 | | Range ? Range
  | 
 | | unionof(X,Range,Range)
  | 
 | | switch(Term,MapList)
  | 
  | 
| ConstantSet  | ::= {integer,...,integer}
  | 
  | 
| ConstantRange  | ::= ConstantSet
  | 
 | | Constant .. Constant
  | 
 | | ConstantRange /\ ConstantRange
  | 
 | | ConstantRange \/ ConstantRange
  | 
 | | \ ConstantRange
  | 
  | 
| MapList  | ::= []
  | 
 | | [integer-ConstantRange|MapList]
  | 
  | 
| CList  | ::= []
  | 
 | | [integer|CList]
  | 
  | 
| Indexical  | ::= X in Range
  | 
  | 
| Indexicals  | ::= Indexical
  | 
 | | Indexical , Indexicals
  | 
  | 
| ConstraintBody  | ::= Indexicals
  | 
 | | LinExpr RelOp LinExpr
  | 
 | | element(X,CList,X)
  | 
 | | relation(X,MapList,X)
  | 
  | 
| Head  | ::= term  | { a compound term with unique variable args }
  | 
  | 
| TellPos  | ::= Head +: ConstraintBody
  | 
| TellNeg  | ::= Head -: ConstraintBody
  | 
| AskPos  | ::= Head +? Indexical
  | 
| AskNeg  | ::= Head -? Indexical
  | 
  | 
| ConstraintDef  | ::= TellPos. 
  | 
 | ?(TellNeg.) 
  | 
 | ?(AskPos.) 
  | 
 | ?(AskNeg.)
  |