1 | module Data.Fin.Order
3 | import Control.Relation
9 | import Decidable.Decidable
16 | data FinLTE : Fin k -> Fin k -> Type where
17 | FromNatPrf : {m, n : Fin k} -> LTE (finToNat m) (finToNat n) -> FinLTE m n
20 | Transitive (Fin k) FinLTE where
21 | transitive (FromNatPrf xy) (FromNatPrf yz) =
22 | FromNatPrf $
transitive xy yz
25 | Reflexive (Fin k) FinLTE where
26 | reflexive = FromNatPrf $
reflexive
29 | Preorder (Fin k) FinLTE where
32 | Antisymmetric (Fin k) FinLTE where
33 | antisymmetric {x} {y} (FromNatPrf xy) (FromNatPrf yx) =
34 | finToNatInjective x y $
38 | PartialOrder (Fin k) FinLTE where
41 | Connex (Fin k) FinLTE where
42 | connex {x = FZ} _ = Left $
FromNatPrf LTEZero
43 | connex {y = FZ} _ = Right $
FromNatPrf LTEZero
44 | connex {x = FS k} {y = FS j} prf =
45 | case connex {rel = FinLTE} $
\c => prf $
cong FS c of
46 | Left (FromNatPrf p) => Left $
FromNatPrf $
LTESucc p
47 | Right (FromNatPrf p) => Right $
FromNatPrf $
LTESucc p
50 | Decidable 2 [Fin k, Fin k] FinLTE where
51 | decide m n with (isLTE (finToNat m) (finToNat n))
52 | decide m n | Yes prf = Yes (FromNatPrf prf)
53 | decide m n | No disprf = No (\ (FromNatPrf prf) => disprf prf)