Hint Resolve trace_erasure_cat trace_erasure_map : trace_erasure.
Hint Constructors trace_erasure event_erasure : trace_erasure.
End TraceErasure.
(** ** Memory Erasure*)
Module MemErasure.
(** The values of the erased memory may be more defined and its permissions are top.*)
(** In retrospect setting the permissions to top was a bad choice. It should have been that the permissions of the erased memory are above the permissions of the other memory. This would make it more reusable and it wouldn't need a second definition for free. *)
Local Notation "a # b" := (PMap.get b a) (at level 1).
Record mem_erasure (m m': mem) :=
{ perm_le:
forall b ofs k,
Mem.valid_block m' b ->
(Mem.mem_access m')#b ofs k = Some Freeable;
erased_contents: forall b ofs,
memval_erasure (ZMap.get ofs ((Mem.mem_contents m) # b))
(ZMap.get ofs ((Mem.mem_contents m') # b));
erased_nb: Mem.nextblock m = Mem.nextblock m'
}.

Lemma mem_storev_erased:
forall chunk m m' vptr v v' m2
(Hstore: Mem.storev chunk m vptr v = Some m2)
(Herased: mem_erasure m m')
(Hval_erasure: val_erasure v v') ,
exists m2', Mem.storev chunk m' vptr v' = Some m2'
/\ mem_erasure m2 m2'.