Definition rawnext' x y h := exists h0, join_sub h0 h /\ rawnext x y h0.

(* Specifications: *)
Lemma rawnext_at1 : forall {x y h1 h2 h}, rawnext' x y h1 -> join h1 h2 h -> emp_at x h2 /\ rawnext' x y h.
Lemma rawnext_at2 : forall {x y h1 h2 h}, join h1 h2 h -> rawnext' x y h -> emp_at x h2 -> rawnext' x y h1.
Lemma rawnext_not_emp: forall {x y h}, rawnext' x y h -> ~emp_at x h.
Lemma emp_at_join: forall {h1 h2 h}, join h1 h2 h -> forall l, (emp_at l h1 /\ emp_at l h2) <-> emp_at l h.
Lemma join_same n1 n2 v1 v2 z : join (Some n1) v1 z -> join (Some n2) v2 z -> n1 = n2.
Lemma rawnext_unique: forall x z z' s s' t t' r, rawnext x z s -> rawnext x z' s' -> join s t r -> join s' t' r -> z' = z /\ s'=s.
Lemma vars_defined_locs : forall z (e:env), exists v: val, env_get e z = v /\ nil_or_loc v.