Definition empty_on_path o p :=
forall lvl, locate_node_in_tr o lvl p = None.
Fixpoint diverge_at_level (p p' : path) (lvl : nat) :=
match lvl with
| 0%nat => False
| S lvl' =>
match p, p' with
| [], [] => False
| (true :: p_tail), (true :: p'_tail) =>
diverge_at_level p_tail p'_tail lvl'
| (false :: p_tail), (false :: p'_tail) =>
diverge_at_level p_tail p'_tail lvl'
| _, _ => True
end
end.
(* off_path id v o p p' means that (id, v) lies on p' and not on p *)
Definition off_path id v o p p' :=
exists lvl,
diverge_at_level p p' lvl /\
match lookup_tree o lvl p' with
| Some (Some bucket) => In (Block id v) bucket
| _ => False
end.

Lemma read_access_state_state :
forall (id id' : block_id) (v : nat) (s : state) (p_new : path),
well_formed s ->
length p_new = LOP ->
blk_in_state id v s  ->
blk_in_state id v (get_post_wb_st
(get_pre_wb_st id' Read s
(calc_path id' s) p_new) (calc_path id' s)).