End CORESTEPS.

(* Specifications: *)
Lemma Match_corestep: forall st1 m1 st1' m1'
(CS1:corestep csharpmin_eff_sem ge st1 m1 st1' m1')
st2 mu m2 (MC: Match_cores st1 mu st1 m1 st2 m2),
exists st2' m2' mu',  intern_incr mu mu' /\
sm_inject_separated mu mu' m1 m2 /\
sm_locally_allocated mu mu' m1 m2 m1' m2' /\
Match_cores st1' mu' st1' m1' st2' m2' /\
SM_wd mu' /\ sm_valid mu' m1' m2' /\
(corestep_plus cmin_eff_sem tge st2 m2 st2' m2' \/
(MC_measure st1' < MC_measure st1)%nat /\
corestep_star cmin_eff_sem tge st2 m2 st2' m2').
Lemma EFF_switch_descent:
forall cenv xenv k ls body s,
transl_lblstmt cenv (switch_env ls xenv) ls body = OK s ->
exists k',
transl_lblstmt_cont cenv xenv ls k k'
/\ (forall f sp e m,
effstep_plus cmin_eff_sem tge EmptyEffect
(CMin_State f s k sp e) m (CMin_State f body k' sp e) m).
Lemma EFF_switch_ascent:
forall f n sp e m cenv xenv k ls k1,
let tbl := switch_table ls O in
let ls' := select_switch n ls in
transl_lblstmt_cont cenv xenv ls k k1 ->
exists k2,
effstep_star cmin_eff_sem tge EmptyEffect
(CMin_State f (Sexit (Switch.switch_target n (length tbl) tbl)) k1 sp e) m
(CMin_State f (Sexit O) k2 sp e) m
/\ transl_lblstmt_cont cenv xenv ls' k k2.
Lemma eff_make_store_correct:
forall f sp te tm addr tvaddr rhs tvrhs chunk m vaddr vrhs m' fn k,
eval_expr tge sp te tm addr tvaddr ->
eval_expr tge sp te tm rhs tvrhs ->
Mem.storev chunk m vaddr vrhs = Some m' ->
Mem.inject f m tm ->
val_inject f vaddr tvaddr ->
val_inject f vrhs tvrhs ->
exists tm', exists tvrhs',
cmin_effstep tge (StoreEffect tvaddr (encode_val chunk tvrhs')) (CMin_State fn (make_store chunk addr rhs) k sp te) tm
(CMin_State fn Sskip k sp te) tm'
/\ Mem.storev chunk tm tvaddr tvrhs' = Some tm'
/\ Mem.inject f m' tm'.