(* Class of decidable equality *)
Class EqDec (A : Type) : Type :=
  eq_dec : forall a a' : A, {a = a'} + {a <> a'}.(* Class of decidable equality *)
Class EqDec (A : Type) : Type :=
  eq_dec : forall a a' : A, {a = a'} + {a <> a'}.Instance EqDec_nat : EqDec nat := eq_nat_dec.(* Theory of updateable functions, defined over decideable domain *)
Definition upd {A} `{EqDec A} (B : Type) (f : A -> B) (a : A) (b : B) : A -> B :=
  fun a' => if eq_dec a a' then b else f a'.

(* Specifications: *)
Lemma upd_eq {A} `{EqDec A} : forall B (f : A -> B) a b, upd f a b a = b.
Lemma upd_eq' {A} `{EqDec A} : forall B (f : A -> B) a b a', a = a' -> upd f a b a' = b.
Lemma upd_neq {A} `{EqDec A} : forall B (f : A -> B) a b a', a <> a' -> upd f a b a' = f a'.