Class RelDec (T : Type) (equ : T -> T -> Prop) : Type :=
{ rel_dec : T -> T -> bool }.Class RelDec (T : Type) (equ : T -> T -> Prop) : Type :=
{ rel_dec : T -> T -> bool }.Class RelDec_Correct T (equ : T -> T -> Prop) (ED : RelDec equ) : Prop :=
{ rel_dec_correct : forall x y : T, rel_dec x y = true <-> equ x y }.Class RelDec_Correct T (equ : T -> T -> Prop) (ED : RelDec equ) : Prop :=
{ rel_dec_correct : forall x y : T, rel_dec x y = true <-> equ x y }.Notation "a ?[ r  ]  b" := (@rel_dec _ r _ a b) (at level 30, b at next level).Definition eq_dec {T : Type} {ED : RelDec (@eq T)} := rel_dec.Definition neg_rel_dec_correct : forall {x y}, ~R x y <-> rel_dec x y = false.Definition rel_dec_p (x:T) (y:T) : {R x y} + {~R x y}.Definition neg_rel_dec_p (x:T) (y:T) : {~R x y} + {R x y}.

(* Specifications: *)
Theorem rel_dec_eq_true : forall x y, eqt x y -> rel_dec x y = true.
Theorem rel_dec_neq_false : forall x y, ~eqt x y -> rel_dec x y = false.
Theorem rel_dec_sym : Symmetric eqt -> forall x y, x ?[ eqt ] y = y ?[ eqt ] x.