Module MO:=OrderedTypeFacts(O).Notation key:=t.Definition eqk (p p':key*elt) := eq (fst p) (fst p').Definition eqke (p p':key*elt) :=
          eq (fst p) (fst p') /\ (snd p) = (snd p').Definition ltk (p p':key*elt) := lt (fst p) (fst p').#[global]
 Hint Extern 2 (eqke ?a ?b) => split : ordered_type.

(* Specifications: *)
Lemma eqke_eqk : forall x x', eqke x x' -> eqk x x'.
Lemma ltk_right_r : forall x k e e', ltk x (k,e) -> ltk x (k,e').
Lemma ltk_right_l : forall x k e e', ltk (k,e) x -> ltk (k,e') x.
Lemma eqk_refl : forall e, eqk e e.
Lemma eqke_refl : forall e, eqke e e.
Lemma eqk_sym : forall e e', eqk e e' -> eqk e' e.
Lemma eqke_sym : forall e e', eqke e e' -> eqke e' e.
Lemma eqk_trans : forall e e' e'', eqk e e' -> eqk e' e'' -> eqk e e''.
Lemma eqke_trans : forall e e' e'', eqke e e' -> eqke e' e'' -> eqke e e''.
Lemma ltk_trans : forall e e' e'', ltk e e' -> ltk e' e'' -> ltk e e''.
Lemma ltk_not_eqk : forall e e', ltk e e' -> ~ eqk e e'.
Lemma ltk_not_eqke : forall e e', ltk e e' -> ~eqke e e'.