0 | module Data.Prim.Integer
2 | import public Algebra.Ring
3 | import public Control.Order
4 | import public Control.Relation
5 | import public Control.Relation.ReflexiveClosure
6 | import public Control.Relation.Trichotomy
7 | import public Data.Maybe0
11 | unsafeRefl : a === b
12 | unsafeRefl = believe_me (Builtin.Refl {x = a})
16 | data (<) : (m,n : Integer) -> Type where
17 | LT : {0 m,n : Integer} -> (0 prf : (m < n) === True) -> m < n
25 | unerase : (0 p : m < n) -> m < n
26 | unerase (LT p) = LT p
32 | 0 mkLT : (0 prf : (m < n) === True) -> m < n
39 | 0 runLT : m < n -> (m < n) === True
40 | runLT (LT prf) = prf
45 | strictLT : (0 p : m < n) -> Lazy c -> c
46 | strictLT (LT prf) x = x
54 | 0 (>) : (m,n : Integer) -> Type
59 | 0 (<=) : (m,n : Integer) -> Type
60 | (<=) = ReflexiveClosure (<)
66 | 0 ltNotEQ : m < n -> Not (m === n)
67 | ltNotEQ x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and EQ")
69 | 0 ltNotGT : m < n -> Not (n < m)
70 | ltNotGT x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and GT")
72 | 0 eqNotLT : m === n -> Not (m < n)
73 | eqNotLT = flip ltNotEQ
75 | public export %inline
76 | lt : (x,y : Integer) -> Maybe0 (x < y)
77 | lt x y = case prim__lt_Integer x y of
79 | _ => Just0 (mkLT unsafeRefl)
81 | public export %inline
82 | lte : (x,y : Integer) -> Maybe0 (x <= y)
83 | lte x y = case prim__lte_Integer x y of
85 | _ => Just0 (if x < y then (Rel $
mkLT unsafeRefl) else (fromEq unsafeRefl))
88 | comp : (m,n : Integer) -> Trichotomy (<) m n
89 | comp m n = case prim__lt_Integer m n of
90 | 0 => case prim__eq_Integer m n of
91 | 0 => GT (ltNotGT $
LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (LT unsafeRefl)
92 | x => EQ (eqNotLT unsafeRefl) (unsafeRefl) (eqNotLT unsafeRefl)
93 | x => LT (LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (ltNotGT $
LT unsafeRefl)
100 | Transitive Integer (<) where
101 | transitive _ _ = LT unsafeRefl
104 | Trichotomous Integer (<) where
105 | trichotomy m n = comp m n
116 | 0 plusGT : (k,m,n : Integer) -> k < m -> n + k < n + m
117 | plusGT k m n x = strictLT x $
mkLT unsafeRefl
124 | 0 multPosPosGT0 : (m,n : Integer) -> 0 < m -> 0 < n -> 0 < m * n
125 | multPosPosGT0 _ _ p1 p2 = strictLT p1 $
strictLT p2 $
mkLT unsafeRefl