sig
  type fvar = Caveat_fol.fvar
  type data =
    Caveat_fol.data = private
      D1null
    | D1base of data
    | D1addr of Cil_types.varinfo * Formula.tau
    | D1var of (Cil_types.varinfo * Clabels.c_label) option * fvar
    | D1depl of data * epath
    | D1shift of data * dterm
    | D1proj of data * epath
    | D1indir of data
    | D1mu of data * epath * dterm option
    | D1muRange of data * dterm
    | D1muI of data * dterm option * dterm option
    | D1muIrange of data * dterm
  and epath =
    Caveat_fol.epath =
      Pfield of Cil_types.fieldinfo
    | Pidx of dterm
  and dterm = data Fol.d_term
  val eq_data : data -> data -> bool
  val eq_var : fvar -> fvar -> bool
  val pp_data : Format.formatter -> data -> unit
  val pp_var : Format.formatter -> fvar -> unit
  type 'a term = dterm
  type pred = dterm Fol.t_pred
  val e_int : int -> Formula.integer term
  val e_call : string -> Formula.abstract term list -> Formula.abstract term
  val p_call : string -> Formula.abstract term list -> pred
  val wrap : 'a term -> Formula.abstract term
  val unwrap : Formula.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 = fvar
  type pool = unit
  val pool : unit -> pool
  val fresh : pool -> string -> Formula.kind -> var
  val freshen : pool -> var -> var
  val var : var -> 'a term
  val eq_var : var -> var -> bool
  val name_of_var : var -> string
  val tau_of_var : var -> Formula.tau
  val kind_of_var : var -> Formula.kind
  val term_has_var : var list -> 'a term -> bool
  val pred_has_var : var list -> pred -> bool
  val term_closed : 'a term -> bool
  val pred_closed : pred -> bool
  val p_forall : var list -> pred -> pred
  val p_exists : var list -> pred -> pred
  val p_subst : (var -> var option) -> var -> 'a term -> pred -> pred
  val e_subst : (var -> var option) -> var -> 'a term -> 'b term -> 'b term
  val e_rename : (var * var) list -> 'a term -> 'a term
  val equal_terms : 'a term -> 'a term -> bool
  type alpha = Caveat_fol.alpha
  val empty_alpha : alpha
  val fold_alpha : (var -> var -> '-> 'a) -> alpha -> '-> 'a
  val p_more_alpha_cv : alpha -> pred -> alpha * pred
  val p_alpha_cv : pred -> var list * pred
  val pp_var : Format.formatter -> 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
  val ctype_of_fvar : fvar -> Cil_types.typ option
  val data_of_cvar_at_l :
    fvar Cil_datatype.Varinfo.Hashtbl.t ->
    Clabels.c_label ->
    Cil_types.varinfo -> (Cil_types.varinfo -> Formula.tau) -> data
  val fvar_of_cvar_at :
    create:bool ->
    fvar Cil_datatype.Varinfo.Hashtbl.t ->
    Clabels.c_label ->
    Cil_types.varinfo -> (Cil_types.varinfo -> Formula.tau) -> fvar
  val addr : Cil_types.varinfo -> Formula.tau -> data
  val null : data
  val base : data -> data
  val shift_field : data -> Cil_types.fieldinfo -> data
  val shift_index : data -> dterm -> data
  val shift_epath : data -> epath -> data
  val shift_pointer : data -> dterm -> data
  val proj : data -> epath -> dterm
  val indir :
    fvar Cil_datatype.Varinfo.Hashtbl.t -> Clabels.c_label -> data -> dterm
  val mk_mu : data -> epath -> dterm option -> data
  val mk_mu_range : data -> dterm -> data
  val mk_mu_sh_indir : data -> dterm option -> dterm option -> data
  val mk_mu_range_indir : data -> dterm -> data
  val addr_of_data : data -> data
  val term_of_var : fvar -> dterm
  val term_of_data : data -> dterm
  val data_of_term : dterm -> data
  val visit_data_in_pred :
    all:bool -> (('-> dterm -> 'a) -> '-> data -> 'a) -> '-> pred -> 'a
  val subst_data_in_pred : (data -> data) -> pred -> pred
end