sig
  module type LayeredIndex =
    sig
      type entry
      type index
      val make_index : unit -> LayeredIndex.LayeredIndex.index
      val clear : LayeredIndex.LayeredIndex.index -> unit
      val insert :
        LayeredIndex.LayeredIndex.index ->
        Term.term -> LayeredIndex.LayeredIndex.entry -> unit
      val remove_variant :
        LayeredIndex.LayeredIndex.index -> Term.term -> unit
      val iter_all :
        (LayeredIndex.LayeredIndex.entry -> unit) ->
        LayeredIndex.LayeredIndex.index -> unit
      val iter_all_and_throw_away :
        (LayeredIndex.LayeredIndex.entry -> unit) ->
        LayeredIndex.LayeredIndex.index -> unit
      val iter_instance_candidates :
        (LayeredIndex.LayeredIndex.entry -> unit) ->
        LayeredIndex.LayeredIndex.index -> Term.term -> Term.context -> unit
      val iter_generalization_candidates :
        (LayeredIndex.LayeredIndex.entry -> unit) ->
        LayeredIndex.LayeredIndex.index -> Term.term -> Term.context -> unit
      val iter_unification_candidates :
        (LayeredIndex.LayeredIndex.entry -> unit) ->
        LayeredIndex.LayeredIndex.index -> Term.term -> Term.context -> unit
      val size : LayeredIndex.LayeredIndex.index -> int
      type state
      val obtain_state :
        LayeredIndex.LayeredIndex.index -> LayeredIndex.LayeredIndex.state
      val install_state : LayeredIndex.LayeredIndex.state -> unit
      val add_layer :
        LayeredIndex.LayeredIndex.state -> LayeredIndex.LayeredIndex.state
      val new_layer :
        LayeredIndex.LayeredIndex.index -> LayeredIndex.LayeredIndex.state
    end
  module Make :
    functor (LayerType : Index.Index->
      sig
        type entry = LayerType.entry
        type index
        val make_index : unit -> index
        val clear : index -> unit
        val insert : index -> Term.term -> entry -> unit
        val remove_variant : index -> Term.term -> unit
        val iter_all : (entry -> unit) -> index -> unit
        val iter_all_and_throw_away : (entry -> unit) -> index -> unit
        val iter_instance_candidates :
          (entry -> unit) -> index -> Term.term -> Term.context -> unit
        val iter_generalization_candidates :
          (entry -> unit) -> index -> Term.term -> Term.context -> unit
        val iter_unification_candidates :
          (entry -> unit) -> index -> Term.term -> Term.context -> unit
        val size : index -> int
        type state
        val obtain_state : index -> state
        val install_state : state -> unit
        val add_layer : state -> state
        val new_layer : index -> state
      end
end