(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
Require Export SetoidList.
Require Equalities.
Set Implicit Arguments.
Unset Strict Implicit.
(** NB: This file is here only for compatibility with earlier version of [FSets] and [FMap]. Please use [Structures/Equalities.v] directly now. *)
(** * Types with Equalities, and nothing more (for subtyping purpose) *)
Module Type EqualityType := Equalities.EqualityTypeOrig.
(** * Types with decidable Equalities (but no ordering) *)
Module Type DecidableType := Equalities.DecidableTypeOrig.
(** * Additional notions about keys and datas used in FMap *)
Module KeyDecidableType(D:DecidableType).
Section Elt.
Variable elt : Type.
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').
#[local]
Hint Unfold eqk eqke : core.
#[local]
Hint Extern 2 (eqke ?a ?b) => split : core.
(* eqke is stricter than eqk *)

(* Specifications: *)
Lemma eqke_eqk : forall x x', eqke x x' -> eqk x x'.
(* eqk, eqke are equalities *)
Lemma eqk_refl : forall e, eqk e e.
#[local]
Hint Resolve eqk_trans eqke_trans eqk_refl eqke_refl : core.