sig
  type id = string
  type field = string
  type arithOp = Plus | Minus | Times
  type intCmp = LT | GT | EQ
  type typ =
      TNum
    | TBool
    | TFun of Typed_syntax.typ * Typed_syntax.typ
    | TPair of Typed_syntax.typ * Typed_syntax.typ
    | TList of Typed_syntax.typ
  type exp =
      Int of int
    | Bool of bool
    | Arith of Typed_syntax.arithOp * Typed_syntax.exp * Typed_syntax.exp
    | Cmp of Typed_syntax.intCmp * Typed_syntax.exp * Typed_syntax.exp
    | If of Typed_syntax.exp * Typed_syntax.exp * Typed_syntax.exp
    | Id of Typed_syntax.id
    | Let of Typed_syntax.id * Typed_syntax.exp * Typed_syntax.exp
    | Fun of Typed_syntax.id * Typed_syntax.typ * Typed_syntax.exp
    | Fix of Typed_syntax.id * Typed_syntax.typ * Typed_syntax.exp
    | App of Typed_syntax.exp * Typed_syntax.exp
    | Empty of Typed_syntax.typ
    | Cons of Typed_syntax.exp * Typed_syntax.exp
    | Head of Typed_syntax.exp
    | Tail of Typed_syntax.exp
    | IsEmpty of Typed_syntax.exp
    | Pair of Typed_syntax.exp * Typed_syntax.exp
    | ProjL of Typed_syntax.exp
    | ProjR of Typed_syntax.exp
end