sig
  type var = Strng.t * int
  type cons = True | False
  type t =
      Var of CoreML.var
    | Cons of CoreML.cons
    | Abs of CoreML.var * CoreML.t
    | App of CoreML.t * CoreML.t
    | Let of CoreML.var * CoreML.t * CoreML.t
    | If of CoreML.t * CoreML.t * CoreML.t
  type dir = Left | Middle | Right
  type pos = CoreML.dir list
  val var : Strng.t -> CoreML.t
  val abs : Strng.t list -> CoreML.t -> CoreML.t
  val app : CoreML.t list -> CoreML.t
  val leti : Strng.t -> CoreML.t -> CoreML.t -> CoreML.t
  val ite : CoreML.t -> CoreML.t -> CoreML.t -> CoreML.t
  val cons : CoreML.cons -> CoreML.t
  val vars : CoreML.t -> CoreML.var St.t
  val fvars : CoreML.t -> CoreML.var St.t
  val substitute : CoreML.var -> CoreML.t -> CoreML.t -> CoreML.t
  val beta : CoreML.t -> CoreML.t
  val is_redex : CoreML.t -> bool
  val redexpos : CoreML.t -> CoreML.pos list
  val is_whnf : CoreML.t -> bool
  val is_nf : CoreML.t -> bool
  val is_closed : CoreML.t -> bool
  val pos : CoreML.t -> CoreML.t -> CoreML.pos list
  val get : CoreML.t -> CoreML.pos -> CoreML.t
  val replace : CoreML.t -> CoreML.t -> CoreML.pos -> CoreML.t
  val replace_all : CoreML.t -> (CoreML.pos * CoreML.t) list -> CoreML.t
  val reduce_vars : CoreML.t -> CoreML.t
  module Strategies :
    sig
      val call_by_value : CoreML.t -> (CoreML.pos * CoreML.t) list
      val call_by_name : CoreML.t -> (CoreML.pos * CoreML.t) list
      val parallel_inner : CoreML.t -> (CoreML.pos * CoreML.t) list
      val parallel_outer : CoreML.t -> (CoreML.pos * CoreML.t) list
    end
  val do_step :
    (CoreML.t -> (CoreML.pos * CoreML.t) list) -> CoreML.t -> CoreML.t
  val calc_steps :
    (CoreML.t -> (CoreML.pos * CoreML.t) list) ->
    CoreML.t -> (CoreML.t * CoreML.pos list) list
  val calc_nf :
    (CoreML.t -> (CoreML.pos * CoreML.t) list) -> CoreML.t -> CoreML.t
  val varname : Strng.t -> char list Parser.result
  val ltp : CoreML.t Parser.t
  val var2strng : char list * int -> char list
  val to_strng' : CoreML.t -> Strng.t
  val to_strng : CoreML.t -> Strng.t
  val to_strng_mark' : CoreML.pos list -> CoreML.t -> Strng.t
  val to_strng_mark : CoreML.pos list -> CoreML.t -> Strng.t
end