summaryrefslogtreecommitdiff
path: root/src/Data/Setoid.idr
blob: 8014bac290842c7cad86ae7f6c9c28dd110ed6c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
module Data.Setoid

import public Control.Relation

%default total

public export
record Equivalence a (rel : Rel a) where
  constructor MkEquivalence
  refl  : Reflexive a rel
  sym   : Symmetric a rel
  trans : Transitive a rel

public export
record Setoid where
  constructor MkSetoid
  0 U         : Type
  0 relation  : Rel U
  equivalence : Data.Setoid.Equivalence U relation

public export
equiv : Control.Relation.Equivalence a rel => Data.Setoid.Equivalence a rel
equiv = MkEquivalence (MkReflexive reflexive) (MkSymmetric symmetric) (MkTransitive transitive)

public export
[refl'] (eq : Data.Setoid.Equivalence a rel) => Reflexive a rel where
  reflexive = reflexive @{eq.refl}

public export
[sym'] (eq : Data.Setoid.Equivalence a rel) => Symmetric a rel where
  symmetric = symmetric @{eq.sym}

public export
[trans'] (eq : Data.Setoid.Equivalence a rel) => Transitive a rel where
  transitive = transitive @{eq.trans}

public export
[equiv'] Data.Setoid.Equivalence a rel => Control.Relation.Equivalence a rel
  using refl' sym' trans' where

public export
(.reflexive) : Data.Setoid.Equivalence a rel -> {x : a} -> rel x x
(.reflexive) eq = reflexive @{eq.refl}

public export
(.symmetric) : Data.Setoid.Equivalence a rel -> {x, y : a} -> rel x y -> rel y x
(.symmetric) eq = symmetric @{eq.sym}

public export
(.transitive) : Data.Setoid.Equivalence a rel -> {x, y, z : a} -> rel x y -> rel y z -> rel x z
(.transitive) eq = transitive @{eq.trans}

public export
(.equalImpliesEq) : Data.Setoid.Equivalence a rel -> {x, y : a} -> x = y -> rel x y
(.equalImpliesEq) eq Refl = eq.reflexive