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