sig
  type 'a context
  module Env :
    sig
      type 'a t
      val empty : 'Syntax.Env.t
      val push : '-> 'Syntax.Env.t -> 'Syntax.Env.t
      val find : 'Syntax.Env.t -> int -> 'a
      val enum : 'Syntax.Env.t -> 'BatEnum.t
    end
  type typ_arith = [ `TyInt | `TyReal ]
  type typ_fo = [ `TyBool | `TyInt | `TyReal ]
  type typ =
      [ `TyBool
      | `TyFun of Syntax.typ_fo list * Syntax.typ_fo
      | `TyInt
      | `TyReal ]
  type typ_bool = [ `TyBool ]
  type 'a typ_fun = [ `TyFun of Syntax.typ_fo list * 'a ]
  val pp_typ : Format.formatter -> [< Syntax.typ ] -> unit
  type symbol
  val mk_symbol :
    'Syntax.context -> ?name:string -> Syntax.typ -> Syntax.symbol
  val register_named_symbol :
    'Syntax.context -> string -> Syntax.typ -> unit
  val is_registered_name : 'Syntax.context -> string -> bool
  val get_named_symbol : 'Syntax.context -> string -> Syntax.symbol
  val symbol_name : 'Syntax.context -> Syntax.symbol -> string option
  val pp_symbol :
    'Syntax.context -> Format.formatter -> Syntax.symbol -> unit
  val typ_symbol : 'Syntax.context -> Syntax.symbol -> Syntax.typ
  val show_symbol : 'Syntax.context -> Syntax.symbol -> string
  val int_of_symbol : Syntax.symbol -> int
  val symbol_of_int : int -> Syntax.symbol
  val compare_symbol : Syntax.symbol -> Syntax.symbol -> int
  module Symbol :
    sig
      type t = Syntax.symbol
      val compare : Syntax.Symbol.t -> Syntax.Symbol.t -> int
      module Set :
        sig
          type elt = symbol
          type t
          val empty : t
          val is_empty : t -> bool
          val singleton : elt -> t
          val mem : elt -> t -> bool
          val find : elt -> t -> elt
          val add : elt -> t -> t
          val remove : elt -> t -> t
          val update : elt -> elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val sym_diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val disjoint : t -> t -> bool
          val compare_subset : t -> t -> int
          val iter : (elt -> unit) -> t -> unit
          val at_rank_exn : int -> t -> elt
          val map : (elt -> elt) -> t -> t
          val filter : (elt -> bool) -> t -> t
          val filter_map : (elt -> elt option) -> t -> t
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val partition : (elt -> bool) -> t -> t * t
          val split : elt -> t -> t * bool * t
          val split_opt : elt -> t -> t * elt option * t
          val split_lt : elt -> t -> t * t
          val split_le : elt -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val to_list : t -> elt list
          val to_array : t -> elt array
          val min_elt : t -> elt
          val pop_min : t -> elt * t
          val pop_max : t -> elt * t
          val max_elt : t -> elt
          val choose : t -> elt
          val pop : t -> elt * t
          val enum : t -> elt BatEnum.t
          val backwards : t -> elt BatEnum.t
          val of_enum : elt BatEnum.t -> t
          val of_list : elt list -> t
          val of_array : elt array -> t
          val print :
            ?first:string ->
            ?last:string ->
            ?sep:string ->
            ('BatInnerIO.output -> elt -> unit) ->
            'BatInnerIO.output -> t -> unit
          module Infix :
            sig
              val ( <-- ) : t -> elt -> t
              val ( <. ) : t -> t -> bool
              val ( >. ) : t -> t -> bool
              val ( <=. ) : t -> t -> bool
              val ( >=. ) : t -> t -> bool
              val ( -. ) : t -> t -> t
              val ( &&. ) : t -> t -> t
              val ( ||. ) : t -> t -> t
            end
          module Exceptionless :
            sig
              val min_elt : t -> elt option
              val max_elt : t -> elt option
              val choose : t -> elt option
              val find : elt -> t -> elt option
            end
          module Labels :
            sig
              val iter : f:(elt -> unit) -> t -> unit
              val fold : f:(elt -> '-> 'a) -> t -> init:'-> 'a
              val for_all : f:(elt -> bool) -> t -> bool
              val exists : f:(elt -> bool) -> t -> bool
              val map : f:(elt -> elt) -> t -> t
              val filter : f:(elt -> bool) -> t -> t
              val filter_map : f:(elt -> elt option) -> t -> t
              val partition : f:(elt -> bool) -> t -> t * t
            end
        end
      module Map :
        sig
          type key = symbol
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val cardinal : 'a t -> int
          val add : key -> '-> 'a t -> 'a t
          val update : key -> key -> '-> 'a t -> 'a t
          val find : key -> 'a t -> 'a
          val remove : key -> 'a t -> 'a t
          val modify : key -> ('-> 'a) -> 'a t -> 'a t
          val modify_def : '-> key -> ('-> 'a) -> 'a t -> 'a t
          val modify_opt : key -> ('a option -> 'a option) -> 'a t -> 'a t
          val extract : key -> 'a t -> 'a * 'a t
          val pop : 'a t -> (key * 'a) * 'a t
          val mem : key -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val filterv : ('-> bool) -> 'a t -> 'a t
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val filter_map : (key -> '-> 'b option) -> 'a t -> 'b t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val keys : 'a t -> key BatEnum.t
          val values : 'a t -> 'BatEnum.t
          val min_binding : 'a t -> key * 'a
          val pop_min_binding : 'a t -> (key * 'a) * 'a t
          val max_binding : 'a t -> key * 'a
          val pop_max_binding : 'a t -> (key * 'a) * 'a t
          val choose : 'a t -> key * 'a
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val singleton : key -> '-> 'a t
          val bindings : 'a t -> (key * 'a) list
          val enum : 'a t -> (key * 'a) BatEnum.t
          val backwards : 'a t -> (key * 'a) BatEnum.t
          val of_enum : (key * 'a) BatEnum.t -> 'a t
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val print :
            ?first:string ->
            ?last:string ->
            ?sep:string ->
            ?kvsep:string ->
            ('BatInnerIO.output -> key -> unit) ->
            ('BatInnerIO.output -> '-> unit) ->
            'BatInnerIO.output -> 'c t -> unit
          module Exceptionless : sig val find : key -> 'a t -> 'a option end
          module Infix :
            sig
              val ( --> ) : 'a t -> key -> 'a
              val ( <-- ) : 'a t -> key * '-> 'a t
            end
          module Labels :
            sig
              val add : key:key -> data:'-> 'a t -> 'a t
              val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
              val map : f:('-> 'b) -> 'a t -> 'b t
              val mapi : f:(key:key -> data:'-> 'b) -> 'a t -> 'b t
              val filterv : f:('-> bool) -> 'a t -> 'a t
              val filter : f:(key -> '-> bool) -> 'a t -> 'a t
              val fold :
                f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
              val compare : cmp:('-> '-> int) -> 'a t -> 'a t -> int
              val equal : cmp:('-> '-> bool) -> 'a t -> 'a t -> bool
            end
        end
    end
  type ('a, +'typ) expr
  type 'a term = ('a, Syntax.typ_arith) Syntax.expr
  type 'a formula = ('a, Syntax.typ_bool) Syntax.expr
  val compare_expr : ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr -> int
  val compare_formula : 'Syntax.formula -> 'Syntax.formula -> int
  val compare_term : 'Syntax.term -> 'Syntax.term -> int
  val destruct :
    'Syntax.context ->
    ('a, 'b) Syntax.expr ->
    [ `Add of 'Syntax.term list
    | `And of 'Syntax.formula list
    | `App of Syntax.symbol * ('a, Syntax.typ_fo) Syntax.expr list
    | `Atom of [ `Eq | `Leq | `Lt ] * 'Syntax.term * 'Syntax.term
    | `Binop of [ `Div | `Mod ] * 'Syntax.term * 'Syntax.term
    | `Fls
    | `Ite of 'Syntax.formula * ('a, 'b) Syntax.expr * ('a, 'b) Syntax.expr
    | `Mul of 'Syntax.term list
    | `Not of 'Syntax.formula
    | `Or of 'Syntax.formula list
    | `Proposition of
        [ `App of Syntax.symbol * ('b, Syntax.typ_fo) Syntax.expr list
        | `Var of int ]
    | `Quantify of
        [ `Exists | `Forall ] * string * Syntax.typ_fo * 'Syntax.formula
    | `Real of QQ.t
    | `Tru
    | `Unop of [ `Floor | `Neg ] * 'Syntax.term
    | `Var of int * Syntax.typ_arith ]
  val expr_typ : 'Syntax.context -> ('a, 'b) Syntax.expr -> Syntax.typ
  val free_vars : ('a, 'b) Syntax.expr -> (int, Syntax.typ_fo) BatHashtbl.t
  val size : ('a, 'b) Syntax.expr -> int
  val mk_const : 'Syntax.context -> Syntax.symbol -> ('a, 'typ) Syntax.expr
  val mk_app :
    'Syntax.context ->
    Syntax.symbol -> ('a, 'b) Syntax.expr list -> ('a, 'typ) Syntax.expr
  val mk_var :
    'Syntax.context -> int -> Syntax.typ_fo -> ('a, 'typ) Syntax.expr
  val mk_ite :
    'Syntax.context ->
    'Syntax.formula ->
    ('a, 'typ) Syntax.expr ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val mk_if :
    'Syntax.context ->
    'Syntax.formula -> 'Syntax.formula -> 'Syntax.formula
  val mk_iff :
    'Syntax.context ->
    'Syntax.formula -> 'Syntax.formula -> 'Syntax.formula
  val substitute :
    'Syntax.context ->
    (int -> ('a, 'b) Syntax.expr) ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val substitute_const :
    'Syntax.context ->
    (Syntax.symbol -> ('a, 'b) Syntax.expr) ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val substitute_map :
    'Syntax.context ->
    ('a, 'b) Syntax.expr Syntax.Symbol.Map.t ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val fold_constants :
    (Syntax.symbol -> '-> 'a) -> ('b, 'c) Syntax.expr -> '-> 'a
  val symbols : ('a, 'b) Syntax.expr -> Syntax.Symbol.Set.t
  type 'a rewriter =
      ('a, Syntax.typ_fo) Syntax.expr -> ('a, Syntax.typ_fo) Syntax.expr
  val rewrite :
    'Syntax.context ->
    ?down:'Syntax.rewriter ->
    ?up:'Syntax.rewriter ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val nnf_rewriter : 'Syntax.context -> 'Syntax.rewriter
  module Expr :
    sig
      val equal : ('a, 'b) Syntax.expr -> ('a, 'b) Syntax.expr -> bool
      val compare : ('a, 'b) Syntax.expr -> ('a, 'b) Syntax.expr -> int
      val pp :
        ?env:string Syntax.Env.t ->
        'Syntax.context -> Format.formatter -> ('a, 'b) Syntax.expr -> unit
      val refine :
        'Syntax.context ->
        ('a, Syntax.typ_fo) Syntax.expr ->
        [ `Formula of 'Syntax.formula | `Term of 'Syntax.term ]
      module HT :
        sig
          type ('a, 'typ, 'b) t
          val create : int -> ('a, 'typ, 'b) Syntax.Expr.HT.t
          val add :
            ('a, 'typ, 'b) Syntax.Expr.HT.t ->
            ('a, 'typ) Syntax.expr -> '-> unit
          val replace :
            ('a, 'typ, 'b) Syntax.Expr.HT.t ->
            ('a, 'typ) Syntax.expr -> '-> unit
          val remove :
            ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> unit
          val find :
            ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> 'b
          val mem :
            ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> bool
          val keys :
            ('a, 'typ, 'b) Syntax.Expr.HT.t ->
            ('a, 'typ) Syntax.expr BatEnum.t
          val values : ('a, 'typ, 'b) Syntax.Expr.HT.t -> 'BatEnum.t
          val enum :
            ('a, 'typ, 'b) Syntax.Expr.HT.t ->
            (('a, 'typ) Syntax.expr * 'b) BatEnum.t
        end
      module Set :
        sig
          type ('a, 'typ) t
          val empty : ('a, 'typ) Syntax.Expr.Set.t
          val add :
            ('a, 'typ) Syntax.expr ->
            ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
          val union :
            ('a, 'typ) Syntax.Expr.Set.t ->
            ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
          val inter :
            ('a, 'typ) Syntax.Expr.Set.t ->
            ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
          val enum :
            ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.expr BatEnum.t
          val mem :
            ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.Expr.Set.t -> bool
        end
      module Map :
        sig
          type ('a, 'typ, 'b) t
          val empty : ('a, 'typ, 'b) Syntax.Expr.Map.t
          val is_empty : ('a, 'typ, 'b) Syntax.Expr.Map.t -> bool
          val add :
            ('a, 'typ) Syntax.expr ->
            '->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t
          val remove :
            ('a, 'typ) Syntax.expr ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t
          val filter :
            (('a, 'typ) Syntax.expr -> '-> bool) ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t
          val filter_map :
            (('a, 'typ) Syntax.expr -> '-> 'c option) ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'c) Syntax.Expr.Map.t
          val map :
            ('-> 'c) ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'c) Syntax.Expr.Map.t
          val find :
            ('a, 'typ) Syntax.expr -> ('a, 'typ, 'b) Syntax.Expr.Map.t -> 'b
          val keys :
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ) Syntax.expr BatEnum.t
          val values : ('a, 'typ, 'b) Syntax.Expr.Map.t -> 'BatEnum.t
          val enum :
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            (('a, 'typ) Syntax.expr * 'b) BatEnum.t
          val merge :
            (('a, 'typ) Syntax.expr -> 'b option -> 'c option -> 'd option) ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t ->
            ('a, 'typ, 'c) Syntax.Expr.Map.t ->
            ('a, 'typ, 'd) Syntax.Expr.Map.t
          val fold :
            (('a, 'typ) Syntax.expr -> '-> '-> 'c) ->
            ('a, 'typ, 'b) Syntax.Expr.Map.t -> '-> 'c
        end
    end
  type ('a, 'b) open_term =
      [ `Add of 'a list
      | `App of Syntax.symbol * ('b, Syntax.typ_fo) Syntax.expr list
      | `Binop of [ `Div | `Mod ] * 'a * 'a
      | `Ite of 'Syntax.formula * 'a * 'a
      | `Mul of 'a list
      | `Real of QQ.t
      | `Unop of [ `Floor | `Neg ] * 'a
      | `Var of int * Syntax.typ_arith ]
  val mk_add : 'Syntax.context -> 'Syntax.term list -> 'Syntax.term
  val mk_mul : 'Syntax.context -> 'Syntax.term list -> 'Syntax.term
  val mk_div :
    'Syntax.context -> 'Syntax.term -> 'Syntax.term -> 'Syntax.term
  val mk_pow : 'Syntax.context -> 'Syntax.term -> int -> 'Syntax.term
  val mk_idiv :
    'Syntax.context -> 'Syntax.term -> 'Syntax.term -> 'Syntax.term
  val mk_mod :
    'Syntax.context -> 'Syntax.term -> 'Syntax.term -> 'Syntax.term
  val mk_real : 'Syntax.context -> QQ.t -> 'Syntax.term
  val mk_floor : 'Syntax.context -> 'Syntax.term -> 'Syntax.term
  val mk_ceiling : 'Syntax.context -> 'Syntax.term -> 'Syntax.term
  val mk_truncate : 'Syntax.context -> 'Syntax.term -> 'Syntax.term
  val mk_neg : 'Syntax.context -> 'Syntax.term -> 'Syntax.term
  val mk_sub :
    'Syntax.context -> 'Syntax.term -> 'Syntax.term -> 'Syntax.term
  val term_typ : 'Syntax.context -> 'Syntax.term -> Syntax.typ_arith
  module Term :
    sig
      type 'a t = 'Syntax.term
      val equal : 'Syntax.term -> 'Syntax.term -> bool
      val compare : 'Syntax.term -> 'Syntax.term -> int
      val hash : 'Syntax.term -> int
      val pp :
        ?env:string Syntax.Env.t ->
        'Syntax.context -> Format.formatter -> 'Syntax.term -> unit
      val show :
        ?env:string Syntax.Env.t ->
        'Syntax.context -> 'Syntax.term -> string
      val destruct :
        'Syntax.context ->
        'Syntax.term -> ('Syntax.term, 'a) Syntax.open_term
      val eval :
        'Syntax.context ->
        (('b, 'a) Syntax.open_term -> 'b) -> 'Syntax.term -> 'b
      val eval_partial :
        'Syntax.context ->
        (('b, 'a) Syntax.open_term -> 'b option) ->
        'Syntax.term -> 'b option
    end
  type ('a, 'b) open_formula =
      [ `And of 'a list
      | `Atom of [ `Eq | `Leq | `Lt ] * 'Syntax.term * 'Syntax.term
      | `Fls
      | `Ite of 'a * 'a * 'a
      | `Not of 'a
      | `Or of 'a list
      | `Proposition of
          [ `App of Syntax.symbol * ('b, Syntax.typ_fo) Syntax.expr list
          | `Var of int ]
      | `Quantify of [ `Exists | `Forall ] * string * Syntax.typ_fo * 'a
      | `Tru ]
  val mk_forall :
    'Syntax.context ->
    ?name:string -> Syntax.typ_fo -> 'Syntax.formula -> 'Syntax.formula
  val mk_exists :
    'Syntax.context ->
    ?name:string -> Syntax.typ_fo -> 'Syntax.formula -> 'Syntax.formula
  val mk_forall_const :
    'Syntax.context ->
    Syntax.symbol -> 'Syntax.formula -> 'Syntax.formula
  val mk_exists_const :
    'Syntax.context ->
    Syntax.symbol -> 'Syntax.formula -> 'Syntax.formula
  val mk_and :
    'Syntax.context -> 'Syntax.formula list -> 'Syntax.formula
  val mk_or :
    'Syntax.context -> 'Syntax.formula list -> 'Syntax.formula
  val mk_not : 'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
  val mk_eq :
    'Syntax.context ->
    'Syntax.term -> 'Syntax.term -> 'Syntax.formula
  val mk_lt :
    'Syntax.context ->
    'Syntax.term -> 'Syntax.term -> 'Syntax.formula
  val mk_leq :
    'Syntax.context ->
    'Syntax.term -> 'Syntax.term -> 'Syntax.formula
  val mk_true : 'Syntax.context -> 'Syntax.formula
  val mk_false : 'Syntax.context -> 'Syntax.formula
  val eliminate_ite :
    'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
  val pp_smtlib2 :
    ?env:string Syntax.Env.t ->
    'Syntax.context -> Format.formatter -> 'Syntax.formula -> unit
  module Formula :
    sig
      type 'a t = 'Syntax.formula
      val equal : 'Syntax.formula -> 'Syntax.formula -> bool
      val compare : 'Syntax.formula -> 'Syntax.formula -> int
      val hash : 'Syntax.formula -> int
      val pp :
        ?env:string Syntax.Env.t ->
        'Syntax.context -> Format.formatter -> 'Syntax.formula -> unit
      val show :
        ?env:string Syntax.Env.t ->
        'Syntax.context -> 'Syntax.formula -> string
      val destruct :
        'Syntax.context ->
        'Syntax.formula -> ('Syntax.formula, 'a) Syntax.open_formula
      val eval :
        'Syntax.context ->
        (('b, 'a) Syntax.open_formula -> 'b) -> 'Syntax.formula -> 'b
      val eval_memo :
        'Syntax.context ->
        (('b, 'a) Syntax.open_formula -> 'b) -> 'Syntax.formula -> 'b
      val existential_closure :
        'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
      val universal_closure :
        'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
      val skolemize_free :
        'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
      val prenex :
        'Syntax.context -> 'Syntax.formula -> 'Syntax.formula
    end
  module type Context =
    sig
      type t
      val context : Syntax.Context.t Syntax.context
      type term = (Syntax.Context.t, Syntax.typ_arith) Syntax.expr
      type formula = (Syntax.Context.t, Syntax.typ_bool) Syntax.expr
      val mk_symbol : ?name:string -> Syntax.typ -> Syntax.symbol
      val mk_const : Syntax.symbol -> (Syntax.Context.t, 'typ) Syntax.expr
      val mk_app :
        Syntax.symbol ->
        (Syntax.Context.t, 'b) Syntax.expr list ->
        (Syntax.Context.t, 'typ) Syntax.expr
      val mk_var :
        int -> Syntax.typ_fo -> (Syntax.Context.t, 'typ) Syntax.expr
      val mk_add : Syntax.Context.term list -> Syntax.Context.term
      val mk_mul : Syntax.Context.term list -> Syntax.Context.term
      val mk_div :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.term
      val mk_idiv :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.term
      val mk_mod :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.term
      val mk_real : QQ.t -> Syntax.Context.term
      val mk_floor : Syntax.Context.term -> Syntax.Context.term
      val mk_neg : Syntax.Context.term -> Syntax.Context.term
      val mk_sub :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.term
      val mk_forall :
        ?name:string ->
        Syntax.typ_fo -> Syntax.Context.formula -> Syntax.Context.formula
      val mk_exists :
        ?name:string ->
        Syntax.typ_fo -> Syntax.Context.formula -> Syntax.Context.formula
      val mk_forall_const :
        Syntax.symbol -> Syntax.Context.formula -> Syntax.Context.formula
      val mk_exists_const :
        Syntax.symbol -> Syntax.Context.formula -> Syntax.Context.formula
      val mk_and : Syntax.Context.formula list -> Syntax.Context.formula
      val mk_or : Syntax.Context.formula list -> Syntax.Context.formula
      val mk_not : Syntax.Context.formula -> Syntax.Context.formula
      val mk_eq :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.formula
      val mk_lt :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.formula
      val mk_leq :
        Syntax.Context.term -> Syntax.Context.term -> Syntax.Context.formula
      val mk_true : Syntax.Context.formula
      val mk_false : Syntax.Context.formula
      val mk_ite :
        Syntax.Context.formula ->
        (Syntax.Context.t, 'a) Syntax.expr ->
        (Syntax.Context.t, 'a) Syntax.expr ->
        (Syntax.Context.t, 'a) Syntax.expr
    end
  module MakeContext : functor () -> Context
  module MakeSimplifyingContext : functor () -> Context
  module Infix :
    functor
      (C : sig type t val context : Syntax.Infix.t Syntax.context end->
      sig
        val exists :
          ?name:string ->
          Syntax.typ_fo -> C.t Syntax.formula -> C.t Syntax.formula
        val forall :
          ?name:string ->
          Syntax.typ_fo -> C.t Syntax.formula -> C.t Syntax.formula
        val ( ! ) : C.t Syntax.formula -> C.t Syntax.formula
        val ( && ) :
          C.t Syntax.formula -> C.t Syntax.formula -> C.t Syntax.formula
        val ( || ) :
          C.t Syntax.formula -> C.t Syntax.formula -> C.t Syntax.formula
        val ( < ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.formula
        val ( <= ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.formula
        val ( = ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.formula
        val tru : C.t Syntax.formula
        val fls : C.t Syntax.formula
        val ( + ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.term
        val ( - ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.term
        val ( * ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.term
        val ( / ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.term
        val ( mod ) : C.t Syntax.term -> C.t Syntax.term -> C.t Syntax.term
        val const : Syntax.symbol -> (C.t, 'typ) Syntax.expr
        val var : int -> Syntax.typ_fo -> (C.t, 'typ) Syntax.expr
      end
  module ContextTable :
    sig
      type 'a t
      val create : int -> 'Syntax.ContextTable.t
      val add : 'Syntax.ContextTable.t -> 'Syntax.context -> '-> unit
      val replace :
        'Syntax.ContextTable.t -> 'Syntax.context -> '-> unit
      val find : 'Syntax.ContextTable.t -> 'Syntax.context -> 'a
      val mem : 'Syntax.ContextTable.t -> 'Syntax.context -> bool
      val clear : 'Syntax.ContextTable.t -> unit
    end
end