ManTa 3

CONCRETE SYNTAX

With ManTa a user can: specify ADT, propose terms to rewrite (find normal form), or propose conjectures to be proved. Each one has a specific syntax
 
 2.1  Lexical Conventios

 2.2  ADT Syntax in BNF
ident = ['A'-'Z' 'a'-'z'] ['A'-'Z' 'a'-'z' '0'-'9' '_']*  An identifier should begin with a letter.  We could allow more identifiers (e.g. $, %, &, etc), but this could make difficult the translation to some programming languages
expr
  | ERROR
  | EQUAL( expr , expr )
  | if expr thenexprelseexprfi
  | ident ( arguments )
  | ident
The expressions are built with: ERROR, EQUAL(.,.) if . then . else . fi.  Functions instanced and constants. 
Constants are treated as functions without parameters (empty domain), they should be written without parenthesis.
arguments
    expr ,arguments
  | expr
The arguments of function should be separated with comma ','.
axiom
    expr =expr
An axiom is an equality between expressions. It's not an assignment but a rewriting rule (the left side rewrites in the rigth one) as will be seen later. 
axioms
    axiom axioms
  | axiom
The user can give axioms only for selectors 
notEmptyDomain
    ident (i) *notEmptyDomain
  | ident * notEmptyDomain
  | ident (i)
  | ident
The domain of a function can be a product of ADTs each one of them can be inductive (used to make induction in proofs) or not.
domain
   notEmptyDomain
 | 
A function can have empty domain (they are constants)
generator
    ident :domain->ident
A generator is a function whose codomain should be the defined ADT.  There are two kinds of them: initials and constructors.  However the differences are not captured here but with the static semantics.
generators
    generator generators
  | 
User should  not give axioms for generators. Note that an ADT can have no generators in that case  it is an extension (just a set of new selectors to extend other ADTs) 
selector
    ident (c):domain->ident
    ident :domain->ident
A selector is a function with axioms given by the user.  The presented rule only describes the signature for a selector, the sintax of the axioms was already presented (see axiom
selectors
    selector selectors
  | selector
User should give at least one selector for each ADT.  If it has generators it must have at least an equality.
notEmptyParameters
    ident ,notEmptyParameters
  | ident
An ADT can have parameters (in that case it is a generic ADT). 
parameters
    notEmptyParameters
  | 
In this version of ManTa the parameters are not fully supported.  Hence their dynamic semantics will not be described in this document.
adt
  ADT ident [parameters ]
  INITIALS
    generators
  CONSTRUCTORS
    generators
  SELECTORS
    selectors
  AXIOMS
    axioms
An ADT has a name, it can have parameters, generators called initials (they don´t include the defined ADT in it's domain) and generators called constructors (they include the ADT in it's domain).  Each declared selector should have axioms to define it's behavior on generators

There are available a lexical analyzer to be used with ocamllex, and a parser to be used with ocamlyacc.  They can be adapted easily to other tools (e.g. flex and bison).
 
 
 2.3  Normalization Syntax

normExpr=
    expr
 2.4 Conjectures Syntax
conjExpr=
    expr = expr
 2.5 Predefined Abstract Data Types

The only primitive ADT in ManTa is BOOL.  It defines boolean values TRUE, FALSE and the functions AND(.,.), OR(.,.), NOT(.), IMP(.,.), EQ_BOOL(.,.). It's required by the built in function if E1 then E2 else E3 fi, whose first parameter (E1) must have type BOOL.

Other predefined ADTs are: NAT (natural numbers), Char and String.  By default these types can't be modified.

In adition to those types there are some classical ADT: List, Queue, Stack.
 
 
 2.6 The preprocessor

Writing ManTa files (ADT, conjectures or terms to rewrite) that require the primitive types NAT, Char and String is difficult,  boring and prone to errors.  This is so since the numbers have to be represented as SUC(SUC...(SUC(ZERO))..), the character as char(SUC(SUC(...SUC(ZERO)...)) and the String as lists of characters.
With a preprocessor the user can write easier and faster by using numbers, character constants and strings.   The preprocessor receives such files as inputs, transforms them to ManTa syntax and writes files.

The preprocessor works only at lexical level, it doesn't check the syntax of the file (so it can be used with any file, i.e. specifications, terms to rewrite or conjectures).

 2.7 The postprocessor

This component should be the inverse of the preprocessor.  It receives a ManTa file and it returns a text file easy to read.  (NAT ground terms translated to numbers, special characters translated, strings translated, etc.)
 
 2.8 Suggested conventions

To facilitate writing and reading ADTs and conjectures, some conventions are suggested (inspired in the Java Language conventions)


Contents

The Abstract Syntax Tree