functor (MO : MO_sig->
  sig
    module MV :
      sig
        module MT :
          sig
            val model_name : string
            type t_data = MO.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 -> MO.M.t_data Fol.d_term -> unit
            val pp_pred :
              Format.formatter -> MO.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(MO.M).t_env = {
              env_at : (string, Fol.variable * MO.M.t_exp) Hashtbl.t;
            }
            val new_env : unit -> t_env
            val term_at :
              t_env ->
              Cil_types.logic_label ->
              MO.M.t_exp -> Fol.pure_type -> 'Fol.d_term
            val get_at_vars :
              remove:bool ->
              t_env ->
              Cil_types.logic_label -> (Fol.variable * MO.M.t_exp) list
            val pred_forall :
              fresh:bool ->
              Fol.variable ->
              MO.M.t_data Fol.d_pred -> MO.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 = MO.M.t_data Fol.d_pred
        type t_exp = MO.M.t_exp
        type t_pred = t
        val pretty :
          Format.formatter -> MO.M.t_data Fol.d_term Fol.t_pred -> unit
        val pretty_pred :
          Format.formatter -> MO.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 -> MO.M.t_data Fol.d_term option) ->
          MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
        exception Invalid_subst
        val subst_var :
          Fol.variable ->
          MO.M.t_data Fol.d_term option ->
          MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
        val mk_let :
          fresh:bool ->
          Fol.variable -> MO.M.t_exp option -> MO.M.t_pred -> MO.M.t_pred
        val mk_let_vi :
          Cil_types.varinfo ->
          MO.M.t_exp option -> MO.M.t_pred -> MO.M.t_pred
        val pred_forall_cv :
          MO.M.t_data Fol.d_pred ->
          Cil_types.varinfo -> MO.M.t_data Fol.d_pred
        val mk_offset_update :
          (Cil_types.exp -> MO.M.t_exp option) ->
          MT.t_env option ->
          MO.M.t_exp ->
          Cil_types.logic_type ->
          MO.M.t_exp option -> Cil_types.offset -> MO.M.t_exp option
      end
    module MT :
      sig
        val model_name : string
        type t_data = MO.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 -> MO.M.t_data Fol.d_term -> unit
        val pp_pred :
          Format.formatter -> MO.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(MO.M).t_env = {
          env_at : (string, Fol.variable * MO.M.t_exp) Hashtbl.t;
        }
        val new_env : unit -> t_env
        val term_at :
          t_env ->
          Cil_types.logic_label ->
          MO.M.t_exp -> Fol.pure_type -> 'Fol.d_term
        val get_at_vars :
          remove:bool ->
          t_env -> Cil_types.logic_label -> (Fol.variable * MO.M.t_exp) list
        val pred_forall :
          fresh:bool ->
          Fol.variable -> MO.M.t_data Fol.d_pred -> MO.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 = MO.M.t_data Fol.d_pred
    type t_exp = MO.M.t_exp
    type t_pred = t
    val pretty :
      Format.formatter -> MO.M.t_data Fol.d_term Fol.t_pred -> unit
    val pretty_pred :
      Format.formatter -> MO.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 -> MO.M.t_data Fol.d_term option) ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    exception Invalid_subst
    val subst_var :
      Fol.variable ->
      MO.M.t_data Fol.d_term option ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val mk_let :
      fresh:bool ->
      Fol.variable -> MO.M.t_exp option -> MO.M.t_pred -> MO.M.t_pred
    val mk_let_vi :
      Cil_types.varinfo -> MO.M.t_exp option -> MO.M.t_pred -> MO.M.t_pred
    val pred_forall_cv :
      MO.M.t_data Fol.d_pred -> Cil_types.varinfo -> MO.M.t_data Fol.d_pred
    val mk_offset_update :
      (Cil_types.exp -> MO.M.t_exp option) ->
      MT.t_env option ->
      MO.M.t_exp ->
      Cil_types.logic_type ->
      MO.M.t_exp option -> Cil_types.offset -> MO.M.t_exp option
    val model_name : string
    type t_env = MT.t_env
    val new_env : unit -> MT.t_env
    val texpr : Cil_types.exp -> MT.t_exp option
    val translate :
      Kernel_function.t ->
      MT.t_env -> Cil_types.predicate Cil_types.named -> MT.t_pred
    val assign_exp :
      Cil_types.lval ->
      MO.M.t_exp option -> MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val assign_old_exp :
      MT(MO.M).t_env ->
      Cil_types.lval ->
      MO.M.t_exp option -> MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val assign :
      Cil_types.lval ->
      Cil_types.exp -> MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val test :
      Cil_types.exp ->
      MT.t_data Fol.d_pred -> MT.t_data Fol.d_pred -> MT.t_data Fol.d_pred
    val return :
      Kernel_function.t -> Cil_types.exp option -> MO.M.t_pred -> MO.M.t_pred
    val replace_at_vars :
      MT.t_env ->
      Cil_types.logic_label ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val quantify_at_vars :
      MT.t_env ->
      Cil_types.logic_label ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val quantify_assigns :
      (Cil_types.identified_term Cil_types.zone * 'a) list ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    exception CallNeedFctAssigns
    exception CallArgsVsParamNb
    exception CallFctPtr
    val call_do_body :
      (Cil_types.identified_term Cil_types.zone * 'a) list ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val call_add_pre_and_do_args :
      Cil_types.exp list ->
      Cil_types.varinfo list ->
      MO.M.t_data Fol.d_term Fol.t_pred list ->
      MO.M.t_data Fol.d_term Fol.t_pred -> MO.M.t_data Fol.d_pred
    val call_res_and_add_post :
      Kernel_function.t ->
      MT.t_env ->
      Cil_types.lval option ->
      MO.M.t_data Fol.d_pred list ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val quantify_loop_assigns :
      (Cil_types.identified_term Cil_types.zone * 'a) list ->
      MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred option
    val fol : MO.M.t_data Fol.d_pred -> Fol.predicate
    val post_at_end : '-> '-> '-> 'c
    val quantif_locals :
      Kernel_function.t -> MT.t_data Fol.d_pred -> MT.t_data Fol.d_pred
    val close :
      '->
      Kernel_function.t -> MO.M.t_data Fol.d_pred -> MO.M.t_data Fol.d_pred
    val add_glob_decls : Fol.decl list -> Fol.decl list
  end