(*(FE : Clight.function -> list val -> mem -> Clight.env -> Clight.temp_env -> mem -> Prop) (FE_FWD : forall f vargs m e lenv m', FE f vargs m e lenv m' -> mem_forward m m') (FE_UNCH : forall f vargs m e lenv m', FE f vargs m e lenv m' ->( Mem.unchanged_on (fun b z => EmptyEffect b z = false) m m'))*)
(*  (CS: corestep (clight_eff_sem FE FE_FWD FE_UNCH) ge st1 m1 st1' m1')*)

(* Specifications: *)
Lemma restrict_vis_foreign: forall mu (WD: SM_wd mu) b1 b2 delta
(R: restrict (as_inj mu) (vis mu) b1 = Some (b2, delta))
(LT: locBlocksTgt mu b2 = false),
foreign_of mu b1 = Some (b2, delta).
Lemma Match_effcore_diagram: forall
(GDE : genvs_domain_eq ge tge)
(st1 : CL_core) (m1 : mem) (st1' : CL_core) (m1' : mem)
(U1 : block -> Z -> bool)
(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'.