(** Similar to effect semantics, event semantics augment memory semantics with suitable effects, in the form of a set of memory access traces associated with each internal step of the semantics. *)
Record EvSem {C} :=
{ (** [sem] is a memory semantics. *)
msem :> @MemSem C
(** The step relation of the new semantics. *)
; ev_step: C -> mem -> list mem_event -> C -> mem -> Prop
(** The next four fields axiomatize [drfstep] and its relation to the underlying step relation of [msem]. *)
; ev_step_ax1: forall c m T c' m',
ev_step c m T c' m' ->
corestep msem c m c' m'
; ev_step_ax2: forall c m c' m',
corestep msem c m c' m' ->
exists T, ev_step c m T c' m'
; ev_step_fun: forall c m T' c' m' T'' c'' m'',
ev_step c m T' c' m' -> ev_step c m T'' c'' m'' -> T'=T''
(*  ; ev_step_elim: forall g c m T c' m', ev_step g c m T c' m' -> ev_elim m T m'*)
; ev_step_elim: forall c m T c' m' (STEP: ev_step c m T c' m'),
ev_elim m T m' (*/\
(forall mm mm', ev_elim mm T mm' -> exists cc', ev_step c mm T cc' mm')*)
}.

Lemma free_list_cases:
forall l m m' b ofs
(Hfree: Mem.free_list m l = Some m'),
((Mem.mem_access m) !! b ofs Cur = Some Freeable /\
(Mem.mem_access m') !! b ofs Cur = None) \/
((Mem.mem_access m) !! b ofs Cur =
(Mem.mem_access m') !! b ofs Cur).