45 lines
1 KiB
Idris
45 lines
1 KiB
Idris
|
module Quox.FinExtra
|
||
|
|
||
|
import public Data.Fin
|
||
|
import Quox.Decidable
|
||
|
|
||
|
public export
|
||
|
data LT : Rel (Fin n) where
|
||
|
LTZ : FZ `LT` FS i
|
||
|
LTS : i `LT` j -> FS i `LT` FS j
|
||
|
%builtin Natural FinExtra.LT
|
||
|
%name FinExtra.LT lt
|
||
|
|
||
|
public export %inline
|
||
|
GT : Rel (Fin n)
|
||
|
GT = flip LT
|
||
|
|
||
|
export
|
||
|
Transitive (Fin n) LT where
|
||
|
transitive LTZ (LTS _) = LTZ
|
||
|
transitive (LTS p) (LTS q) = LTS $ transitive p q
|
||
|
|
||
|
export Uninhabited (i `FinExtra.LT` i) where uninhabited (LTS p) = uninhabited p
|
||
|
export Uninhabited (FS i `LT` FZ) where uninhabited _ impossible
|
||
|
|
||
|
|
||
|
public export
|
||
|
data Compare : Rel (Fin n) where
|
||
|
IsLT : (lt : i `LT` j) -> Compare i j
|
||
|
IsEQ : Compare i i
|
||
|
IsGT : (gt : i `GT` j) -> Compare i j
|
||
|
%name Compare cmp
|
||
|
|
||
|
export
|
||
|
compareS : Compare i j -> Compare (FS i) (FS j)
|
||
|
compareS (IsLT lt) = IsLT (LTS lt)
|
||
|
compareS IsEQ = IsEQ
|
||
|
compareS (IsGT gt) = IsGT (LTS gt)
|
||
|
|
||
|
export
|
||
|
compareP : (i, j : Fin n) -> Compare i j
|
||
|
compareP FZ FZ = IsEQ
|
||
|
compareP FZ (FS j) = IsLT LTZ
|
||
|
compareP (FS i) FZ = IsGT LTZ
|
||
|
compareP (FS i) (FS j) = compareS $ compareP i j
|