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 Pointer b off 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.

(* Specifications: *)
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.