(*FreshS/T: fresh blocks in src/tgt language*)
Definition sm_add_intern (mu: SM_Injection) j FreshS FreshT : SM_Injection :=
Build_SM_Injection (fun b => locBlocksSrc mu b || FreshS b)
(fun b => locBlocksTgt mu b || FreshT b)
(pubBlocksSrc mu) (pubBlocksTgt mu)
(join (local_of mu) (fun b => match extern_of mu b with
None => j b | Some _ => None end))
(extBlocksSrc mu) (extBlocksTgt mu)
(frgnBlocksSrc mu) (frgnBlocksTgt mu) (extern_of mu).

Lemma Match_eff_diagram_strong_perm:
forall (GDE : genvs_domain_eq ge tge)
st1 m1 st1' m1' (U1 : block -> Z -> bool)
(CS: effstep cmin_eff_sem ge U1 st1 m1 st1' m1')
st2 mu m2
(EffSrc: forall b ofs, U1 b ofs = true ->
Mem.valid_block m1 b -> vis mu b = true)
(MC: Match_cores st1 mu st1 m1 st2 m2)
(R: list_norepet (map fst (prog_defs prog))),
exists st2' m2' (U2 : block -> Z -> bool),
(effstep_plus cminsel_eff_sem tge U2 st2 m2 st2' m2' \/
(measure st1' < measure st1)%nat /\
effstep_star cminsel_eff_sem tge U2 st2 m2 st2' m2')
/\ exists 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' /\
(forall b2 ofs,
U2 b2 ofs = true ->
Mem.valid_block m2 b2 /\
(locBlocksTgt mu b2 = false ->
exists (b1 : block) (delta1 : Z),
foreign_of mu b1 = Some (b2, delta1) /\
U1 b1 (ofs - delta1) = true /\
Mem.perm m1 b1 (ofs - delta1) Max Nonempty)).