6 | module Decidable.Order.Strict
8 | import Control.Relation
10 | import Decidable.Equality
15 | interface Irreflexive ty rel where
16 | irreflexive : {x : ty} -> Not (rel x x)
19 | interface (Transitive ty rel,
Irreflexive ty rel) => StrictPreorder ty rel where
22 | interface Asymmetric ty rel where
23 | asymmetric : {x, y : ty} -> rel x y -> Not (rel y x)
26 | [SPA] StrictPreorder ty rel => Asymmetric ty rel where
27 | asymmetric xy yx = irreflexive {rel} $
transitive xy yx
34 | record EqOr {0 t : Type} (spo : Rel t) (a, b : t) where
36 | runEqOr : Either (a = b) (a `spo` b)
39 | Transitive ty rel => Transitive ty (EqOr rel) where
41 | transitive (MkEqOr (Left Refl)) bLTEc = bLTEc
42 | transitive aLTEb (MkEqOr (Left Refl)) = aLTEb
43 | transitive (MkEqOr (Right aLTb)) (MkEqOr (Right bLTc))
44 | = MkEqOr $
Right $
transitive aLTb bLTc
47 | Reflexive ty (EqOr rel) where
48 | reflexive = MkEqOr $
Left Refl
51 | Transitive ty rel => Preorder ty (EqOr rel) where
54 | (Irreflexive ty rel, Asymmetric ty rel) => Antisymmetric ty (EqOr rel) where
56 | antisymmetric (MkEqOr p) (MkEqOr q) = go p q where
59 | Either (a = b) (a `rel` b) ->
60 | Either (b = a) (b `rel` a) ->
62 | go (Left Refl) (Left Refl) = Refl
63 | go (Left Refl) (Right bLTa) = absurd (irreflexive {rel} bLTa)
64 | go (Right aLTb) (Left Refl) = absurd (irreflexive {rel} aLTb)
65 | go (Right aLTb) (Right bLTa) = absurd (asymmetric {rel} aLTb bLTa)
68 | (Irreflexive ty rel, Asymmetric ty rel, Transitive ty rel) =>
69 | PartialOrder ty (EqOr rel) where
72 | data DecOrdering : {lt : t -> t -> Type} -> (a,b : t) -> Type where
73 | DecLT : forall lt . (a `lt` b) -> DecOrdering {lt = lt} a b
74 | DecEQ : forall lt . (a = b) -> DecOrdering {lt = lt} a b
75 | DecGT : forall lt . (b `lt` a) -> DecOrdering {lt = lt} a b
78 | interface StrictPreorder t spo => StrictOrdered t spo where
79 | order : (a,b : t) -> DecOrdering {lt = spo} a b
82 | Connex ty rel => Connex ty (EqOr rel) where
83 | connex neq = bimap (MkEqOr . Right) (MkEqOr . Right) (connex neq)
86 | (Connex ty rel, DecEq ty) => StronglyConnex ty (EqOr rel) where
87 | order a b = case decEq a b of
88 | Yes eq => Left $
MkEqOr (Left eq)
89 | No neq => connex neq