Definition effstep_plus U c m c' m' :=
exists n, effstepN (S n) U c m c' m'.
Definition effstep_star U c m c' m' :=
exists n, effstepN n U c m c' m'.

(* Specifications: *)
Lemma effstep_plus_star : forall U c1 c2 m1 m2,
effstep_plus U c1 m1 c2 m2 -> effstep_star U c1 m1 c2 m2.
Lemma effstep_star_plus_trans : forall U c1 c2 c3 m1 m2 m3,
effstep_star U c1 m1 c2 m2 -> effstep_plus U c2 m2 c3 m3 ->
effstep_plus U c1 m1 c3 m3.
Lemma effstep_plus_star_trans: forall U c1 c2 c3 m1 m2 m3,
effstep_plus U c1 m1 c2 m2 -> effstep_star U c2 m2 c3 m3 ->
effstep_plus U c1 m1 c3 m3.
Lemma effstep_star_trans: forall U c1 c2 c3 m1 m2 m3,
effstep_star U c1 m1 c2 m2 -> effstep_star U c2 m2 c3 m3 ->
effstep_star U c1 m1 c3 m3.
Lemma effstep_plus_one: forall U c m c' m',
effstep Sem g U c m c' m' -> effstep_plus U c m c' m'.
Lemma effstep_plus_two: forall U c m c' m' c'' m'',
effstep  Sem g U c m c' m' -> effstep Sem g U c' m' c'' m'' ->
effstep_plus U c m c'' m''.
Lemma effstep_star_zero: forall U c m, effstep_star U c m c m.
Lemma effstep_plus_split: forall U c m c' m',
effstep_plus U c m c' m' ->
exists c'', exists m'', effstep Sem g U c m c'' m'' /\
effstep_star (fun b z => U b z || freshloc m m'' b) c'' m'' c' m'.
Lemma effstep_star_fwd: forall U c m c' m',
effstep_star U c m c' m' -> mem_forward m m'.
Lemma effstep_plus_fwd: forall U c m c' m',
effstep_plus U c m c' m' -> mem_forward m m'.
Lemma effstep_plus_sub: forall c m c' m' (U V : block -> Z -> bool),
effstep_plus U c m c' m' ->
(forall b z, U b z = true -> V b z = true) ->
effstep_plus V c m c' m'.
Lemma effstep_star_sub: forall c m c' m' (U V : block -> Z -> bool),
effstep_star U c m c' m' ->
(forall b z, U b z = true -> V b z = true) ->
effstep_star V c m c' m'.
Lemma effstepN_sub_val: forall n c m c' m' (U V : block -> Z -> bool),
effstepN n U c m c' m' ->
(forall b z, Mem.valid_block m b -> U b z = true -> V b z = true) ->
effstepN n V c m c' m'.
Lemma effstep_plus_sub_val: forall c m c' m' (U V : block -> Z -> bool),
effstep_plus U c m c' m' ->
(forall b z, Mem.valid_block m b -> U b z = true -> V b z = true) ->
effstep_plus V c m c' m'.
Lemma effstep_star_sub_val: forall c m c' m' (U : block -> Z -> bool)
(EFF: effstep_star U c m c' m') (V : block -> Z -> bool),
(forall b z, Mem.valid_block m b -> U b z = true -> V b z = true) ->
effstep_star V c m c' m'.