functor (M : Mv_sig->
  sig
    module MT :
      sig
        val model_name : string
        type t_data = M.t_data
        type t_exp = t_data Fol.d_term
        type t_pred = t_data Fol.d_pred
        val prop_in_data : (t_exp -> t_exp) -> t_data -> t_exp
        val eq_data : t_data -> t_data -> bool
        val pp_data : Format.formatter -> t_data -> unit
        val mk_cvar_addr : Cil_types.varinfo -> t_exp
        val mk_lvar_addr : Cil_types.logic_var -> t_exp
        val mk_cvar : Cil_types.varinfo -> t_exp
        val mk_lvar : Cil_types.logic_var -> t_exp
        val mk_field_access : t_exp -> Cil_types.fieldinfo -> t_exp
        val mk_index_access : t_exp -> Cil_types.logic_type -> t_exp -> t_exp
        val mk_field_shift : t_exp -> Cil_types.fieldinfo -> t_exp
        val mk_index_shift : t_exp -> Cil_types.logic_type -> t_exp -> t_exp
        val mk_shift_pointer :
          t_exp -> Cil_types.logic_type -> t_exp -> t_exp
        val mk_access_pointer : t_exp -> Cil_types.logic_type -> t_exp
        val mk_field_update : t_exp -> Cil_types.fieldinfo -> t_exp -> t_exp
        val mk_index_update : t_exp -> t_exp -> t_exp -> t_exp
        val expr_cast : Cil_types.typ -> t_exp -> t_exp
        val mk_let : fresh:bool -> Fol.variable -> t_exp -> t_pred -> t_pred
        val add_decl_hyp : Cil_types.logic_var -> t_pred -> t_pred
        val visit_exp_in_data : ('-> t_exp -> 'a) -> '-> t_data -> 'a
        val fol : t_data Fol.d_pred -> Fol.predicate
        val pp_exp : Format.formatter -> M.t_data Fol.d_term -> unit
        val pp_pred :
          Format.formatter -> M.t_data Fol.d_term Fol.t_pred -> unit
        val mk_minus_pointer :
          'Fol.d_term -> 'Fol.d_term -> 'Fol.d_term
        type t_env =
          MT(M).t_env = {
          env_at : (string, Fol.variable * M.t_exp) Hashtbl.t;
        }
        val new_env : unit -> t_env
        val term_at :
          t_env ->
          Cil_types.logic_label -> M.t_exp -> Fol.pure_type -> 'Fol.d_term
        val get_at_vars :
          remove:bool ->
          t_env -> Cil_types.logic_label -> (Fol.variable * M.t_exp) list
        val pred_forall :
          fresh:bool ->
          Fol.variable -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
      end
    module T :
      sig
        exception AbortTranslation of string
        val expr : Cil_types.exp -> MT.t_exp
        val cond : Cil_types.exp -> MT.t_exp
        val predicate :
          Kernel_function.t ->
          MT.t_env -> Cil_types.predicate Cil_types.named -> MT.t_pred
        val export_fct_table :
          (MT.t_pred -> Fol.predicate) -> Fol.decl list -> Fol.decl list
      end
    type t = M.t_data Fol.d_pred
    type t_exp = M.t_exp
    type t_pred = Mvar.MV.t
    val pretty : Format.formatter -> M.t_data Fol.d_term Fol.t_pred -> unit
    val pretty_pred :
      Format.formatter -> M.t_data Fol.d_term Fol.t_pred -> unit
    val abort : string -> 'a
    val ptrue : 'Fol.t_pred
    val add_hyp : 'Fol.t_pred -> 'Fol.t_pred -> 'Fol.t_pred
    val add_goal : 'Fol.t_pred -> 'Fol.t_pred -> 'Fol.t_pred
    val pbot : 'Fol.t_pred
    val subst_vars :
      (Fol.variable -> M.t_data Fol.d_term option) ->
      M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    exception Invalid_subst
    val subst_var :
      Fol.variable ->
      M.t_data Fol.d_term option ->
      M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val mk_let :
      fresh:bool -> Fol.variable -> M.t_exp option -> M.t_pred -> M.t_pred
    val mk_let_vi :
      Cil_types.varinfo -> M.t_exp option -> M.t_pred -> M.t_pred
    val pred_forall_cv :
      M.t_data Fol.d_pred -> Cil_types.varinfo -> M.t_data Fol.d_pred
    val mk_offset_update :
      (Cil_types.exp -> M.t_exp option) ->
      Mvar.MV.MT.t_env option ->
      M.t_exp ->
      Cil_types.logic_type ->
      M.t_exp option -> Cil_types.offset -> M.t_exp option
  end