Ltac dsepcon :=
match goal with
  [ H : sepcon _ _ _ |- _ ] =>
  let s1 := fresh "s" in
    let s2 := fresh "s" in
      let JOIN := fresh "JOIN" in
        let H1 := fresh "H" in
          let H2 := fresh "H" in
      destruct H as [s1 [s2 [JOIN [H1 H2]]]]
end.

(* Specifications: *)
Lemma nil_or_loc_full v : nil_or_loc v -> full v.
Lemma expr_denote_heap_ind : forall x s h h', expr_denote x (State s h) = expr_denote x (State s h').
Lemma next_next_join_False : forall s0 s0' s1 s2 x z1 z2, rawnext x z1 s0 -> join_sub s0 s0' -> rawnext x z2 s2 -> join_sub s2 s1 -> joins s0' s1 -> False.
Lemma next_in_dom_rawnext sigma x s : next_in_dom x sigma = true -> space_denote sigma s -> exists s0, exists z, space_atom_denote (Next (Var x) z) s0 /\ join_sub s0 s.
Lemma nn_njoin sigma x z s1 s2 : next_in_dom x sigma = true -> space_denote sigma s1 -> space_atom_denote (Next (Var x) z) s2 -> joins s1 s2 -> False.
Lemma join_stacks_eq : forall s0 s1 s : state, join s0 s1 s -> stk s0=stk s1 /\ stk s0=stk s.