Section SetLems.
Variables (s : M.t) (x y : clause).
Proof with auto.
rewrite M.add_spec; intuition.
Qed.
Proof with auto.
rewrite M.add_spec; intuition.
Qed.
Proof with auto.
apply prop_ext; split.
intro A. assert (B : exists z, OrderedClause.eq y z /\ In z (M.elements s0)).
unfold OrderedClause.eq. eauto.
rewrite <- SetoidList.InA_alt, M.elements_spec1 in B. auto.
rewrite <- M.elements_spec1, SetoidList.InA_alt; intros [z [A B]].
subst; auto.
Qed.

Lemma empty_set_elems : M.elements M.empty = nil. (* !!! why not in stdlib *)
Proof with simpl; auto.