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_effcore_diagram: forall (* (FE : Clight.function -> list val -> mem -> Clight.env -> Clight.temp_env -> mem -> Prop) (FE_FWD : forall (f : Clight.function) (vargs : list val) (m : mem) (e : Clight.env) (lenv : Clight.temp_env) (m' : mem), FE f vargs m e lenv m' -> mem_forward m m') (FE_UNCH : forall (f : Clight.function) (vargs : list val) (m : mem) (e : Clight.env) (lenv : Clight.temp_env) (m' : mem), FE f vargs m e lenv m' -> Mem.unchanged_on (fun (b : block) (z : Z) => EmptyEffect b z = false) m m')*) (GDE : genvs_domain_eq ge tge) (st1 : CL_core) (m1 : mem) (st1' : CL_core) (m1' : mem) (U1 : block -> Z -> bool) (* (EFFSTEP: effstep (clight_eff_sem FE FE_FWD FE_UNCH) ge U1 st1 m1 st1' m1')*) (EFFSTEP: effstep CL_eff_sem2 ge U1 st1 m1 st1' m1') (st2 : CSharpMin_core) (mu : SM_Injection) (m2 : mem) (UHyp: forall b z, U1 b z = true -> Mem.valid_block m1 b -> vis mu b = true) (MC: MATCH st1 mu st1 m1 st2 m2), exists (st2' : CSharpMin_core) (m2' : mem) (mu' : SM_Injection), (exists U2 : block -> Z -> bool, (effstep_plus csharpmin_eff_sem tge U2 st2 m2 st2' m2' /\ (forall (b : block) (ofs : Z), U2 b ofs = true -> Mem.valid_block m2 b /\ (locBlocksTgt mu b = false -> exists (b1 : block) (delta1 : Z), foreign_of mu b1 = Some (b, delta1) /\ U1 b1 (ofs - delta1) = true /\ Mem.perm m1 b1 (ofs - delta1) Max Nonempty)))) /\ 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'.