Definition elements (s : t) : list elt := let (l, _) := elements s in l.

(* Specifications: *)
Lemma elements_1 : forall (s : t) (x : elt), In x s -> InA E.eq x (elements s).
Lemma elements_2 : forall (s : t) (x : elt), InA E.eq x (elements s) -> In x s.
Lemma elements_3 : forall s : t, sort E.lt (elements s).
#[global]
Hint Resolve elements_3 : core.
Lemma elements_3w : forall s : t, NoDupA E.eq (elements s).
Lemma min_elt_2 :
forall (s : t) (x y : elt), min_elt s = Some x -> In y s -> ~ E.lt y x.
Lemma min_elt_3 : forall s : t, min_elt s = None -> Empty s.
Definition max_elt (s : t) : option elt :=
match max_elt s with
| inleft (exist _ x _) => Some x
| inright _ => None
end.
Lemma max_elt_1 : forall (s : t) (x : elt), max_elt s = Some x -> In x s.
Lemma max_elt_2 :
forall (s : t) (x y : elt), max_elt s = Some x -> In y s -> ~ E.lt x y.
Lemma max_elt_3 : forall s : t, max_elt s = None -> Empty s.
Definition add (x : elt) (s : t) : t := let (s', _) := add x s in s'.
Lemma add_1 : forall (s : t) (x y : elt), E.eq x y -> In y (add x s).
Lemma add_2 : forall (s : t) (x y : elt), In y s -> In y (add x s).
Lemma add_3 :
forall (s : t) (x y : elt), ~ E.eq x y -> In y (add x s) -> In y s.