Proof with try solve [simpl; auto; try congruence
| destruct (join_assoc B (join_comm C)) as [q1 [q2 Q]];
apply listd_pure_atomd_pureu with (s0 := q1); [ | eexists; eauto ];
solve [apply IHsigma with (s2 := w2); auto]].
intros A B C. revert s s2 B C; induction sigma... intros s s2 B C.
simpl in B; destruct B as [w1 [w2 [B [D E]]]]. destruct a...
destruct e... unfold lseg_in_dom_atoms. if_tac...
try unfold Ident.eq in *. subst x. split...
simpl in A, D. inversion D; subst.
unfold list_denote; rewrite <- union_assoc; left; rewrite <- order_eqv_sound.
eapply (ll_spooky _ _ _ s1 s1 w1 s2 s A D); eauto.
apply join_sub_refl.  econstructor; eauto.
unfold list_denote; rewrite <- union_assoc; left; rewrite <- order_eqv_sound.
eapply (ll_spooky _ _ _ s1 s1 w1 s2 s A D); eauto.
apply join_sub_refl.  econstructor; eauto.
Qed.

(* Specifications: *)
Lemma do_well4_5_sound sigma s :
space_denote sigma s ->
listd (fun atms => listd pure_atom_denote un FF atms) inter TT
(do_well4_5 sigma) s.