Definition AccessMap_IE_Property  j12 j12' m1 m1' m2 m3'
(AM:ZMap.t (Z -> perm_kind -> option permission)):Prop :=
forall b2,
(Mem.valid_block m2 b2 -> forall k ofs2,
match source j12 m1 b2 ofs2 with
Some(b1,ofs1) =>  PMap.get b2 AM ofs2 k =
PMap.get b1 m1'.(Mem.mem_access) ofs1 k
| None => PMap.get b2 AM ofs2 k =
PMap.get b2 m2.(Mem.mem_access) ofs2 k
end)
/\ (~ Mem.valid_block m2 b2 -> forall k ofs2,
match source j12' m1' b2 ofs2 with
Some(b1,ofs1) => PMap.get b2 AM ofs2 k =
PMap.get b1 m1'.(Mem.mem_access) ofs1 k
| None => PMap.get b2 AM ofs2 k =
PMap.get b2 m3'.(Mem.mem_access) ofs2 k
end).
Definition Content_IE_Property j12 (m1 m1' m2 m3':Mem.mem)
(CM:ZMap.t (ZMap.t memval)):=
forall b2,
(Mem.valid_block m2 b2 -> forall ofs2,
match source j12 m1 b2 ofs2 with
Some(b1,ofs1) => ZMap.get ofs2 (PMap.get b2 CM) =
ZMap.get ofs2 (PMap.get b2 m3'.(Mem.mem_contents))
| None => ZMap.get ofs2 (PMap.get b2 CM) =
ZMap.get ofs2 (PMap.get b2 m2.(Mem.mem_contents))
end)
/\ (~ Mem.valid_block m2 b2 -> forall (HM3': Mem.valid_block m3' b2) ofs2,
ZMap.get ofs2 (PMap.get b2 CM) =
ZMap.get ofs2 (PMap.get b2 m3'.(Mem.mem_contents)))
/\ fst CM !! b2 = Undef.

(* Specifications: *)
Lemma IE_ok: forall (m1 m1' m2 m3 m3':Mem.mem) j
(Minj12 : Mem.inject j m1 m2)
(Fwd1: mem_forward m1 m1') j'
(InjInc: inject_incr j j')  (Sep12 : inject_separated j j' m1 m2)
(UnchLUj: Mem.unchanged_on (loc_unmapped j) m1 m1')
(Ext23 : Mem.extends m2 m3)
(Fwd3: mem_forward m3 m3')
(UnchLOORj1_3: Mem.unchanged_on (loc_out_of_reach j m1) m3 m3')
(Inj13' : Mem.inject j' m1' m3')
(UnchLOOB23_3': Mem.unchanged_on (loc_out_of_bounds m2) m3 m3')
m2'
(NB: m2'.(Mem.nextblock)=m3'.(Mem.nextblock))
(CONT:  Content_IE_Property j m1 m1' m2 m3' (m2'.(Mem.mem_contents)))
(ACCESS: AccessMap_IE_Property j j' m1 m1' m2 m3'
(m2'.(Mem.mem_access))),
mem_forward m2 m2' /\
Mem.extends m2' m3' /\
Mem.inject j' m1' m2' /\
Mem.unchanged_on (loc_out_of_reach j m1) m2 m2'.