Definition corestep_plus c m c' m' :=
    exists n, corestepN (S n) c m c' m'.Definition corestep_star c m c' m' :=
    exists n, corestepN n c m c' m'.

(* Specifications: *)
Lemma corestep_plus_star : forall c1 c2 m1 m2, corestep_plus c1 m1 c2 m2 -> corestep_star c1 m1 c2 m2.
Lemma corestep_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_plus_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_star c1 m1 c3 m3.
Lemma corestep_plus_one: forall c m c' m', corestep Sem c m c' m' -> corestep_plus c m c' m'.
Lemma corestep_plus_two: forall c m c' m' c'' m'', corestep Sem c m c' m' -> corestep Sem c' m' c'' m'' -> corestep_plus c m c'' m''.
Lemma corestep_star_zero: forall c m, corestep_star c m c m.
Lemma corestep_star_one: forall c m c' m', corestep Sem c m c' m' -> corestep_star c m c' m'.
Lemma corestep_plus_split: forall c m c' m', corestep_plus c m c' m' -> exists c'', exists m'', corestep Sem c m c'' m'' /\ corestep_star c'' m'' c' m'.
Lemma corestepN_mem n: forall c m c' m', corestepN M n c m c' m' -> mem_step m m'.
Lemma corestep_plus_mem c m c' m' (H:corestep_plus M c m c' m'): mem_step m m'.
Lemma corestep_star_mem c m c' m' (H:corestep_star M c m c' m'): mem_step m m'.
Lemma memsem_preservesN P (HP: memstep_preserve P) n c m c' m' (H: corestepN M n c m c' m'): P m m'.
Lemma memsem_preserves_plus P (HP:memstep_preserve P) c m c' m' (H: corestep_plus M c m c' m'): P m m'.
Lemma memsem_preserves_star P (HP:memstep_preserve P) c m c' m' (H: corestep_star M c m c' m'): P m m'.
Lemma corestepN_fwd n c m c' m' (CS:corestepN M n c m c' m'): mem_forward m m'.
Lemma corestep_plus_fwd c m c' m' (CS:corestep_plus M c m c' m'): mem_forward m m'.
Lemma corestep_star_fwd c m c' m' (CS:corestep_star M c m c' m'): mem_forward m m'.
Lemma corestepN_rdonly n c m c' m' (CS:corestepN M n c m c' m') b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_plus_rdonly c m c' m' (CS:corestep_plus M c m c' m') b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_star_rdonly c m c' m' (CS:corestep_star M c m c' m')b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_plus_star : forall c1 c2 m1 m2, corestep_plus c1 m1 c2 m2 -> corestep_star c1 m1 c2 m2.
Lemma corestep_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_plus_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_star c1 m1 c3 m3.
Lemma corestep_plus_one: forall c m c' m', corestep Sem c m c' m' -> corestep_plus c m c' m'.
Lemma corestep_plus_two: forall c m c' m' c'' m'', corestep Sem c m c' m' -> corestep Sem c' m' c'' m'' -> corestep_plus c m c'' m''.
Lemma corestep_star_zero: forall c m, corestep_star c m c m.
Lemma corestep_star_one: forall c m c' m', corestep Sem c m c' m' -> corestep_star c m c' m'.
Lemma corestep_plus_split: forall c m c' m', corestep_plus c m c' m' -> exists c'', exists m'', corestep Sem c m c'' m'' /\ corestep_star c'' m'' c' m'.
Lemma corestepN_mem n: forall c m c' m', corestepN M n c m c' m' -> mem_step m m'.
Lemma corestep_plus_mem c m c' m' (H:corestep_plus M c m c' m'): mem_step m m'.
Lemma corestep_star_mem c m c' m' (H:corestep_star M c m c' m'): mem_step m m'.
Lemma memsem_preservesN P (HP: memstep_preserve P) n c m c' m' (H: corestepN M n c m c' m'): P m m'.
Lemma memsem_preserves_plus P (HP:memstep_preserve P) c m c' m' (H: corestep_plus M c m c' m'): P m m'.
Lemma memsem_preserves_star P (HP:memstep_preserve P) c m c' m' (H: corestep_star M c m c' m'): P m m'.
Lemma corestepN_fwd n c m c' m' (CS:corestepN M n c m c' m'): mem_forward m m'.
Lemma corestep_plus_fwd c m c' m' (CS:corestep_plus M c m c' m'): mem_forward m m'.
Lemma corestep_star_fwd c m c' m' (CS:corestep_star M c m c' m'): mem_forward m m'.
Lemma corestepN_rdonly n c m c' m' (CS:corestepN M n c m c' m') b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_plus_rdonly c m c' m' (CS:corestep_plus M c m c' m') b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_star_rdonly c m c' m' (CS:corestep_star M c m c' m')b (VB:Mem.valid_block m b): readonly m b m'.
Lemma corestep_plus_star : forall c1 c2 m1 m2, corestep_plus c1 m1 c2 m2 -> corestep_star c1 m1 c2 m2.
Lemma corestep_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_plus_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_star c1 m1 c3 m3.
Lemma corestep_plus_one: forall c m c' m', corestep Sem ge c m c' m' -> corestep_plus c m c' m'.
Lemma corestep_plus_two: forall c m c' m' c'' m'', corestep Sem ge c m c' m' -> corestep Sem ge c' m' c'' m'' -> corestep_plus c m c'' m''.
Lemma corestep_star_zero: forall c m, corestep_star c m c m.
Lemma corestep_star_one: forall c m c' m', corestep Sem ge c m c' m' -> corestep_star c m c' m'.
Lemma corestep_plus_split: forall c m c' m', corestep_plus c m c' m' -> exists c'', exists m'', corestep Sem ge c m c'' m'' /\ corestep_star c'' m'' c' m'.
Lemma corestep_plus_star : forall c1 c2 m1 m2, corestep_plus c1 m1 c2 m2 -> corestep_star c1 m1 c2 m2.
Lemma corestep_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_plus_trans : forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_plus c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_plus_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_plus c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_plus c1 m1 c3 m3.
Lemma corestep_star_trans: forall c1 c2 c3 m1 m2 m3, corestep_star c1 m1 c2 m2 -> corestep_star c2 m2 c3 m3 -> corestep_star c1 m1 c3 m3.
Lemma corestep_plus_one: forall c m c' m', corestep Sem ge c m c' m' -> corestep_plus c m c' m'.
Lemma corestep_plus_two: forall c m c' m' c'' m'', corestep Sem ge c m c' m' -> corestep Sem ge c' m' c'' m'' -> corestep_plus c m c'' m''.
Lemma corestep_star_zero: forall c m, corestep_star c m c m.
Lemma corestep_star_one: forall c m c' m', corestep Sem ge c m c' m' -> corestep_star c m c' m'.
Lemma corestep_plus_split: forall c m c' m', corestep_plus c m c' m' -> exists c'', exists m'', corestep Sem ge c m c'' m'' /\ corestep_star c'' m'' c' m'.