sig
  type symbol
  type associativity =
      AssocLeft
    | NonAssoc
    | AssocRight
    | EnclosedBy of string * string
  val as_symbol : MiniAst.tname -> MiniAlgebra.symbol option
  val associativity : MiniAlgebra.symbol -> MiniAlgebra.associativity
  val priority : MiniAlgebra.symbol -> int
  val infix : MiniAlgebra.symbol -> bool
  type 'a environment = MiniAst.tname -> 'CoreAlgebra.arterm
  val tuple :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm list -> 'CoreAlgebra.arterm
  val pre :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val abs : 'MiniAlgebra.environment -> 'CoreAlgebra.arterm
  val record_constructor :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val arrow :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val n_arrows :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm list ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val result_type :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val arg_types :
    'MiniAlgebra.environment ->
    'CoreAlgebra.arterm -> 'CoreAlgebra.arterm list
  val tycon_args : 'CoreAlgebra.arterm -> 'CoreAlgebra.arterm list
  val tycon_name : 'CoreAlgebra.arterm -> 'CoreAlgebra.arterm
  val type_of_primitive :
    'MiniAlgebra.environment -> MiniAst.primitive -> 'CoreAlgebra.arterm
  type builtin_dataconstructor =
      MiniAst.dname * MiniAst.tname list * MiniAst.typ
  val init_builtin_env :
    (?name:MiniAst.tname -> unit -> 'a) ->
    (MiniAst.tname *
     (MiniAst.kind * 'CoreAlgebra.arterm *
      MiniAlgebra.builtin_dataconstructor list))
    list
  val builtin_env :
    (MiniAst.tname *
     (bool * MiniAlgebra.associativity * int * MiniAst.kind *
      (MiniAst.dname * MiniAst.tname list * MiniAst.typ) list))
    array
end