functor (M : Mm_sig->
  sig
    module MV :
      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 mem_update :
          t_exp -> Cil_types.logic_type -> t_exp -> t_exp -> t_exp
        val subst_res_var :
          Cil_types.logic_var -> Cil_types.logic_var -> t_pred -> t_pred
        val fol : t_data Fol.d_pred -> Fol.predicate
        val abort : string -> 'a
        type t_env = (string, Fol.variable) Hashtbl.t
        val new_env : unit -> ('a, 'b) Hashtbl.t
        val cur_mem_var : Fol.variable lazy_t
        val cur_mem : 'Fol.d_term lazy_t
        val fresh_mem : unit -> Fol.variable
        val mk_minus_pointer :
          'Fol.d_term -> 'Fol.d_term -> 'Fol.d_term
        val subst_exp_mem :
          Fol.variable ->
          Fol.variable -> M.t_data Fol.d_term -> M.t_data Fol.d_term
        val subst_pred_mem :
          Fol.variable ->
          Fol.variable -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
        val forall_mem :
          Fol.variable -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
        val get_label_mem :
          (string, Fol.variable) Hashtbl.t ->
          Cil_types.logic_label -> Fol.variable
        val term_at :
          (string, Fol.variable) Hashtbl.t ->
          Cil_types.logic_label ->
          M.t_data Fol.d_term -> '-> M.t_data Fol.d_term
        val forall_addr_cvar :
          bool ->
          Cil_types.varinfo -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
        val forall_lv :
          fresh:bool ->
          Cil_types.logic_var -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
        val pred_forall :
          fresh:bool ->
          Fol.variable -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
        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
      end
    module T :
      sig
        exception AbortTranslation of string
        val expr : Cil_types.exp -> MV.t_exp
        val cond : Cil_types.exp -> MV.t_exp
        val predicate :
          Kernel_function.t ->
          MV.t_env -> Cil_types.predicate Cil_types.named -> MV.t_pred
        val export_fct_table :
          (MV.t_pred -> Fol.predicate) -> Fol.decl list -> Fol.decl list
      end
    type t = M.t_pred
    type t_exp = M.t_exp
    type t_pred = M.t_pred
    type t_env = Mmem.MM.MV.t_env
    val new_env : unit -> ('a, 'b) Hashtbl.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 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 translate :
      Kernel_function.t ->
      Mmem.MM.MV.t_env ->
      Cil_types.predicate Cil_types.named -> Mmem.MM.MV.t_pred
    val tcond : Cil_types.exp -> Mmem.MM.MV.t_exp
    val texpr : Cil_types.exp -> Mmem.MM.MV.t_exp
    val lval_addr : Cil_types.lhost * Cil_types.offset -> M.t_exp
    val assign_exp :
      Cil_types.lval -> M.t_exp -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val assign :
      Cil_types.lval ->
      Cil_types.exp -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val return :
      Kernel_function.t ->
      Cil_types.exp option ->
      Mmem.MM.MV.t_data Fol.d_pred -> Mmem.MM.MV.t_data Fol.d_pred
    val test :
      Cil_types.exp ->
      Mmem.MM.MV.t_data Fol.d_pred ->
      Mmem.MM.MV.t_data Fol.d_pred -> Mmem.MM.MV.t_data Fol.d_pred
    val replace_at_vars :
      (string, Fol.variable) Hashtbl.t ->
      Cil_types.logic_label -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val quantify_at_vars :
      (string, Fol.variable) Hashtbl.t ->
      Cil_types.logic_label -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val quantify_assigns :
      Cil_types.identified_term Cil_types.assigns list ->
      M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val quantify_loop_assigns :
      Cil_types.identified_term Cil_types.assigns list ->
      M.t_data Fol.d_pred -> M.t_data Fol.d_pred option
    exception CallNeedFctAssigns
    exception CallArgsVsParamNb
    exception CallFctPtr
    val call_do_body :
      Cil_types.identified_term Cil_types.assigns list ->
      M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val call_add_pre_and_do_args :
      Cil_types.exp list ->
      Cil_types.varinfo list ->
      M.t_data Fol.d_term Fol.t_pred list ->
      M.t_data Fol.d_term Fol.t_pred -> M.t_data Fol.d_pred
    val call_res_and_add_post :
      Kernel_function.t ->
      (string, Fol.variable) Hashtbl.t ->
      Cil_types.lval option ->
      M.t_data Fol.d_pred list -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val quantif_locals :
      Kernel_function.t -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val post_at_end : '-> '-> '-> 'c
    val close :
      '-> Kernel_function.t -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
    val add_glob_decls : Fol.decl list -> Fol.decl list
  end