sig
  module Const : CONST
  type const = Const.t
  val set_debug : bool -> unit
  module T :
    sig
      type t = private
          Var of int
        | Apply of TopDown.S.const * TopDown.S.T.t array
      val mk_var : int -> TopDown.S.T.t
      val mk_const : TopDown.S.const -> TopDown.S.T.t
      val mk_apply : TopDown.S.const -> TopDown.S.T.t array -> TopDown.S.T.t
      val mk_apply_l : TopDown.S.const -> TopDown.S.T.t list -> TopDown.S.T.t
      val is_var : TopDown.S.T.t -> bool
      val is_apply : TopDown.S.T.t -> bool
      val is_const : TopDown.S.T.t -> bool
      val eq : TopDown.S.T.t -> TopDown.S.T.t -> bool
      val hash : TopDown.S.T.t -> int
      val ground : TopDown.S.T.t -> bool
      val vars : TopDown.S.T.t -> int list
      val max_var : TopDown.S.T.t -> int
      val head_symbol : TopDown.S.T.t -> TopDown.S.const
      val to_string : TopDown.S.T.t -> string
      val pp : Pervasives.out_channel -> TopDown.S.T.t -> unit
      val fmt : Format.formatter -> TopDown.S.T.t -> unit
      val pp_tuple : Pervasives.out_channel -> TopDown.S.T.t list -> unit
      module Tbl :
        sig
          type key = t
          type 'a t
          val create : int -> 'a t
          val clear : 'a t -> unit
          val reset : 'a t -> unit
          val copy : 'a t -> 'a t
          val add : 'a t -> key -> '-> unit
          val remove : 'a t -> key -> unit
          val find : 'a t -> key -> 'a
          val find_opt : 'a t -> key -> 'a option
          val find_all : 'a t -> key -> 'a list
          val replace : 'a t -> key -> '-> unit
          val mem : 'a t -> key -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val length : 'a t -> int
          val stats : 'a t -> Hashtbl.statistics
        end
    end
  module Lit :
    sig
      type aggregate = {
        left : TopDown.S.T.t;
        constructor : TopDown.S.const;
        var : TopDown.S.T.t;
        guard : TopDown.S.T.t;
      }
      type t =
          LitPos of TopDown.S.T.t
        | LitNeg of TopDown.S.T.t
        | LitAggr of TopDown.S.Lit.aggregate
      val mk_pos : TopDown.S.T.t -> TopDown.S.Lit.t
      val mk_neg : TopDown.S.T.t -> TopDown.S.Lit.t
      val mk : bool -> TopDown.S.T.t -> TopDown.S.Lit.t
      val mk_aggr :
        left:TopDown.S.T.t ->
        constructor:TopDown.S.const ->
        var:TopDown.S.T.t -> guard:TopDown.S.T.t -> TopDown.S.Lit.t
      val eq : TopDown.S.Lit.t -> TopDown.S.Lit.t -> bool
      val hash : TopDown.S.Lit.t -> int
      val to_term : TopDown.S.Lit.t -> TopDown.S.T.t
      val fmap :
        (TopDown.S.T.t -> TopDown.S.T.t) ->
        TopDown.S.Lit.t -> TopDown.S.Lit.t
      val to_string : TopDown.S.Lit.t -> string
      val pp : Pervasives.out_channel -> TopDown.S.Lit.t -> unit
      val fmt : Format.formatter -> TopDown.S.Lit.t -> unit
    end
  module C :
    sig
      type t = private { head : TopDown.S.T.t; body : TopDown.S.Lit.t list; }
      exception Unsafe
      val mk_clause : TopDown.S.T.t -> TopDown.S.Lit.t list -> TopDown.S.C.t
      val mk_fact : TopDown.S.T.t -> TopDown.S.C.t
      val eq : TopDown.S.C.t -> TopDown.S.C.t -> bool
      val hash : TopDown.S.C.t -> int
      val head_symbol : TopDown.S.C.t -> TopDown.S.const
      val max_var : TopDown.S.C.t -> int
      val fmap :
        (TopDown.S.T.t -> TopDown.S.T.t) -> TopDown.S.C.t -> TopDown.S.C.t
      val to_string : TopDown.S.C.t -> string
      val pp : Pervasives.out_channel -> TopDown.S.C.t -> unit
      val fmt : Format.formatter -> TopDown.S.C.t -> unit
      module Tbl :
        sig
          type key = t
          type 'a t
          val create : int -> 'a t
          val clear : 'a t -> unit
          val reset : 'a t -> unit
          val copy : 'a t -> 'a t
          val add : 'a t -> key -> '-> unit
          val remove : 'a t -> key -> unit
          val find : 'a t -> key -> 'a
          val find_opt : 'a t -> key -> 'a option
          val find_all : 'a t -> key -> 'a list
          val replace : 'a t -> key -> '-> unit
          val mem : 'a t -> key -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val length : 'a t -> int
          val stats : 'a t -> Hashtbl.statistics
        end
    end
  module Subst :
    sig
      type t
      type scope = int
      type renaming
      val empty : TopDown.S.Subst.t
      val bind :
        TopDown.S.Subst.t ->
        TopDown.S.T.t ->
        TopDown.S.Subst.scope ->
        TopDown.S.T.t -> TopDown.S.Subst.scope -> TopDown.S.Subst.t
      val deref :
        TopDown.S.Subst.t ->
        TopDown.S.T.t ->
        TopDown.S.Subst.scope -> TopDown.S.T.t * TopDown.S.Subst.scope
      val create_renaming : unit -> TopDown.S.Subst.renaming
      val reset_renaming : TopDown.S.Subst.renaming -> unit
      val rename :
        renaming:TopDown.S.Subst.renaming ->
        TopDown.S.T.t -> TopDown.S.Subst.scope -> TopDown.S.T.t
      val eval :
        TopDown.S.Subst.t ->
        renaming:TopDown.S.Subst.renaming ->
        TopDown.S.T.t -> TopDown.S.Subst.scope -> TopDown.S.T.t
      val eval_lit :
        TopDown.S.Subst.t ->
        renaming:TopDown.S.Subst.renaming ->
        TopDown.S.Lit.t -> TopDown.S.Subst.scope -> TopDown.S.Lit.t
      val eval_lits :
        TopDown.S.Subst.t ->
        renaming:TopDown.S.Subst.renaming ->
        TopDown.S.Lit.t list -> TopDown.S.Subst.scope -> TopDown.S.Lit.t list
      val eval_clause :
        TopDown.S.Subst.t ->
        renaming:TopDown.S.Subst.renaming ->
        TopDown.S.C.t -> TopDown.S.Subst.scope -> TopDown.S.C.t
    end
  type scope = TopDown.S.Subst.scope
  exception UnifFail
  val unify :
    ?oc:bool ->
    ?subst:TopDown.S.Subst.t ->
    TopDown.S.T.t ->
    TopDown.S.scope -> TopDown.S.T.t -> TopDown.S.scope -> TopDown.S.Subst.t
  val match_ :
    ?oc:bool ->
    ?subst:TopDown.S.Subst.t ->
    TopDown.S.T.t ->
    TopDown.S.scope -> TopDown.S.T.t -> TopDown.S.scope -> TopDown.S.Subst.t
  val alpha_equiv :
    ?subst:TopDown.S.Subst.t ->
    TopDown.S.T.t ->
    TopDown.S.scope -> TopDown.S.T.t -> TopDown.S.scope -> TopDown.S.Subst.t
  val are_alpha_equiv : TopDown.S.T.t -> TopDown.S.T.t -> bool
  val clause_are_alpha_equiv : TopDown.S.C.t -> TopDown.S.C.t -> bool
  module BuiltinFun :
    sig
      type t = TopDown.S.T.t -> TopDown.S.T.t option
      type map
      val create : unit -> TopDown.S.BuiltinFun.map
      val add :
        TopDown.S.BuiltinFun.map -> Const.t -> TopDown.S.BuiltinFun.t -> unit
      val add_list :
        TopDown.S.BuiltinFun.map ->
        (Const.t * TopDown.S.BuiltinFun.t) list -> unit
      val interpreted : TopDown.S.BuiltinFun.map -> Const.t -> bool
      val eval : TopDown.S.BuiltinFun.map -> TopDown.S.T.t -> TopDown.S.T.t
    end
  module TVariantTbl :
    sig
      type key = T.t
      type 'a t
      val create : int -> 'a t
      val clear : 'a t -> unit
      val reset : 'a t -> unit
      val copy : 'a t -> 'a t
      val add : 'a t -> key -> '-> unit
      val remove : 'a t -> key -> unit
      val find : 'a t -> key -> 'a
      val find_opt : 'a t -> key -> 'a option
      val find_all : 'a t -> key -> 'a list
      val replace : 'a t -> key -> '-> unit
      val mem : 'a t -> key -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val length : 'a t -> int
      val stats : 'a t -> Hashtbl.statistics
    end
  module CVariantTbl :
    sig
      type key = C.t
      type 'a t
      val create : int -> 'a t
      val clear : 'a t -> unit
      val reset : 'a t -> unit
      val copy : 'a t -> 'a t
      val add : 'a t -> key -> '-> unit
      val remove : 'a t -> key -> unit
      val find : 'a t -> key -> 'a
      val find_opt : 'a t -> key -> 'a option
      val find_all : 'a t -> key -> 'a list
      val replace : 'a t -> key -> '-> unit
      val mem : 'a t -> key -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val length : 'a t -> int
      val stats : 'a t -> Hashtbl.statistics
    end
  module Index :
    functor (Data : Hashtbl.HashedType->
      sig
        type t
        val empty : unit -> TopDown.S.Index.t
        val copy : TopDown.S.Index.t -> TopDown.S.Index.t
        val clear : TopDown.S.Index.t -> unit
        val add :
          TopDown.S.Index.t -> TopDown.S.T.t -> Data.t -> TopDown.S.Index.t
        val remove :
          TopDown.S.Index.t -> TopDown.S.T.t -> Data.t -> TopDown.S.Index.t
        val generalizations :
          ?oc:bool ->
          TopDown.S.Index.t ->
          TopDown.S.scope ->
          TopDown.S.T.t ->
          TopDown.S.scope -> (Data.t -> TopDown.S.Subst.t -> unit) -> unit
        val unify :
          ?oc:bool ->
          TopDown.S.Index.t ->
          TopDown.S.scope ->
          TopDown.S.T.t ->
          TopDown.S.scope -> (Data.t -> TopDown.S.Subst.t -> unit) -> unit
        val iter :
          TopDown.S.Index.t -> (TopDown.S.T.t -> Data.t -> unit) -> unit
        val size : TopDown.S.Index.t -> int
      end
  module Rewriting :
    sig
      type rule = TopDown.S.T.t * TopDown.S.T.t
      type t
      val create : unit -> TopDown.S.Rewriting.t
      val copy : TopDown.S.Rewriting.t -> TopDown.S.Rewriting.t
      val add : TopDown.S.Rewriting.t -> TopDown.S.Rewriting.rule -> unit
      val add_list :
        TopDown.S.Rewriting.t -> TopDown.S.Rewriting.rule list -> unit
      val to_list : TopDown.S.Rewriting.t -> TopDown.S.Rewriting.rule list
      val rewrite_root :
        TopDown.S.Rewriting.t -> TopDown.S.T.t -> TopDown.S.T.t
      val rewrite : TopDown.S.Rewriting.t -> TopDown.S.T.t -> TopDown.S.T.t
    end
  exception NonStratifiedProgram
  module DB :
    sig
      type t
      type interpreter = TopDown.S.T.t -> TopDown.S.C.t list
      val create : ?parent:TopDown.S.DB.t -> unit -> TopDown.S.DB.t
      val copy : TopDown.S.DB.t -> TopDown.S.DB.t
      val clear : TopDown.S.DB.t -> unit
      val add_fact : TopDown.S.DB.t -> TopDown.S.T.t -> unit
      val add_facts : TopDown.S.DB.t -> TopDown.S.T.t list -> unit
      val add_clause : TopDown.S.DB.t -> TopDown.S.C.t -> unit
      val add_clauses : TopDown.S.DB.t -> TopDown.S.C.t list -> unit
      val interpret :
        ?help:string ->
        TopDown.S.DB.t -> TopDown.S.const -> TopDown.S.DB.interpreter -> unit
      val interpret_list :
        TopDown.S.DB.t ->
        (TopDown.S.const * string * TopDown.S.DB.interpreter) list -> unit
      val is_interpreted : TopDown.S.DB.t -> TopDown.S.const -> bool
      val add_builtin :
        TopDown.S.DB.t -> Const.t -> TopDown.S.BuiltinFun.t -> unit
      val builtin_funs : TopDown.S.DB.t -> TopDown.S.BuiltinFun.map
      val eval : TopDown.S.DB.t -> TopDown.S.T.t -> TopDown.S.T.t
      val help : TopDown.S.DB.t -> string list
      val num_facts : TopDown.S.DB.t -> int
      val num_clauses : TopDown.S.DB.t -> int
      val size : TopDown.S.DB.t -> int
      val find_facts :
        ?oc:bool ->
        TopDown.S.DB.t ->
        TopDown.S.scope ->
        TopDown.S.T.t ->
        TopDown.S.scope ->
        (TopDown.S.T.t -> TopDown.S.Subst.t -> unit) -> unit
      val find_clauses_head :
        ?oc:bool ->
        TopDown.S.DB.t ->
        TopDown.S.scope ->
        TopDown.S.T.t ->
        TopDown.S.scope ->
        (TopDown.S.C.t -> TopDown.S.Subst.t -> unit) -> unit
      val find_interpretation :
        ?oc:bool ->
        TopDown.S.DB.t ->
        TopDown.S.scope ->
        TopDown.S.T.t ->
        TopDown.S.scope ->
        (TopDown.S.C.t -> TopDown.S.Subst.t -> unit) -> unit
    end
  val ask :
    ?oc:bool ->
    ?with_rules:TopDown.S.C.t list ->
    ?with_facts:TopDown.S.T.t list ->
    TopDown.S.DB.t -> TopDown.S.T.t -> TopDown.S.T.t list
  val ask_lits :
    ?oc:bool ->
    ?with_rules:TopDown.S.C.t list ->
    ?with_facts:TopDown.S.T.t list ->
    TopDown.S.DB.t ->
    TopDown.S.T.t list -> TopDown.S.Lit.t list -> TopDown.S.T.t list
end