sig
  type term = Term.term
  type literal = Term.literal
  exception ITERATOR_EMPTY
  val index_offset : int
  val query_offset : int
  class virtual ['a] data :
    object
      method virtual is_equal : '-> '-> bool
      method virtual to_string : '-> string
    end
  class virtual ['a] iterator :
    object method virtual is_empty : bool method virtual next : 'end
  class type ['a] predicate_index =
    object
      method add : ?no_duplicates:bool -> Term_indexing.term -> '-> unit
      method clear : unit
      method find : Term_indexing.term -> 'a option
      method find_all_generalizations :
        p_preserving:bool -> Term_indexing.term -> 'a list
      method find_all_instances :
        p_preserving:bool -> Term_indexing.term -> 'a list
      method find_all_shielding :
        Term_indexing.term -> Term_indexing.term -> 'a list
      method find_all_unifiable :
        p_preserving:bool -> Term_indexing.term -> 'a list
      method find_all_unifiable_subst :
        p_preserving:bool -> Term_indexing.term -> ('a * Subst.subst) list
      method find_all_variants : Term_indexing.term -> 'a list
      method find_generalization :
        p_preserving:bool -> Term_indexing.term -> 'a option
      method find_instance :
        p_preserving:bool -> Term_indexing.term -> 'a option
      method find_shielding :
        Term_indexing.term -> Term_indexing.term -> 'a option
      method find_strongly_shielding :
        Term_indexing.term -> Term_indexing.term -> 'a option
      method find_unifiable :
        p_preserving:bool -> Term_indexing.term -> 'a option
      method fold : ('-> Term_indexing.term -> '-> 'b) -> '-> 'b
      method get_generalization_iterator :
        p_preserving:bool -> Term_indexing.term -> 'Term_indexing.iterator
      method get_shielding_iterator :
        Term_indexing.term -> Term_indexing.term -> 'Term_indexing.iterator
      method iter : (Term_indexing.term -> '-> unit) -> unit
      method remove : Term_indexing.term -> 'a option -> bool
      method size : int
      method to_string : string
    end
  class ['a] index :
    'Term_indexing.data ->
    ('Term_indexing.data -> 'Term_indexing.predicate_index) ->
    object
      method find : Term_indexing.literal -> 'Term_indexing.predicate_index
      method fold :
        ('->
         Term_indexing.literal -> 'Term_indexing.predicate_index -> 'b) ->
        '-> 'b
      method is_empty : bool
      method iter :
        (Term_indexing.literal -> 'Term_indexing.predicate_index -> unit) ->
        unit
    end
end