Goal forall mu Etgt Esrc m2 m2' (WD: SM_wd mu) m1
            (TgtHyp: forall b ofs, Etgt b ofs = true ->
                       (Mem.valid_block m2 b /\
                         (locBlocksTgt mu b = false ->
                           exists b1 delta1, foreign_of mu b1 = Some(b,delta1) /\
                           Esrc b1 (ofs-delta1) = true /\ Mem.perm m1 b1 (ofs-delta1) Max Nonempty)))
            (Unch2: Mem.unchanged_on (fun b z => Etgt b z = false) m2 m2')
            (*(SrcHyp: forall b ofs, Esrc b ofs = true -> vis mu b = true)*)
            nu (WDnu: SM_wd nu)
         (X1: forall b, locBlocksTgt nu b = true -> locBlocksTgt mu b = false)
         (X2: forall b1 b2 d, foreign_of mu b1 = Some(b2, d) ->
                              locBlocksSrc nu b1 || locBlocksTgt nu b2 = true ->
                              pub_of nu b1 = Some(b2,d)),
   Mem.unchanged_on (fun b2 z => locBlocksTgt nu b2 = true /\
                      forall b1 d, (as_inj nu) b1 = Some (b2,d) ->
                                 loc_out_of_bounds m1 b1 (z-d)) m2 m2'.

Lemma free_free_inject : forall f m1 m1' m2 b1 lo hi b2 d m2' (INJ: Mem.inject f m1 m2) (FREE1: Mem.free m1 b1 lo hi = Some m1') (FREE2: Mem.free m2 b2 (lo+d) (hi+d) = Some m2') (B: f b1 = Some(b2,d)), Mem.inject f m1' m2'.