Appendix B
Maude Grammar

This chapter describes the syntax of Maude using the following extended BNF notation: the symbols ‘ ( ’ and ‘ ) ’ are used as metaparentheses; the symbol ‘ ’ is used to separate alternatives; square bracket pairs, ‘ [ ’ and ‘ ] ’, enclose optional syntax; ‘*’ indicates zero or more repetitions of preceding unit; ‘ + ’ indicates one or more repetitions of preceding unit; and the string “x” denotes x literally. As an application of this notation, A ( , A ) * indicates a non-empty list of A’s separated by commas. Finally, %%% indicates comments in the syntactic description, as opposed to comments in the Maude code.

B.1 The grammar


MaudeTop  ::=
     (   SystemCommand     Command     DebuggerCommand  
        Module     Theory     View   ) +

SystemCommand  ::= in  FileName    load  FileName    sload  FileName  
    quit   eof   popd   pwd 
    cd  Directory    push  Directory  
    ls  [   LsFlag   ]   [   Directory   ]

Command  ::= select  ModId  . 
    parse  [  in  ModId  :  ]   Term  . 
     [  debug  ]  reduce  [  in  ModId  :  ]   Term  . 
     [  debug  ]  rewrite  [  [  Nat  ]  ]   [  in  ModId  :  ]   Term  . 
     [  debug  ]  frewrite  [   DoubleBound   ]   [  in  ModId  :
         ]   Term  . 
     [  debug  ]  erewrite  [   DoubleBound   ]   [  in  ModId  :  ]
         Term  . 
     [  debug  ]   (  srewrite   dsrewrite  )   [  [  Nat  ]  ]   [  in  ModId  :  ]
         Term  using  Strat  . 
    check  [  in  ModId  :  ]   Term  . 
     (  match   xmatch  )   [  [  Nat  ]  ]   [  in  ModId  :  ]
         Term  <=?  Term   [  such that  Condition   ]  . 
     [  debug  ]  variant match  [  [  Nat  ]  ]   [  in  ModId  :  ]
         Term  <=?  Term   [  such that  Condition   ]  . 
     [  irredudant  ]  unify  [  [  Nat  ]  ]   [  in  ModId  :  ]
         UnificationEquation    (  /\  UnificationEquation   ) * . 
     [  debug  ]   [  filtered  ]  variant unify  [  [  Nat  ]  ]   [  in  ModId  :  ]
         UnificationEquation    (  /\  UnificationEquation   ) * . 
     [  debug  ]  get  [  irredundant  ]  variants  [  [  Nat  ]  ]   [  in  ModId  :  ]   Term  . 
     [  debug  ]  search  [   DoubleBound   ]   [  in  ModId  :  ]   Term   SearchType   Term
         [  such that  Condition   ]  . 
     [  debug  ]   [   NarrowingOptionList   ]  vu-narrow  [   VariantOptionList   ]   [   DoubleBound   ]
         [  in  ModId  :  ]   Term   SearchType   Term  . 
     [  debug  ]  continue  Nat  . 
    loop  [  in  ModId  :  ]   Term  . 
    (  TokenString  ) 
    trace  (  select   deselect   include   exclude  )
         (   OpId    (  OpForm  )  ) +  . 
    print  (  conceal   reveal  )   (   OpId    (  OpForm  )  ) +  . 
    break  (  select   deselect  )   (   OpId    (  OpForm  )  ) +  . 
    show  ShowItem   [   ModId   ]  . 
    show  [  processed  ]  view  [   ViewId   ]  . 
    show modules . 
    show views . 
    show search graph . 
    show path  [  labels   states  ]   Nat  . 
    show frontier states . 
    show most general states . 
    do clear memo  [   ModId   ]  . 
    set  SetOption   (  on   off  )  .

DoubleBound  ::= [  Nat   [  ,  Nat   ]  ]   [ ,  Nat  ]

SearchType  ::= =>1   =>+   =>*   =>!   =>#

UnificationEquation  ::=  Term  =?  Term

ShowItem  ::= module   all   desugared   sorts   ops   vars   mbs 
    eqs   rls   strats   sds   summary   kinds   profile

SetOption  ::= show  ShowOption  
    print  PrintOption  
    trace  [   TraceOption   ]  
    break   verbose   profile 
    clear  (  memo   rules   profile  )  
    protect  ModId  
    extend  ModId  
    generate-by  ModId  
    include  ModId  
    oo include  ModID

ShowOption  ::= advise   stats   loop stats   timing 
    loop timing   breakdown   command   gc

PrintOption  ::= mixfix   flat   with parentheses 
    with aliases   conceal   number   rat   color 
    format   graph   attribute   attribute newline 
    constants with sorts   latex

TraceOption  ::= condition   whole   substitution   select 
    mbs   eqs   rls   sds   rewrite   body

VariantOptionList  ::= {  VariantOption   (  ,  VariantOption   ) * }

VariantOption  ::= filter   delay

NarrowingOptionList  ::= {  NarrowingOption   (  ,  NarrowingOption   ) * }

NarrowingOption  ::= fold   vfold   path

DebuggerCommand  ::= resume .   abort .   step .   where .

Module  ::= fmod  ModId   [   ParameterList   ]  is  ModElt * endfm 
    mod  ModId   [   ParameterList   ]  is  ModElt’ * endm 
    omod  ModId   [   ParameterList   ]  is  OmodElt * endom 
    smod  ModId   [   ParameterList   ]  is  SmodElt * endsm

Theory  ::= fth  ModId  is  ModElt * endfth 
    th  ModId  is  ModElt’ * endth 
    oth  ModId  is  OmodElt * endoth 
    sth  ModId  is  SmodElt * endsth

View  ::= view  ViewId   [   ParameterList   ]  from  ModExp  to  ModExp  is
              ViewElt *
           endv

ParameterList  ::= {  ParameterDecl   (  ,  ParameterDecl   ) * }

ParameterDecl  ::=  ParameterId  ::  ModExp

ModElt  ::= including  ModExp  . 
    extending  ModExp  . 
    protecting  ModExp  . 
    generated-by  ModExp  . 
    sorts  Sort +  . 
    subsorts  Sort +   (  <  Sort +   ) +  . 
    op  OpForm  :  Type *  Arrow   Type   [   Attr   ]  . 
    ops  (   OpId    (  OpForm  )  ) +  :  Type *  Arrow   Type   [   Attr   ]  . 
    vars  VarId +  :  Type  . 
     Statement   [   StatementAttr   ]  .

ViewElt  ::= var  VarId +  :  Type  . 
    sort  Sort  to  Sort  . 
    label  LabelId  to  LabelId  . 
    op  OpForm  to  OpForm  .  
    op  OpForm  :  Type *  Arrow   Type  to  OpForm  . 
    op  Term  to term  Term  . 
    class  Class  to  Class  . 
    attr  AttributeId   [  :  Type   ]  to  AttributeId  . 
    msg  OpForm  to  OpForm  .  
    msg  OpForm  :  Type *  Arrow   Type  to  OpForm  . 
    msg  Term  to term  Term  . 
    strat  StratId  to  StratId  . 
    strat  StratId   [  :  Type *  ]  @  Type  to  StratId  . 
    strat  StratCall  to expr  Strat  .

ModExp  ::=  ModId  
    (  ModExp  ) 
     ModExp  +  ModExp  
     ModExp  *  Renaming
     ModExp  {  ViewId   (  ,  ViewId   ) * }

Renaming  ::= (  RenamingItem   (  ,  RenamingItem   ) * )

RenamingItem  ::= sort  Sort  to  Sort  
    label  LabelId  to  LabelId  
    op  OpForm   ToPartRenamingItem  
    op  OpForm  :  Type *  Arrow   Type   ToPartRenamingItem
    class  Class  to  Class  
    attr  AttributeId   [  :  Type   ]  to  AttributeId  
    msg  OpForm   ToPartRenamingItem  
    msg  OpForm  :  Type *  Arrow   Type   ToPartRenamingItem
    strat  StratId  to  StratId  
    strat  StratId   [  :  Type *  ]  @  Type  to  StratId

ToPartRenamingItem  ::= to  OpForm   [   Attr   ]

Arrow  ::= ->   ~>

Type  ::=  Sort     Kind

Kind  ::= [  Sort   ( ,  Sort   ) * ]

Sort  ::=  SortId     Sort  {  Sort   (  ,  Sort   ) * }

Class  ::=  Sort          %%% without underscores

ModElt’  ::=  ModElt  
     Statement’   [   StatementAttr   ]  .

OmodElt  ::=  ModElt’  
    class  Class   [  |  ClassDef   ]  . 
    subclass  Class +   (  <  Class +   ) +  . 
    msg  OpForm  :  Type *  Arrow   Type   [   Attr   ]  . 
    msgs  (   OpId    (  OpForm  )  ) +  :  Type *  Arrow   Type   [   Attr   ]  .

SmodElt  ::=  ModElt’  
    strats  StratId +   [  :  Type *  ]  @  Type   [   StratAttr   ]  .
     StratStatement   [   StatementAttr   ]  .

Statement   ::=  mb  [   Label   ]   Term  :  Sort  
    cmb  [   Label   ]   Term  :  Sort  if  Condition  
    eq  [   Label   ]   Term  =  Term  
    ceq  [   Label   ]   Term  =  Term  if  Condition

Statement’  ::= rl  [   Label   ]   Term  =>  Term  
    crl  [   Label   ]   Term  =>  Term  if  Condition’

StratStatement  ::= sd  StratCall  :=  Strat  
    csd  StratCall  :=  Strat  if  Condition

ClassDef  ::=  AttributeDecl   (  ,  AttributeDecl   ) *

AttributeDecl  ::=  AttributeId   [  :  ]   Type

Label  ::= [  LabelId  ] :

Condition  ::=  ConditionFragment   (  /\  ConditionFragment   ) *

Condition’  ::=  ConditionFragment’
                  (  /\  ConditionFragment’   ) *

ConditionFragment  ::=  Term  =  Term     Term  :=  Term
                           Term  :  Sort

ConditionFragment’  ::=  ConditionFragment     Term  =>  Term

Attr  ::=
    [  (  assoc   comm 
         [  left   right  ]  id:  Term  
        idem   iter   memo   ditto 
        config   obj   msg   pcons   ctor   portal 
        metadata  StringId
        strat (  Nat +  ) 
        poly (  Nat +  ) 
        frozen  [  (  Nat +  )  ]  
        prec  Nat  
        gather (  (  e   E   &  ) +  ) 
        format (  Token +  ) 
        special (  Hook +  )  ) +  ] 
        latex (  LatexFragment  )

StratAttr  ::= [ metadata  StringId  ]

StatementAttr  ::=
    [  (  nonexec   dnt 
        metadata  StringId  
        label  LabelId   
        print  PrintItem *  ) +  ]

StatementAttrEq  ::=
    [  (   StatementAttr    otherwise   variant  ) +  ]

StatementAttrRl  ::=
    [  (   StatementAttr    narrowing  ) +  ]

PrintItem  ::=  StringId     VarId     VarAndSortId

Hook  ::= id-hook  Token   [  (  TokenString  )  ]  
     (  op-hook   term-hook  )   Token  (  TokenString  )

Strat  ::= idle   fail 
     RuleApp    top(  RuleApp  ) 
     Strat  ?  Strat  :  Strat  
     TestVariant   Term   [  such that  Condition   ]
     Strat  ;  Strat  
     Strat  |  Strat  
     Strat  * 
     MrewVariant   Term   [  such that  Condition   ]  by  VarStratList
     StratCall
     Strat  +
     Strat  or-else  Strat
    not(  Strat  )
     Strat  !
    try(  Strat  )
    test(  Strat  )

RuleApp  ::=  LabelId   [  [  Substitution  ]  ]   [  {  Strat  (,  Strat )* }  ]

Substitution  ::=  VarId  <-  Term  
     Substitution  ,  Substitution

StratCall  ::=  StratId   [  ()  ]  
     StratId  (  Term  (,  Term )* )

VarStratList  ::=  VarId  using  Strat  
     VarStratList  ,  VarStratList

TestVariant  ::= match   xmatch   amatch

MrewVariant  ::= matchrew   xmatchrew   amatchrew

FileName     %%% OS dependent
Directory    %%% OS dependent
LsFlag       %%% OS dependent

StringId     %%% characters enclosed in double quotes "..."
ModId        %%% simple identifier, by convention all capitals, with hyphens to separate words
ViewId       %%% simple identifier, by convention capitalized
ParameterId  %%% simple identifier, by convention single capital
SortId       %%% simple identifier, by convention capitalized. It must
                  not include parentheses, brackets, braces, commas, periods,
                  or colons, and <, ->, ~>, and @ are excluded.
VarId        %%% simple identifier, except :, by convention capitalized
VarAndSortId  %%% an identifier consisting of a variable name
                   followed by a colon followed by a sort name
OpId         %%% identifier possibly with underscores
OpForm  ::=  OpId    (  OpForm  )    OpForm +
Nat          %%% a natural number
Term  ::=  Token    (  Term  )    Term +
Token        %%% sequence of printable ASCII characters delimited by
                  whitespace. The symbols (, ), [, ], {, } and comma form
                  separate tokens themselves, unless backquoted
TokenString  ::=  Token    (  TokenString  )    TokenString *
LabelId      %%% simple identifier
StratId      %%% simple identifier, except @ and :
AttributeId  %%% simple identifier, except [, ], {, } and comma

In parsing module expressions, instantiation has higher precedence than renaming, which in turn has higher precedence than summation.

B.2 Synonyms


sort  =  sorts
subsort  =  subsorts
var  =  vars

Command only synonyms:


advise  =  advisory  =  advisories
alias  =  aliases
attr  =  attribute
cmd  =  command
cond  =  condition
cont  =  continue
dsrew  =  dsrewrite
eqs  =  eq
erew  =  erewrite
flat  =  flattened
frew  =  frewrite
fvu-narrow  =  {fold} vu-narrow
irred  =  irreducible
kinds  =  components
label  =  labels
mbs  =  mb
nar  =  narrow
paren  =  parens  =  parentheses
q  =  quit
rat  =  rational
red  =  reduce
rew  =  rewrite
rls   =  rl  =  rule  =  rules
s.t.  =  such that
srew  =  srewrite
subst  =  substitution
sds  =  sd
state  =  states

Module only synonyms:


assoc  =  associative
ceq  =  cq
class  =  classes
comm  =  commutative
config  =  configuration
ctor  =  constructor
ex  =  extending
gb  =  generated-by
id:  =  identity:
idem  =  idempotent
inc  =  including
iter  =  iterated
msg  =  message
obj  =  object
owise  =  otherwise
poly  =  polymorphic
prec  =  precedence
pr  =  protecting
subclass  =  subclasses
strat  =  strategy       %%% reduction strategy attribute
strats  =  strat         %%% rewriting strategy declaration

B.3 Lexical and other Issues

Tokens are sequences of printable ASCII characters delimited by white space, except that ‘(’, ‘)’, ‘[’, ‘]’, ‘{’, ‘}’, and ‘,’ are always considered as single character tokens, unless backquoted.

Single line comments are started by one of *** or –-, and ended by the end of line. Multiline comments are started by ***( and ended by ). Parentheses (whether backquoted or not) must balance within multiline comments.

String identifiers use C backslash conventions [77, Section A2.5.2].

Operators having mixfix syntax with mismatched parentheses generate a warning and the mixfix syntax is disabled. Although not recommended, it is possible declaring such operators using backquote syntax.

fmod FOO is 
 sort Foo . 
 op ‘(_‘)‘) : Foo -> Foo . 
 op ‘)_‘( : Foo -> Foo . 
 op _+_ : Foo Foo -> Foo . 
 op a : -> Foo . 
endfm
     

When such declarations are used, Maude gives warning messages. For instance, loading the previous FOO module produces the following warnings:

Warning: <standard input>, line 3 (fmod FOO): mismatched parentheses in 
   operator ‘(_‘)‘). It will be treated as having prefix syntax only. 
Warning: <standard input>, line 4 (fmod FOO): mismatched parentheses in 
   operator ‘)_‘(. It will be treated as having prefix syntax only.
     

Then, as advised, terms using these operators will be printed using mixfix syntax. For example,

Maude> red ‘(_‘)‘)(a) + a . 
reduce in FOO : ‘(_‘)‘)(a) + a . 
rewrites: 0 in 0ms cpu (0ms real) (0 rewrites/second) 
result Foo: ‘(_‘)‘)(a) + a 
Maude> red ‘)_‘((a + ‘(_‘)‘)(a)) . 
reduce in FOO : ‘)_‘((a + ‘(_‘)‘)(a)) . 
rewrites: 0 in 0ms cpu (0ms real) (0 rewrites/second) 
result Foo: ‘)_‘((a + ‘(_‘)‘)(a))
     

To avoid inadvertently running out of memory, the limit for integer exponents and left shifts is ULONG_MAX ( 9 , 2 2 3 , 3 7 2 , 0 3 6 , 8 5 4 , 7 7 5 , 8 0 7 on 64-bit hardware, 4 , 2 9 4 , 9 6 7 , 2 9 5 on 32-bit hardware) which is a hard limit imposed by GMP. However, if the first argument is 0, 1 or -1 for exponentiation, or 0 for left shift, then the answer is trivial and the second arguments can be arbitrarily long.