sig
  module type ARG =
    sig
      type t
      val equal : Traversal.ARG.t -> Traversal.ARG.t -> bool
      val hash : Traversal.ARG.t -> int
      val print : Traversal.ARG.t CCFormat.printer
      val section : Utils.Section.t
      val fail : ('a, Format.formatter, unit, 'b) Pervasives.format4 -> 'a
    end
  module Make :
    functor (T : TermInner.S) (Arg : ARG) (State : sig type t end->
      sig
        type term = T.t
        type ty = T.t
        type t
        type dispatch = {
          do_term :
            Traversal.Make.t ->
            depth:int -> Traversal.Make.term -> Traversal.Make.term;
          do_goal_or_axiom :
            (Traversal.Make.t ->
             depth:int ->
             [ `Axiom | `Goal ] -> Traversal.Make.term -> Traversal.Make.term)
            option;
          do_def :
            Traversal.Make.t ->
            depth:int ->
            (Traversal.Make.term, Traversal.Make.ty) Statement.rec_def ->
            Arg.t ->
            (Traversal.Make.term, Traversal.Make.ty) Statement.rec_def;
          do_pred :
            Traversal.Make.t ->
            depth:int ->
            [ `Not_wf | `Wf ] ->
            [ `Copred | `Pred ] ->
            (Traversal.Make.term, Traversal.Make.ty) Statement.pred_def ->
            Arg.t ->
            (Traversal.Make.term, Traversal.Make.ty) Statement.pred_def;
          do_copy :
            (Traversal.Make.t ->
             depth:int ->
             loc:Location.t option ->
             (Traversal.Make.term, Traversal.Make.ty) Statement.copy ->
             Arg.t -> (Traversal.Make.term, Traversal.Make.ty) Statement.copy)
            option;
          do_spec :
            (Traversal.Make.t ->
             depth:int ->
             loc:Location.t option ->
             ID.t ->
             (Traversal.Make.term, Traversal.Make.ty) Statement.spec_defs ->
             Arg.t ->
             (Traversal.Make.term, Traversal.Make.ty) Statement.spec_defs)
            option;
          do_data :
            (Traversal.Make.t ->
             depth:int ->
             [ `Codata | `Data ] ->
             Traversal.Make.term Statement.tydef ->
             Arg.t -> Traversal.Make.term Statement.tydef)
            option;
          do_ty_def :
            (Traversal.Make.t ->
             ?loc:Location.t ->
             attrs:Statement.decl_attr list ->
             ID.t ->
             ty:Traversal.Make.ty ->
             Arg.t -> ID.t * Traversal.Make.ty * Statement.decl_attr list)
            option;
        }
        val create :
          ?size:int ->
          ?max_depth:int ->
          env:(Traversal.Make.term, Traversal.Make.ty) Env.t ->
          state:State.t ->
          dispatch:Traversal.Make.dispatch -> unit -> Traversal.Make.t
        val env :
          Traversal.Make.t -> (Traversal.Make.term, Traversal.Make.ty) Env.t
        val state : Traversal.Make.t -> State.t
        val has_processed : Traversal.Make.t -> ID.t -> Arg.t -> bool
        val mark_processed : Traversal.Make.t -> ID.t -> Arg.t -> unit
        val processed : Traversal.Make.t -> (ID.t * Arg.t) Sequence.t
        val call_dep : Traversal.Make.t -> depth:int -> ID.t -> Arg.t -> unit
        exception CannotTraverse
        val traverse_stmt :
          ?after_env:((Traversal.Make.term, Traversal.Make.ty) Env.t -> unit) ->
          Traversal.Make.t ->
          (Traversal.Make.term, Traversal.Make.ty) Statement.t -> unit
        val get_statements :
          Traversal.Make.t ->
          (Traversal.Make.term, Traversal.Make.ty) Statement.t
          CCVector.vector
        val max_depth_reached : Traversal.Make.t -> bool
      end
end