sig
  type id = Identifier.t
  type binOp = Plus | Minus | Times | LT | GT | EQ
  type typ =
      TInt
    | TBool
    | TFun of M_syntax.typ * M_syntax.typ
    | TTuple of M_syntax.typ list
    | TList of M_syntax.typ
  type exp =
      Int of int
    | Bool of bool
    | BinOp of M_syntax.binOp * M_syntax.exp * M_syntax.exp
    | If of M_syntax.exp * M_syntax.exp * M_syntax.exp
    | Id of M_syntax.id
    | Let of M_syntax.id * M_syntax.exp * M_syntax.exp
    | Fun of M_syntax.id * M_syntax.typ * M_syntax.exp
    | Fix of M_syntax.id * M_syntax.typ * M_syntax.exp
    | App of M_syntax.exp * M_syntax.exp
    | Empty of M_syntax.typ
    | Cons of M_syntax.exp * M_syntax.exp
    | Head of M_syntax.exp
    | Tail of M_syntax.exp
    | IsEmpty of M_syntax.exp
    | Tuple of M_syntax.exp list
    | Proj of M_syntax.exp * int
    | Read of M_syntax.typ
    | Write of M_syntax.exp
end