(*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_corestep: forall (GDE : genvs_domain_eq ge tge) st1 m1 st1' m1' (CS: corestep cmin_eff_sem ge st1 m1 st1' m1') st2 mu m2 (MC: Match_cores st1 mu st1 m1 st2 m2) (R: list_norepet (map fst (prog_defs prog))), exists st2' m2', (corestep_plus cminsel_eff_sem tge st2 m2 st2' m2' \/ (measure st1' < measure st1)%nat /\ corestep_star cminsel_eff_sem tge 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'.