Module ME := OrderedTypeFacts E.
Definition empty : t := let (s, _) := empty in s.
Definition is_empty (s : t) : bool :=
if is_empty s then true else false.
Definition mem (x : elt) (s : t) : bool :=
if mem x s then true else false.
Definition eq_dec := equal.
Definition equal (s s' : t) : bool :=
if equal s s' then true else false.
Definition subset (s s' : t) : bool :=
if subset s s' then true else false.
Definition choose (s : t) : option elt :=
match choose s with
| inleft (exist _ x _) => Some x
| inright _ => None
end.
Definition elements (s : t) : list elt := let (l, _) := elements s in l.
Hint Resolve elements_3 : core.
Definition max_elt (s : t) : option elt :=
match max_elt s with
| inleft (exist _ x _) => Some x
| inright _ => None
end.
Definition add (x : elt) (s : t) : t := let (s', _) := add x s in s'.
Definition remove (x : elt) (s : t) : t := let (s', _) := remove x s in s'.
Definition singleton (x : elt) : t := let (s, _) := singleton x in s.
Definition union (s s' : t) : t := let (s'', _) := union s s' in s''.
Definition inter (s s' : t) : t := let (s'', _) := inter s s' in s''.
Definition diff (s s' : t) : t := let (s'', _) := diff s s' in s''.
Definition cardinal (s : t) : nat := let (f, _) := cardinal s in f.
Definition fold (B : Type) (f : elt -> B -> B) (i : t)
(s : B) : B := let (fold, _) := fold f i s in fold.

Lemma fold_1 :
forall (s : t) (A : Type) (i : A) (f : elt -> A -> A),
fold f s i = fold_left (fun a e => f e a) (elements s) i.