Definition vis mu := fun b => locBlocksSrc mu b || frgnBlocksSrc mu b.
Definition visTgt mu := fun b => locBlocksTgt mu b || frgnBlocksTgt mu b.
Inductive reach (m:mem) (B:block -> Prop): list (block * Z) -> block -> Prop :=
reach_nil: forall b, B b -> reach m B nil b
| reach_cons: forall b L b' z off n q,
reach m B L b' ->
Mem.perm m b' z Cur Readable ->
ZMap.get z (PMap.get b' (Mem.mem_contents m)) =
Fragment (Vptr b off) q n ->
reach m B ((b',z)::L) b.
Fixpoint reach' (m:mem) (B:block -> Prop) (L:list (block * Z)): block -> Prop:=
match L with
nil => B
| l::L => match l with
(b',z) => match ZMap.get z (PMap.get b' (Mem.mem_contents m))
with Fragment (Vptr b off) q  n => fun bb => bb = b /\
Mem.perm m b' z Cur Readable /\
reach' m B L b'
| _ => fun bb => False
end
end
end.
Fixpoint reach'' (m:mem) (B:block -> bool) (L:list (block * Z)): block -> bool:=
match L with
nil => B
| l::L => match l with
(b',z) => match ZMap.get z (PMap.get b' (Mem.mem_contents m))
with Fragment (Vptr b off) q  n => fun bb => eq_block bb b &&
Mem.perm_dec m b' z Cur Readable  &&
reach'' m B L b'
| _ => fun bb => false
end
end
end.
Parameter REACH : mem -> (block -> bool) -> block -> bool.

Lemma REACH_inject: forall m1 m2 j (J: Mem.inject j m1 m2) B1 B2
(HB: forall b, B1 b = true -> exists jb d, j b = Some(jb,d) /\ B2 jb = true)
b1 (R: REACH m1 B1 b1 = true),
exists b2 d, j b1 = Some(b2,d) /\ REACH m2 B2 b2 = true.