sig
  type 'a term
  type pred
  val e_int : int -> integer term
  val e_call : string -> abstract term list -> abstract term
  val p_call : string -> abstract term list -> pred
  val wrap : 'a term -> abstract term
  val unwrap : abstract term -> 'a term
  val e_true : Formula.boolean term
  val e_false : Formula.boolean term
  val e_int : int -> Formula.integer term
  val e_float : float -> Formula.real term
  val e_icst : string -> Formula.integer term
  val e_rcst : string -> Formula.real term
  val e_int64 : int64 -> Formula.integer term
  val e_ineg : Formula.integer term -> Formula.integer term
  val e_rneg : Formula.real term -> Formula.real term
  val e_iop :
    Formula.integer_op ->
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val e_rop :
    Formula.real_op ->
    Formula.real term -> Formula.real term -> Formula.real term
  val e_icmp :
    Formula.cmp_op ->
    Formula.integer term -> Formula.integer term -> Formula.boolean term
  val e_rcmp :
    Formula.cmp_op ->
    Formula.real term -> Formula.real term -> Formula.boolean term
  val p_icmp :
    Formula.cmp_op -> Formula.integer term -> Formula.integer term -> pred
  val p_rcmp :
    Formula.cmp_op -> Formula.real term -> Formula.real term -> pred
  val e_bnot : Formula.integer term -> Formula.integer term
  val e_band :
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val e_bor :
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val e_bxor :
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val e_lshift :
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val e_rshift :
    Formula.integer term -> Formula.integer term -> Formula.integer term
  val integer_of_real : Formula.real term -> Formula.integer term
  val real_of_integer : Formula.integer term -> Formula.real term
  val e_bool : Formula.boolean term -> Formula.integer term
  val e_not : Formula.boolean term -> Formula.boolean term
  val e_and :
    Formula.boolean term -> Formula.boolean term -> Formula.boolean term
  val e_or :
    Formula.boolean term -> Formula.boolean term -> Formula.boolean term
  val e_cond : Formula.boolean term -> 'a term -> 'a term -> 'a term
  val p_cond : Formula.boolean term -> pred -> pred -> pred
  val p_true : pred
  val p_false : pred
  val p_bool : Formula.boolean term -> pred
  val p_and : pred -> pred -> pred
  val p_or : pred -> pred -> pred
  val p_xor : pred -> pred -> pred
  val p_not : pred -> pred
  val p_implies : pred -> pred -> pred
  val p_iff : pred -> pred -> pred
  val p_eq : 'a term -> 'a term -> pred
  val p_neq : 'a term -> 'a term -> pred
  val p_conj : pred list -> pred
  val p_disj : pred list -> pred
  val p_named : string -> pred -> pred
  val is_true : pred -> bool
  val is_false : pred -> bool
  val huge_term : int -> 'a term -> bool
  val huge_pred : int -> pred -> bool
  type var
  type pool
  val pool : unit -> Formula.S.pool
  val fresh : Formula.S.pool -> string -> Formula.kind -> Formula.S.var
  val freshen : Formula.S.pool -> Formula.S.var -> Formula.S.var
  val var : Formula.S.var -> 'a term
  val eq_var : Formula.S.var -> Formula.S.var -> bool
  val name_of_var : Formula.S.var -> string
  val tau_of_var : Formula.S.var -> Formula.tau
  val kind_of_var : Formula.S.var -> Formula.kind
  val term_has_var : Formula.S.var list -> 'a term -> bool
  val pred_has_var : Formula.S.var list -> pred -> bool
  val term_closed : 'a term -> bool
  val pred_closed : pred -> bool
  val p_forall : Formula.S.var list -> pred -> pred
  val p_exists : Formula.S.var list -> pred -> pred
  val p_subst :
    (Formula.S.var -> Formula.S.var option) ->
    Formula.S.var -> 'a term -> pred -> pred
  val e_subst :
    (Formula.S.var -> Formula.S.var option) ->
    Formula.S.var -> 'a term -> 'b term -> 'b term
  val e_rename : (Formula.S.var * Formula.S.var) list -> 'a term -> 'a term
  val equal_terms : 'a term -> 'a term -> bool
  type alpha
  val empty_alpha : Formula.S.alpha
  val fold_alpha :
    (Formula.S.var -> Formula.S.var -> '-> 'a) ->
    Formula.S.alpha -> '-> 'a
  val p_more_alpha_cv : Formula.S.alpha -> pred -> Formula.S.alpha * pred
  val p_alpha_cv : pred -> Formula.S.var list * pred
  val pp_var : Format.formatter -> Formula.S.var -> unit
  val pp_term : Format.formatter -> 'a term -> unit
  val pp_pred : Format.formatter -> pred -> unit
  val pp_decl : Format.formatter -> pred Formula.declaration -> unit
  val pp_goal : Format.formatter -> string -> pred -> unit
end