Definition MATCH (d:CL_core) mu c1 m1 c2 m2:Prop :=
match_states (restrict (as_inj mu) (vis mu)) c1 m1 c2 m2 /\
REACH_closed m1 (vis mu) /\
meminj_preserves_globals ge (as_inj mu) /\
globalfunction_ptr_inject (as_inj mu) /\
(forall b, isGlobalBlock ge b = true -> frgnBlocksSrc mu b = true) /\
sm_valid mu m1 m2 /\ SM_wd mu /\ Mem.inject (as_inj mu) m1 m2.

Lemma MATCH_corestep: forall
(GDE : genvs_domain_eq ge tge)
(st1 : CL_core) (m1 : mem) (st1' : CL_core) (m1' : mem)
(CS: corestep CL_eff_sem2 ge st1 m1 st1' m1')
(st2 : CSharpMin_core) (mu : SM_Injection) (m2 : mem)
(MC: MATCH st1 mu st1 m1 st2 m2),
exists (st2' : CSharpMin_core) (m2' : mem) (mu' : SM_Injection),
corestep_plus csharpmin_eff_sem tge st2 m2 st2' m2' /\
intern_incr mu mu' /\
sm_inject_separated mu mu' m1 m2 /\
sm_locally_allocated mu mu' m1 m2 m1' m2' /\
MATCH st1' mu' st1' m1' st2' m2' /\
SM_wd mu' /\ sm_valid mu' m1' m2'.