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'
 }.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'
 }.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'
 }.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'
 }.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'
 }.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'
 }.

Lemma effstep_fwd: forall U c m c' m', effstep Sem g U c m c' m' -> mem_forward m m'.