sig
  type filename = string
  type 'a or_error = ('a, string) CCResult.t
  type env_with_clauses =
      Env_clauses : 'Env.packed * 'Clause.sets -> Phases.env_with_clauses
  type env_with_result =
      Env_result : 'Env.packed *
        Saturate.szs_status -> Phases.env_with_result
  type errcode = int
  type prelude = Logtk.UntypedAST.statement Sequence.t
  type ('ret, 'before, 'after) phase =
      Init : (unit, 'a, [ `Init ]) Phases.phase
    | Setup_gc : (unit, [ `Init ], [ `Init ]) Phases.phase
    | Setup_signal : (unit, [ `Init ], [ `Init ]) Phases.phase
    | Parse_CLI :
        (Phases.filename list * Params.t, [ `Init ], [ `Parse_cli ])
        Phases.phase
    | LoadExtensions :
        (Extensions.t list, [ `Parse_cli ], [ `LoadExtensions ]) Phases.phase
    | Parse_prelude :
        (Phases.prelude, [ `LoadExtensions ], [ `Parse_prelude ])
        Phases.phase
    | Start_file :
        (Phases.filename, [ `Parse_prelude ], [ `Start_file ]) Phases.phase
    | Parse_file :
        (Logtk.Input_format.t * Logtk.UntypedAST.statement Sequence.t,
         [ `Start_file ], [ `Parse_file ])
        Phases.phase
    | Typing :
        (Logtk.TypeInference.typed_statement CCVector.ro_vector,
         [ `Parse_file ], [ `Typing ])
        Phases.phase
    | CNF :
        (Logtk.Statement.clause_t CCVector.ro_vector, [ `Typing ], [ `CNF ])
        Phases.phase
    | Compute_prec :
        (Logtk.Precedence.t, [ `CNF ], [ `Precedence ]) Phases.phase
    | Compute_ord_select :
        (Logtk.Ordering.t * Selection.t, [ `Precedence ],
         [ `Compute_ord_select ])
        Phases.phase
    | MakeCtx :
        ((module Ctx.S), [ `Compute_ord_select ], [ `MakeCtx ]) Phases.phase
    | MakeEnv :
        (Phases.env_with_clauses, [ `MakeCtx ], [ `MakeEnv ]) Phases.phase
    | Pre_saturate :
        ('Env.packed * Saturate.szs_status * 'Clause.sets, [ `MakeEnv ],
         [ `Pre_saturate ])
        Phases.phase
    | Saturate :
        (Phases.env_with_result, [ `Pre_saturate ], [ `Saturate ])
        Phases.phase
    | Print_result : (unit, [ `Saturate ], [ `Print_result ]) Phases.phase
    | Print_dot : (unit, [ `Print_result ], [ `Print_dot ]) Phases.phase
    | Check_proof :
        (Phases.errcode, [ `Print_dot ], [ `Check_proof ]) Phases.phase
    | Print_stats : (unit, [ `Check_proof ], [ `Print_stats ]) Phases.phase
    | Exit : (unit, 'b, [ `Exit ]) Phases.phase
  type any_phase = Any_phase : ('a, 'b, 'c) Phases.phase -> Phases.any_phase
  type (+'a, 'p1, 'p2) t
  val string_of_phase : ('a, 'b, 'c) Phases.phase -> string
  val string_of_any_phase : Phases.any_phase -> string
  val return : '-> ('a, 'p, 'p) Phases.t
  val fail : string -> ('a, 'b, 'c) Phases.t
  val return_err : 'Phases.or_error -> ('a, 'p, 'p) Phases.t
  val exit : (unit, 'a, [ `Exit ]) Phases.t
  val start_phase :
    ('a, 'p1, 'p2) Phases.phase -> (unit, 'p1, [ `InPhase of 'p2 ]) Phases.t
  val return_phase : '-> ('a, [ `InPhase of 'p2 ], 'p2) Phases.t
  val return_phase_err :
    'Phases.or_error -> ('a, [ `InPhase of 'p2 ], 'p2) Phases.t
  val current_phase : (Phases.any_phase, 'a, 'p2) Phases.t
  val with_phase :
    ('a, 'p1, 'p2) Phases.phase -> f:(unit -> 'a) -> ('a, 'p1, 'p2) Phases.t
  val with_phase1 :
    ('b, 'p1, 'p2) Phases.phase ->
    f:('-> 'b) -> '-> ('b, 'p1, 'p2) Phases.t
  val with_phase2 :
    ('c, 'p1, 'p2) Phases.phase ->
    f:('-> '-> 'c) -> '-> '-> ('c, 'p1, 'p2) Phases.t
  val bind :
    ('a, 'p_before, 'p_middle) Phases.t ->
    f:('-> ('b, 'p_middle, 'p_after) Phases.t) ->
    ('b, 'p_before, 'p_after) Phases.t
  val map :
    ('a, 'p1, 'p2) Phases.t -> f:('-> 'b) -> ('b, 'p1, 'p2) Phases.t
  val fold_l :
    f:('-> '-> ('a, 'p, 'p) Phases.t) ->
    x:'-> 'b list -> ('a, 'p, 'p) Phases.t
  val run_parallel :
    (Phases.errcode, 'p1, 'p2) Phases.t list ->
    (Phases.errcode, 'p1, 'p2) Phases.t
  module Infix :
    sig
      val ( >>= ) :
        ('a, 'p1, 'p2) Phases.t ->
        ('-> ('b, 'p2, 'p3) Phases.t) -> ('b, 'p1, 'p3) Phases.t
      val ( >>?= ) :
        'Phases.or_error ->
        ('-> ('b, 'p1, 'p2) Phases.t) -> ('b, 'p1, 'p2) Phases.t
      val ( >|= ) :
        ('a, 'p1, 'p2) Phases.t -> ('-> 'b) -> ('b, 'p1, 'p2) Phases.t
    end
  val ( >>= ) :
    ('a, 'p1, 'p2) t -> ('-> ('b, 'p2, 'p3) t) -> ('b, 'p1, 'p3) t
  val ( >>?= ) : 'a or_error -> ('-> ('b, 'p1, 'p2) t) -> ('b, 'p1, 'p2) t
  val ( >|= ) : ('a, 'p1, 'p2) t -> ('-> 'b) -> ('b, 'p1, 'p2) t
  val empty_state : Logtk.Flex_state.t
  val get : (Logtk.Flex_state.t, 'a, 'a) Phases.t
  val set : Logtk.Flex_state.t -> (unit, 'a, 'a) Phases.t
  val get_key : 'Logtk.Flex_state.key -> ('a, 'b, 'b) Phases.t
  val set_key : 'Logtk.Flex_state.key -> '-> (unit, 'b, 'b) Phases.t
  val update :
    f:(Logtk.Flex_state.t -> Logtk.Flex_state.t) -> (unit, 'a, 'a) Phases.t
  val run_with :
    Logtk.Flex_state.t ->
    ('a, [ `Init ], [ `Exit ]) Phases.t ->
    (Logtk.Flex_state.t * 'a) Phases.or_error
  val run :
    ('a, [ `Init ], [ `Exit ]) Phases.t ->
    (Logtk.Flex_state.t * 'a) Phases.or_error
  module Key : sig val cur_phase : Phases.any_phase Logtk.Flex_state.key end
end