Module Model0.M


module M: sig .. end

val model_name : string
type t_data = Model0.data0 
The interal representation for M0 are Fol predicates based on Fol expressions, based on data0 defined above.
type t_exp = t_data Fol.d_term 
type t_pred = t_exp Fol.t_pred 
val eq_data : Model0.data0 -> Model0.data0 -> bool
val mk_lvar : Cil_types.logic_var -> 'a Fol.d_term
val mk_cvar : Cil_types.varinfo -> 'a Fol.d_term
val mk_cvar_addr : Cil_types.varinfo -> Model0.data0 Fol.d_term
val mk_lvar_addr : Cil_types.logic_var -> Model0.data0 Fol.d_term
val mk_field_access : Model0.exp0 -> Cil_types.fieldinfo -> Model0.data0 Fol.d_term
val mk_index_access : Model0.exp0 -> 'a -> Model0.exp0 -> Model0.data0 Fol.d_term
val mk_field_shift : Model0.exp0 -> Cil_types.fieldinfo -> Model0.data0 Fol.d_term
val mk_index_shift : Model0.exp0 -> 'a -> Model0.exp0 -> Model0.data0 Fol.d_term
val mk_shift_pointer : Model0.exp0 -> 'a -> Model0.exp0 -> Model0.data0 Fol.d_term
val mk_access_pointer : Model0.exp0 -> 'a -> Model0.exp0
val mk_field_update : Model0.exp0 -> Cil_types.fieldinfo -> Model0.exp0 -> Model0.data0 Fol.d_term
val mk_index_update : Model0.exp0 -> Model0.exp0 -> Model0.exp0 -> Model0.data0 Fol.d_term
val expr_cast : 'a -> 'b -> 'c
val prop_in_data : (Model0.exp0 -> Model0.exp0) -> Model0.data0 -> Model0.data0 Fol.d_term
apply do_exp on every expressions in the data d representation. Notice that because addresses are constants, nothing is done on them. This implies that we cannot change them. Something must be done if this is needed later on.
val visit_exp_in_data : ('a -> Model0.exp0 -> 'a) -> 'a -> Model0.data0 -> 'a
val fol : Model0.data0 Fol.d_pred -> Fol.data Fol.d_pred
translate M0 predicate into Fol.predicate
val mk_let : fresh:bool ->
Fol.variable ->
Model0.exp0 -> Model0.data0 Fol.d_pred -> Model0.data0 Fol.d_pred
build let except if exp is a var addr : direct substitution
val add_decl_hyp : 'a -> 'b -> 'b
val pp_data : Format.formatter -> Model0.data0 -> unit