Record EffectSem {G C} :=
{ sem :> CoopCoreSem G C;
effstep: G -> (block -> Z -> bool) -> C -> mem -> C -> mem -> Prop;
effax1: forall M g c m c' m',
effstep g M c m c' m' ->
corestep sem g c m c' m'
/\ Mem.unchanged_on (fun b ofs => M b ofs = false) m m';
effax2: forall g c m c' m',
corestep sem g c m c' m' ->
exists M, effstep g M c m c' m';
effstep_sub_val: forall g U V c m c' m'
(UV: forall b ofs, Mem.valid_block m b ->
U b ofs = true -> V b ofs = true),
effstep g U c m c' m' -> effstep g V c m c' m'
}.
Section effsemlemmas.
Context {G C:Type} (Sem: @EffectSem G C) (g:G).

(* Specifications: *)
Lemma effstep_corestep: forall M g c m c' m',
effstep Sem g M c m c' m' -> corestep Sem g c m c' m'.
Lemma effstep_sub: forall U V c m c' m'
(UV: forall b ofs, U b ofs = true -> V b ofs = true),
(effstep Sem g U c m c' m' -> effstep Sem g V c m c' m').