(** * Invariance properties between two memory states *)
Section UNCHANGED_ON.
Variable P: block -> Z -> Prop.
Record unchanged_on (m_before m_after: mem) : Prop := mk_unchanged_on {
unchanged_on_nextblock:
Ple (nextblock m_before) (nextblock m_after);
unchanged_on_perm:
forall b ofs k p,
P b ofs -> valid_block m_before b ->
(perm m_before b ofs k p <-> perm m_after b ofs k p);
unchanged_on_contents:
forall b ofs,
P b ofs -> perm m_before b ofs Cur Readable ->
ZMap.get ofs (PMap.get b m_after.(mem_contents)) =
ZMap.get ofs (PMap.get b m_before.(mem_contents))
}.

Lemma loadbytes_unchanged_on:
forall m m' b ofs n bytes,
unchanged_on m m' ->
(forall i, ofs <= i < ofs + n -> P b i) ->
loadbytes m b ofs n = Some bytes ->
loadbytes m' b ofs n = Some bytes.