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