Proof with try solve [simpl; auto | congruence | inversion 1
| apply listd_pure_atomd_pureu with (s0 := y);
[ | exists x; apply join_comm; auto ]; solve [apply IHsigma; auto]].
revert s; induction sigma... intros s H.
remember a as b; destruct b as [e e0 | ]; simpl.
remember e as b1; destruct b1.
generalize (w_next_nil e0 sigma s H)... generalize H; intros [x [y [A [B C]]]]...
remember e as b; destruct b... generalize (w_lseg_nil e0 sigma s H) as A...
intro. inversion A as [B | B]; [ | inversion B ]. split...
generalize H; intros [x [y [C [D E]]]]...
generalize H; intros [x [y [C [D E]]]]...
Qed.

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