mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-19 09:12:34 +03:00
48 lines
1.4 KiB
Idris
48 lines
1.4 KiB
Idris
||| Implementation of ordering relations for `Nat`ural numbers
|
|
module Data.Nat.Order
|
|
|
|
import Control.Relation
|
|
import Data.Nat
|
|
import Data.Fun
|
|
import Data.Rel
|
|
import Decidable.Decidable
|
|
import Decidable.Equality
|
|
|
|
%default total
|
|
|
|
public export
|
|
zeroNeverGreater : Not (LTE (S n) Z)
|
|
zeroNeverGreater LTEZero impossible
|
|
zeroNeverGreater (LTESucc _) impossible
|
|
|
|
public export
|
|
zeroAlwaysSmaller : {n : Nat} -> LTE Z n
|
|
zeroAlwaysSmaller = LTEZero
|
|
|
|
public export
|
|
ltesuccinjective : {0 n, m : Nat} -> Not (LTE n m) -> Not (LTE (S n) (S m))
|
|
ltesuccinjective disprf (LTESucc nLTEm) = void (disprf nLTEm)
|
|
ltesuccinjective disprf LTEZero impossible
|
|
|
|
public export
|
|
decideLTE : (n : Nat) -> (m : Nat) -> Dec (LTE n m)
|
|
decideLTE Z y = Yes LTEZero
|
|
decideLTE (S x) Z = No zeroNeverGreater
|
|
decideLTE (S x) (S y) with (decEq (S x) (S y))
|
|
decideLTE (S x) (S y) | Yes eq = rewrite eq in Yes (reflexive {rel = LTE})
|
|
decideLTE (S x) (S y) | No _ with (decideLTE x y)
|
|
decideLTE (S x) (S y) | No _ | Yes nLTEm = Yes (LTESucc nLTEm)
|
|
decideLTE (S x) (S y) | No _ | No nGTm = No (ltesuccinjective nGTm)
|
|
|
|
public export
|
|
Decidable 2 [Nat,Nat] LTE where
|
|
decide = decideLTE
|
|
|
|
public export
|
|
lte : (m : Nat) -> (n : Nat) -> Dec (LTE m n)
|
|
lte m n = decide {ts = [Nat,Nat]} {p = LTE} m n
|
|
|
|
public export
|
|
shift : (m : Nat) -> (n : Nat) -> LTE m n -> LTE (S m) (S n)
|
|
shift m n mLTEn = LTESucc mLTEn
|