sig
  module type MT_sig =
    sig
      val model_name : string
      type 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_minus_pointer : t_exp -> t_exp -> t_exp
      type t_env
      val new_env : unit -> Translate.MT_sig.t_env
      val term_at :
        Translate.MT_sig.t_env ->
        Cil_types.logic_label -> t_exp -> Fol.pure_type -> t_exp
      val pred_forall : fresh:bool -> Fol.variable -> t_pred -> t_pred
      val pp_exp : Format.formatter -> t_exp -> unit
      val pp_pred : Format.formatter -> t_pred -> unit
    end
  module ToGfol :
    functor (M : MT_sig->
      sig
        exception AbortTranslation of string
        val expr : Cil_types.exp -> M.t_exp
        val cond : Cil_types.exp -> M.t_exp
        val predicate :
          Kernel_function.t ->
          M.t_env -> Cil_types.predicate Cil_types.named -> M.t_pred
        val export_fct_table :
          (M.t_pred -> Fol.predicate) -> Fol.decl list -> Fol.decl list
      end
end