module MV:
from Mv_sig
, we can define operations shared by every memory model
based on variables such as substitution, quantification, let, etc...
module MT: Mvar.MT
(
M
)
module T: Translate.ToGfol
(
MT
)
type
t = M.t_data Fol.d_pred
type
t_exp = M.t_exp
type
t_pred = 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 abort : string -> 'a
val ptrue : 'a Fol.t_pred
val add_hyp : 'a Fol.t_pred -> 'a Fol.t_pred -> 'a Fol.t_pred
val add_goal : 'a Fol.t_pred -> 'a Fol.t_pred -> 'a Fol.t_pred
val pbot : 'a Fol.t_pred
val subst_vars : (Fol.variable -> M.t_data Fol.d_term option) ->
M.t_data Fol.d_pred -> M.t_data Fol.d_pred
exception Invalid_subst
val subst_var : Fol.variable ->
M.t_data Fol.d_term option -> M.t_data Fol.d_pred -> M.t_data Fol.d_pred
val mk_let : fresh:bool -> Fol.variable -> M.t_exp option -> M.t_pred -> M.t_pred
build forall v', v' = exp => p[v <- v']
Don't build a new variable v'
if fresh=false
(just use v
)
but be careful that in that case, v must not appear in exp !
Raises Calculus.InvalidModel
if exp
is None, v is in p and don't use bottom.
val mk_let_vi : Cil_types.varinfo -> M.t_exp option -> M.t_pred -> M.t_pred
val pred_forall_cv : M.t_data Fol.d_pred -> Cil_types.varinfo -> M.t_data Fol.d_pred
val mk_offset_update : (Cil_types.exp -> M.t_exp option) ->
MT.t_env option ->
M.t_exp ->
Cil_types.logic_type -> M.t_exp option -> Cil_types.offset -> M.t_exp option
build something like : mu (base, off -> e)
If env
, we don't want to have modifiable variables in off
,
so if there are some indexes idx
, we build a \old(idx)
term instead
(and store it in env
).
This is used for //-let.