Definition empty : {s : t | Empty s}.Definition is_empty : forall s : t, {Empty s} + {~ Empty s}.Definition mem : forall (x : elt) (s : t), {In x s} + {~ In x s}.Definition Add (x : elt) (s s' : t) :=
    forall y : elt, In y s' <-> E.eq x y \/ In y s.Definition add : forall (x : elt) (s : t), {s' : t | Add x s s'}.Definition singleton :
    forall x : elt, {s : t | forall y : elt, In y s <-> E.eq x y}.Definition remove :
    forall (x : elt) (s : t),
    {s' : t | forall y : elt, In y s' <-> ~ E.eq x y /\ In y s}.Definition union :
    forall s s' : t, {s'' : t | forall x : elt, In x s'' <-> In x s \/ In x s'}.Definition inter :
    forall s s' : t, {s'' : t | forall x : elt, In x s'' <-> In x s /\ In x s'}.Definition diff :
    forall s s' : t, {s'' : t | forall x : elt, In x s'' <-> In x s /\ ~ In x s'}.Definition equal : forall s s' : t, {Equal s s'} + {~ Equal s s'}.Definition subset : forall s s' : t, {Subset s s'} + {~Subset s s'}.Definition elements :
    forall s : t,
    {l : list elt | sort E.lt l /\ (forall x : elt, In x s <-> InA E.eq x l)}.Definition fold :
    forall (A : Type) (f : elt -> A -> A) (s : t) (i : A),
    {r : A |   let (l,_) := elements s in
                  r = fold_left (fun a e => f e a) l i}.Definition cardinal :
      forall s : t,
      {r : nat | let (l,_) := elements s in r = length l }.Definition fdec (P : elt -> Prop) (Pdec : forall x : elt, {P x} + {~ P x})
    (x : elt) := if Pdec x then true else false.

Lemma compat_P_aux : forall (P : elt -> Prop) (Pdec : forall x : elt, {P x} + {~ P x}), compat_P E.eq P -> compat_bool E.eq (fdec Pdec).