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.

(* Specifications: *)
Lemma reach_reach': forall m B L b1, reach m B L b1 <-> reach' m B L b1.
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.
Lemma reach_reach'' m B L b1 :
reach m (fun b => B b=true) L b1 <-> reach'' m B L b1=true.
Lemma reach_inject: forall m1 m2 j (J: Mem.inject j m1 m2)
L1 b1 B1 (R: reach m1 B1 L1 b1) B2
(HB: forall b, B1 b -> exists jb d, j b = Some(jb,d) /\ B2 jb),
exists b2 L2 d2, j b1 = Some(b2,d2) /\ reach m2 B2 L2 b2.
Lemma reach_mono: forall B1 B2 (HB : forall b, B1 b = true -> B2 b = true)
m b L1 (R : reach m (fun bb : block => B1 bb = true) L1 b),
exists L, reach m (fun bb : block => B2 bb = true) L b.