diff options
author | Greg Brown <greg.brown01@ed.ac.uk> | 2022-11-29 14:24:17 +0000 |
---|---|---|
committer | Greg Brown <greg.brown01@ed.ac.uk> | 2022-11-29 14:24:17 +0000 |
commit | d35c9f4eea009a5d3edd57c9165e49b8a7a66334 (patch) | |
tree | cfbcaf147d3a4a63ce3826cea55013bea705ffc9 /src/Data | |
parent | 0b90e50d813a97aa3763e4aa209eaa3561fd401c (diff) |
Extract setoids to a new module.
Diffstat (limited to 'src/Data')
-rw-r--r-- | src/Data/Setoid.idr | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/Data/Setoid.idr b/src/Data/Setoid.idr new file mode 100644 index 0000000..8014bac --- /dev/null +++ b/src/Data/Setoid.idr @@ -0,0 +1,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 |