7 | module Control.Relation
14 | Rel ty = ty -> ty -> Type
18 | interface Reflexive ty rel | rel where
19 | constructor MkReflexive
20 | reflexive : {x : ty} -> rel x x
24 | interface Transitive ty rel | rel where
25 | constructor MkTransitive
26 | transitive : {x, y, z : ty} -> rel x y -> rel y z -> rel x z
30 | interface Symmetric ty rel | rel where
31 | constructor MkSymmetric
32 | symmetric : {x, y : ty} -> rel x y -> rel y x
36 | interface Antisymmetric ty rel | rel where
37 | constructor MkAntisymmetric
38 | antisymmetric : {x, y : ty} -> rel x y -> rel y x -> x = y
42 | interface Dense ty rel | rel where
44 | dense : {x, y : ty} -> rel x y -> (z : ty ** (rel x z, rel z y))
48 | interface Serial ty rel | rel where
49 | constructor MkSerial
50 | serial : {x : ty} -> (y : ty ** rel x y)
54 | interface Euclidean ty rel | rel where
55 | constructor MkEuclidean
56 | euclidean : {x, y, z : ty} -> rel x y -> rel x z -> rel y z
60 | interface (Reflexive ty rel,
Symmetric ty rel) => Tolerance ty rel | rel where
64 | interface (Transitive ty rel,
Symmetric ty rel) => PartialEquivalence ty rel | rel where
68 | interface (Reflexive ty rel,
Transitive ty rel,
Symmetric ty rel) => Equivalence ty rel | rel where
74 | Reflexive ty rel => Dense ty rel where
75 | dense xy = (
x ** (reflexive, xy))
79 | Reflexive ty rel => Serial ty rel where
80 | serial = (
x ** reflexive)
84 | (Transitive ty rel, Symmetric ty rel, Serial ty rel) => Reflexive ty rel where
85 | reflexive = let (
y ** xy)
= serial in transitive xy $
symmetric xy
89 | [RES] (Reflexive ty rel, Euclidean ty rel) => Symmetric ty rel where
90 | symmetric xy = euclidean xy $
reflexive
94 | [RET] (Reflexive ty rel, Euclidean ty rel) =>
95 | Transitive ty rel using RES where
96 | transitive xy yz = symmetric $
euclidean yz $
symmetric xy
100 | [TSE] (Transitive ty rel, Symmetric ty rel) => Euclidean ty rel where
101 | euclidean xy xz = transitive (symmetric xy) xz
106 | Reflexive ty Equal where
110 | Symmetric ty Equal where
111 | symmetric xy = sym xy
114 | Transitive ty Equal where
115 | transitive xy yz = trans xy yz
118 | Euclidean ty Equal where
119 | euclidean = euclidean @{TSE}
122 | Tolerance ty Equal where
125 | PartialEquivalence ty Equal where
128 | Equivalence ty Equal where