1 | module Data.Nat.Order
6 | import Decidable.Decidable
11 | zeroNeverGreater : Not (LTE (S n) Z)
12 | zeroNeverGreater LTEZero
impossible
13 | zeroNeverGreater (LTESucc
_) impossible
16 | zeroAlwaysSmaller : {n : Nat} -> LTE Z n
17 | zeroAlwaysSmaller = LTEZero
20 | ltesuccinjective : {0 n, m : Nat} -> Not (LTE n m) -> Not (LTE (S n) (S m))
21 | ltesuccinjective disprf (LTESucc nLTEm) = void (disprf nLTEm)
22 | ltesuccinjective disprf LTEZero
impossible
28 | {0 p : Nat -> Type} ->
29 | ((n : Nat) -> Dec (p n)) ->
30 | (n : Nat) -> Dec ((k : Nat) -> k `LT` n -> p k)
31 | decideLTBounded pdec 0 = Yes (\ k, bnd => absurd bnd)
32 | decideLTBounded pdec (S n) with (pdec 0)
33 | _ | No np0 = No (\ prf => np0 (prf 0 (LTESucc LTEZero)))
34 | _ | Yes p0 with (decideLTBounded (\ n => pdec (S n)) n)
35 | _ | No nprf = No (\ prf => nprf (\ k, bnd => prf (S k) (LTESucc bnd)))
36 | _ | Yes prf = Yes $
\ k, bnd =>
39 | (LTSucc bnd) => prf _ bnd
45 | {0 p : Nat -> Type} ->
46 | ((n : Nat) -> Dec (p n)) ->
47 | (n : Nat) -> Dec ((k : Nat) -> k `LTE` n -> p k)
48 | decideLTEBounded pdec n with (decideLTBounded pdec (S n))
49 | _ | Yes prf = Yes (\ k, bnd => prf k (LTESucc bnd))
50 | _ | No nprf = No (\ prf => nprf (\ k, bnd => prf k (fromLteSucc bnd)))
53 | Decidable 2 [Nat,Nat] LTE where
57 | Decidable 2 [Nat,Nat] LT where
58 | decide m = isLTE (S m)
61 | lte : (m : Nat) -> (n : Nat) -> Dec (LTE m n)
62 | lte m n = decide {ts = [Nat,Nat]} {p = LTE} m n
65 | shift : (m : Nat) -> (n : Nat) -> LTE m n -> LTE (S m) (S n)
66 | shift m n mLTEn = LTESucc mLTEn