11 | import Control.Relation
15 | interface (Reflexive ty rel,
Transitive ty rel) => Preorder ty rel where
19 | interface (Preorder ty rel,
Antisymmetric ty rel) => PartialOrder ty rel where
25 | interface Connex ty rel where
26 | connex : {x, y : ty} -> Not (x = y) -> Either (rel x y) (rel y x)
30 | interface StronglyConnex ty rel where
31 | order : (x, y : ty) -> Either (rel x y) (rel y x)
35 | interface (PartialOrder ty rel,
Connex ty rel) => LinearOrder ty rel where
41 | [EP] Equivalence ty rel => Preorder ty rel where
49 | leftmost : (0 rel : _) -> StronglyConnex ty rel => ty -> ty -> ty
50 | leftmost rel x y = either (const x) (const y) $
order {rel} x y
56 | rightmost : (0 rel : _) -> StronglyConnex ty rel => ty -> ty -> ty
57 | rightmost rel x y = either (const y) (const x) $
order {rel} x y
62 | leftmostRelL : (0 rel : _) -> Reflexive ty rel => StronglyConnex ty rel => (x, y : ty) -> leftmost rel x y `rel` x
63 | leftmostRelL rel x y with (order {rel} x y)
64 | _ | Left _ = reflexive {rel}
68 | leftmostRelR : (0 rel : _) -> Reflexive ty rel => StronglyConnex ty rel => (x, y : ty) -> leftmost rel x y `rel` y
69 | leftmostRelR rel x y with (order {rel} x y)
71 | _ | Right _ = reflexive {rel}
74 | leftmostPreserves : (0 rel : _) -> StronglyConnex ty rel => (x, y : ty) -> Either (leftmost rel x y = x) (leftmost rel x y = y)
75 | leftmostPreserves rel x y with (order {rel} x y)
76 | _ | Left _ = Left Refl
77 | _ | Right _ = Right Refl
80 | leftmostIsRightmostLeft : (0 rel : _) -> StronglyConnex ty rel =>
82 | (z : ty) -> (z `rel` x) -> (z `rel` y) ->
83 | (z `rel` leftmost rel x y)
84 | leftmostIsRightmostLeft rel x y z zx zy with (order {rel} x y)
89 | rightmostRelL : (0 rel : _) -> Reflexive ty rel => StronglyConnex ty rel => (x, y : ty) -> x `rel` rightmost rel x y
90 | rightmostRelL rel x y with (order {rel} x y)
92 | _ | Right _ = reflexive {rel}
95 | rightmostRelR : (0 rel : _) -> Reflexive ty rel => StronglyConnex ty rel => (x, y : ty) -> y `rel` rightmost rel x y
96 | rightmostRelR rel x y with (order {rel} x y)
97 | _ | Left _ = reflexive {rel}
101 | rightmostPreserves : (0 rel : _) -> StronglyConnex ty rel => (x, y : ty) -> Either (rightmost rel x y = x) (rightmost rel x y = y)
102 | rightmostPreserves rel x y with (order {rel} x y)
103 | _ | Left _ = Right Refl
104 | _ | Right _ = Left Refl
107 | rightmostIsLeftmostRight : (0 rel : _) -> StronglyConnex ty rel =>
109 | (z : ty) -> (x `rel` z) -> (y `rel` z) ->
110 | (leftmost rel x y `rel` z)
111 | rightmostIsLeftmostRight rel x y z zx zy with (order {rel} x y)