Proof with auto.
intros H1 H2. unfold setd.
apply listd_In_pred; [ | auto]; intros e H3.
assert (H4: M.In e cls1 \/ M.In e cls2) by
(rewrite elements_In in H3; apply M.union_spec; auto).
do 2 rewrite <-elements_In in H4.
destruct H4 as [H4|H4];
[apply listd_In_inv_pred with (l := M.elements cls1)|
apply listd_In_inv_pred with (l := M.elements cls2)]...
Qed.

(* Specifications: *)
Lemma setd_base_separate:
forall {A} f (b: pred A) cls,
setd f inter b cls = andp b (setd f inter (@TT A) cls).
Lemma setd_add c cls s :
setd f inter b cls s -> f c s -> setd f inter b (M.add c cls) s.