(* Copyright 2012-2015 by Adam Petcher.				* * Use of this source code is governed by the license described	* * in the LICENSE file at the root of the source tree.		*)
(* a type class and other definitions for decidable equality *)
Set Implicit Arguments.
Definition eq_dec(A : Set) := forall (a1 a2 : A), {a1 = a2} + {a1 <> a2}.
Class EqDec (A : Set) := {
eqb : A -> A -> bool ;
eqb_leibniz : forall x y, eqb x y = true <-> x = y
}.
Infix "?=" := eqb (at level 70) : eq_scope.
Infix "!=" := (fun x y => negb (eqb x y)) (at level 70) : eq_scope.
intuition.
eapply eqb_leibniz.
trivial.
Qed.
intuition.
case_eq (eqb x y); intuition.
rewrite eqb_leibniz in H.
subst.
rewrite eqb_refl.
trivial.
case_eq (eqb y x); intuition.
rewrite eqb_leibniz in H0; subst.
rewrite eqb_refl in H.
discriminate.
Qed.

Theorem EqDec_dec : forall A,
EqDec A ->
forall (a b : A), {a = b} + {a <> b}.