sig
  type predicate
  val get_symbol : Predicate.predicate -> Term.symbol
  val get_declarations : Predicate.predicate -> Opt.declaration list
  val get_discrimination_hints :
    Predicate.predicate -> Opt.discrimination_values
  val get_delta_predicate : Predicate.predicate -> Predicate.predicate
  val get_main_predicate : Predicate.predicate -> Predicate.predicate
  val get_is_builtin : Predicate.predicate -> bool
  val get_all_bound_reader : Predicate.predicate -> Access.Reader.reader
  val get_writers : Predicate.predicate -> Access.Writer.writer list
  val has_delta_predicate : Predicate.predicate -> bool
  val assert_unit_clause : Predicate.predicate -> Term.term -> unit
  val add_declaration : Predicate.predicate -> Opt.declaration -> unit
  val extent_size : Predicate.predicate -> int
  val default_reader : Predicate.predicate -> Access.Reader.reader
  val applicability :
    Predicate.predicate -> Opt.binding_pattern -> Opt.applicability_value
  val choose_best_reader :
    Predicate.predicate -> Opt.binding_pattern -> Access.Reader.reader
  val ensure_ready_to_assert : Predicate.predicate -> unit
  val ensure_ready_to_run : Predicate.predicate -> unit
  val ensure_delta_ready_to_run : Predicate.predicate -> unit
  type predicate_table
  module PredicateTable :
    sig
      val find :
        Predicate.predicate_table -> Term.symbol -> Predicate.predicate
      val iter :
        (Term.symbol -> Predicate.predicate -> unit) ->
        Predicate.predicate_table -> unit
    end
  val make_predicate_table : unit -> Predicate.predicate_table
  val find_predicate :
    Predicate.predicate_table -> Term.symbol -> Predicate.predicate
  val abolish : Predicate.predicate_table -> Term.symbol -> unit
  val insert : Predicate.predicate -> Term.term -> Fact.entry -> unit
  val remove_variant : Predicate.predicate -> Term.term -> unit
  val clear_delta_predicate : Predicate.predicate -> unit
end