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_corestep_plus U c m c' m' (EFF: effstep_plus U c m c' m'): corestep_plus Sem c m c' m'.
Lemma effstep_star_corestep_star U c m c' m' (EFF: effstep_star U c m c' m'): corestep_star Sem c m c' m'.
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_plus_trans : forall U1 c1 c2 c3 U2 m1 m2 m3, effstep_plus U1 c1 m1 c2 m2 -> effstep_plus U2 c2 m2 c3 m3 -> effstep_plus (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) c1 m1 c3 m3.
Lemma effstep_plus_trans' : forall U U1 c1 c2 c3 U2 m1 m2 m3, effstep_plus U1 c1 m1 c2 m2 -> effstep_plus U2 c2 m2 c3 m3 -> U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) -> effstep_plus U c1 m1 c3 m3.
Lemma effstep_star_plus_trans : forall U1 c1 c2 c3 U2 m1 m2 m3, effstep_star U1 c1 m1 c2 m2 -> effstep_plus U2 c2 m2 c3 m3 -> effstep_plus (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) c1 m1 c3 m3.
Lemma effstep_star_plus_trans' : forall U U1 c1 c2 c3 U2 m1 m2 m3, effstep_star U1 c1 m1 c2 m2 -> effstep_plus U2 c2 m2 c3 m3 -> U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) -> effstep_plus U c1 m1 c3 m3.
Lemma effstep_plus_star_trans: forall U1 c1 c2 c3 U2 m1 m2 m3, effstep_plus U1 c1 m1 c2 m2 -> effstep_star U2 c2 m2 c3 m3 -> effstep_plus (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) c1 m1 c3 m3.
Lemma effstep_plus_star_trans': forall U U1 c1 c2 c3 U2 m1 m2 m3, effstep_plus U1 c1 m1 c2 m2 -> effstep_star U2 c2 m2 c3 m3 -> U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) -> effstep_plus U c1 m1 c3 m3.
Lemma effstep_star_trans: forall U1 c1 c2 c3 U2 m1 m2 m3, effstep_star U1 c1 m1 c2 m2 -> effstep_star U2 c2 m2 c3 m3 -> effstep_star (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) c1 m1 c3 m3.
Lemma effstep_star_trans': forall U U1 c1 c2 c3 U2 m1 m2 m3, effstep_star U1 c1 m1 c2 m2 -> effstep_star U2 c2 m2 c3 m3 -> U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) -> effstep_star U c1 m1 c3 m3.
Lemma effstep_plus_one: forall U c m c' m', effstep Sem U c m c' m' -> effstep_plus U c m c' m'.
Lemma effstep_plus_two: forall U1 c m c' m' U2 c'' m'', effstep Sem U1 c m c' m' -> effstep Sem U2 c' m' c'' m'' -> effstep_plus (fun b z => U1 b z || (U2 b z && valid_block_dec m b)) c m c'' m''.
Lemma effstep_star_zero: forall c m, effstep_star (fun b z =>false) c m c m.
Lemma effstep_star_one: forall U c m c' m', effstep Sem U c m 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'', exists U1, exists U2, effstep Sem U1 c m c'' m'' /\ effstep_star U2 c'' m'' c' m' /\ U = (fun b z => U1 b z || (U2 b z && valid_block_dec m b)).
Lemma effstep_plus_perm U c1 m1 c2 m2 (Step: effstep_plus U c1 m1 c2 m2): forall b z, U b z = true -> Mem.perm m1 b z Cur Writable.
Lemma effstep_star_perm U c1 m1 c2 m2 (Step: effstep_star U c1 m1 c2 m2): forall b z, U b z = true -> Mem.perm m1 b z Cur Writable.
Lemma effstep_plus_valid U c1 m1 c2 m2 (Step: effstep_plus U c1 m1 c2 m2): forall b z, U b z = true -> Mem.valid_block m1 b.
Lemma effstep_star_valid U c1 m1 c2 m2 (Step: effstep_star U c1 m1 c2 m2): forall b z, U b z = true -> Mem.valid_block m1 b.
Lemma effstep_star_mem U c m c' m' (EF: effstep_star U c m c' m'): mem_step m m'.
Lemma effstep_plus_mem U c m c' m' (EF: effstep_plus U c m c' m'): mem_step m m'.
Lemma effstep_plus_fwd U c m c' m' (EF: effstep_plus U c m c' m'): mem_forward m m'.
Lemma effstep_star_fwd U c m c' m' (EF: effstep_star U c m c' m'): mem_forward m m'.
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_plus_trans : forall U c1 c2 c3 m1 m2 m3, effstep_plus U c1 m1 c2 m2 -> effstep_plus U c2 m2 c3 m3 -> effstep_plus U c1 m1 c3 m3.
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_star_one: forall U c m c' m', effstep Sem g U c m 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'.