0 | module Decidable.Equality.Core
2 | import Control.Function
12 | interface DecEq t where
14 | decEq : (x1 : t) -> (x2 : t) -> Dec (x1 = x2)
22 | negEqSym : Not (a = b) -> Not (b = a)
23 | negEqSym p h = p (sym h)
27 | decEqSelfIsYes : DecEq a => {x : a} -> decEq x x = Yes Refl
28 | decEqSelfIsYes with (decEq x x)
29 | decEqSelfIsYes | Yes Refl = Refl
30 | decEqSelfIsYes | No contra = absurd $
contra Refl
34 | decEqContraIsNo : DecEq a => {x, y : a} -> Not (x = y) -> (
p ** decEq x y = No p)
35 | decEqContraIsNo uxy with (decEq x y)
36 | decEqContraIsNo uxy | Yes xy = absurd $
uxy xy
37 | decEqContraIsNo _ | No uxy = (
uxy ** Refl)
40 | decEqCong : (0 _ : Injective f) => Dec (x = y) -> Dec (f x = f y)
41 | decEqCong $
Yes prf = Yes $
cong f prf
42 | decEqCong $
No contra = No $
\c => contra $
inj f c
45 | decEqInj : (0 _ : Injective f) => Dec (f x = f y) -> Dec (x = y)
46 | decEqInj $
Yes prf = Yes $
inj f prf
47 | decEqInj $
No contra = No $
\c => contra $
cong f c
50 | decEqCong2 : (0 _ : Biinjective f) => Dec (x = y) -> Lazy (Dec (v = w)) -> Dec (f x v = f y w)
51 | decEqCong2 (Yes Refl) s = decEqCong s @{FromBiinjectiveL}
52 | decEqCong2 (No contra) _ = No $
\c => let (Refl, Refl) = biinj f c in contra Refl