sig
  type label = string
  type t =
      Num of int
    | Var of string
    | Op of Op.t * O.Ast.t * O.Ast.t
    | Ifz of O.Ast.t * O.Ast.t * O.Ast.t
    | Let of string * O.Ast.t * O.Ast.t
    | App of O.Ast.t * O.Ast.t
    | Fun of string * O.Ast.t
    | Fix of string * O.Ast.t
    | Rec of (O.Ast.label * O.Ast.t) list
    | Access of O.Ast.t * O.Ast.label
    | CopyWith of O.Ast.t * (O.Ast.label * O.Ast.t) list
    | Obj of string option * (O.Ast.label * O.Ast.t) list
    | Invoke of O.Ast.t * O.Ast.label
    | ObjWith of string option * O.Ast.t * (O.Ast.label * O.Ast.t) list
end