anchor.diff:      // org=="org" && sireum=="sireum" && logika=="logika"
     ;
   
  +proofElements
  +  : '{' NL* facts theorems? '}' NL*
  +  | '{' NL* facts? theorems '}' NL*
  +  | '{' NL* facts theorems '}' NL* ;
  +
   facts
  -  : '{' NL*
  -    ftb='fact' NL*
  +  : 'fact' NL*
       factOrFun ( NL+ factOrFun? )*
  -    te='}' NL* ;
  +  ;
  +
  +theorems
  +  : 'theorem' NL*
  +    theorem ( NL+ theorem? )*
  +  ;
   
   factOrFun: fact | fun ;
   
  -fact: ID '.' formula ;
  +fact: ID typeParams? '.' NL* formula ;
  +
  +theorem: ID typeParams? '.' NL* formula proof ;
   
   fun
  -  : tb='def' ID  NL?
  +  : tb='def' id=ID typeParams? NL?
       '(' param ( ',' param )* ')' ':' type
       funDef?
     ;
  
positive.code: stmts: stmt? ( NL+ stmt? )* ;
  
  stmt
    : modifier=( 'var' | 'val' ) ID ':' type '=' NL? exp  #VarDeclStmt
    | ID '=' NL? exp                                      #AssignVarStmt
    | 'assume' '(' exp ')'                                #AssumeStmt
    | 'assert' '(' exp ')'                                #AssertStmt
  
negative.code:       | 'N8' | 'N16' | 'N32' | 'N64'
        | 'S8' | 'S16' | 'S32' | 'S64'
        | 'U8' | 'U16' | 'U32' | 'U64' )
    ;
  
  typeArgs
    : '[' type ( ',' type )* ']'
    ;
  
  typeParams
    : '[' ID ( ',' ID )* ']'
    ;
  
  justification
  