Definition alloc_left_sm (mu: SM_Injection) b1 b2 delta: SM_Injection :=
  Build_SM_Injection (fun b => eq_block b b1 || locBlocksSrc mu b)
                     (locBlocksTgt mu) (*b2 is already in locBlocksTgt!*)
                     (pubBlocksSrc mu) (pubBlocksTgt mu)
                     (fun b => if eq_block b b1 then Some(b2, delta)
                               else local_of mu b)
                     (extBlocksSrc mu) (extBlocksTgt mu)
                     (frgnBlocksSrc mu) (frgnBlocksTgt mu) (extern_of mu).

Theorem alloc_parallel_intern: forall mu m1 m2 lo1 hi1 m1' b1 lo2 hi2 (SMV: sm_valid mu m1 m2) (WD: SM_wd mu), Mem.inject (as_inj mu) m1 m2 -> Mem.alloc m1 lo1 hi1 = (m1', b1) -> lo2 <= lo1 -> hi1 <= hi2 -> exists mu', exists m2', exists b2, Mem.alloc m2 lo2 hi2 = (m2', b2) /\ Mem.inject (as_inj mu') m1' m2' /\ intern_incr mu mu' /\ as_inj mu' b1 = Some(b2, 0) /\ (forall b, b <> b1 -> as_inj mu' b = as_inj mu b) /\ sm_inject_separated mu mu' m1 m2 /\ sm_locally_allocated mu mu' m1 m2 m1' m2' /\ SM_wd mu' /\ sm_valid mu' m1' m2' /\ (REACH_closed m1 (vis mu) -> REACH_closed m1' (vis mu')).