{-# language AllowAmbiguousTypes #-}
{-# language DataKinds #-}
{-# language ExplicitForAll #-}
{-# language KindSignatures #-}
{-# language TypeFamilies #-}
{-# language TypeOperators #-}
module Arithmetic.Lt
(
zero
, substituteL
, substituteR
, incrementL
, incrementR
, decrementL
, decrementR
, weakenL
, weakenR
, plus
, transitive
, transitiveNonstrictL
, transitiveNonstrictR
, reciprocalA
, reciprocalB
, toLteL
, toLteR
, absurd
, constant
) where
import Arithmetic.Unsafe (type (<)(Lt),type (:=:)(Eq))
import Arithmetic.Unsafe (type (<=)(Lte))
import GHC.TypeNats (CmpNat,type (+))
import qualified GHC.TypeNats as GHC
toLteR :: (a < b) -> (a + 1 <= b)
{-# inline toLteR #-}
toLteR :: forall (a :: Nat) (b :: Nat). (a < b) -> (a + 1) <= b
toLteR a < b
Lt = forall (a :: Nat) (b :: Nat). a <= b
Lte
toLteL :: (a < b) -> (1 + a <= b)
{-# inline toLteL #-}
toLteL :: forall (a :: Nat) (b :: Nat). (a < b) -> (1 + a) <= b
toLteL a < b
Lt = forall (a :: Nat) (b :: Nat). a <= b
Lte
substituteL :: (b :=: c) -> (b < a) -> (c < a)
{-# inline substituteL #-}
substituteL :: forall (b :: Nat) (c :: Nat) (a :: Nat).
(b :=: c) -> (b < a) -> c < a
substituteL b :=: c
Eq b < a
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
substituteR :: (b :=: c) -> (a < b) -> (a < c)
{-# inline substituteR #-}
substituteR :: forall (b :: Nat) (c :: Nat) (a :: Nat).
(b :=: c) -> (a < b) -> a < c
substituteR b :=: c
Eq a < b
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
plus :: (a < b) -> (c <= d) -> (a + c < b + d)
{-# inline plus #-}
plus :: forall (a :: Nat) (b :: Nat) (c :: Nat) (d :: Nat).
(a < b) -> (c <= d) -> (a + c) < (b + d)
plus a < b
Lt c <= d
Lte = forall (a :: Nat) (b :: Nat). a < b
Lt
incrementL :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(a < b) -> (c + a < c + b)
{-# inline incrementL #-}
incrementL :: forall (c :: Nat) (a :: Nat) (b :: Nat).
(a < b) -> (c + a) < (c + b)
incrementL a < b
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
incrementR :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(a < b) -> (a + c < b + c)
{-# inline incrementR #-}
incrementR :: forall (c :: Nat) (a :: Nat) (b :: Nat).
(a < b) -> (a + c) < (b + c)
incrementR a < b
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
decrementL :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(c + a < c + b) -> (a < b)
{-# inline decrementL #-}
decrementL :: forall (c :: Nat) (a :: Nat) (b :: Nat).
((c + a) < (c + b)) -> a < b
decrementL (c + a) < (c + b)
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
decrementR :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(a + c < b + c) -> (a < b)
{-# inline decrementR #-}
decrementR :: forall (c :: Nat) (a :: Nat) (b :: Nat).
((a + c) < (b + c)) -> a < b
decrementR (a + c) < (b + c)
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
weakenL :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(a < b) -> (a < c + b)
{-# inline weakenL #-}
weakenL :: forall (c :: Nat) (a :: Nat) (b :: Nat). (a < b) -> a < (c + b)
weakenL a < b
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
weakenR :: forall (c :: GHC.Nat) (a :: GHC.Nat) (b :: GHC.Nat).
(a < b) -> (a < b + c)
{-# inline weakenR #-}
weakenR :: forall (c :: Nat) (a :: Nat) (b :: Nat). (a < b) -> a < (b + c)
weakenR a < b
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
transitive :: (a < b) -> (b < c) -> (a < c)
{-# inline transitive #-}
transitive :: forall (a :: Nat) (b :: Nat) (c :: Nat).
(a < b) -> (b < c) -> a < c
transitive a < b
Lt b < c
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
transitiveNonstrictR :: (a < b) -> (b <= c) -> (a < c)
{-# inline transitiveNonstrictR #-}
transitiveNonstrictR :: forall (a :: Nat) (b :: Nat) (c :: Nat).
(a < b) -> (b <= c) -> a < c
transitiveNonstrictR a < b
Lt b <= c
Lte = forall (a :: Nat) (b :: Nat). a < b
Lt
transitiveNonstrictL :: (a <= b) -> (b < c) -> (a < c)
{-# inline transitiveNonstrictL #-}
transitiveNonstrictL :: forall (a :: Nat) (b :: Nat) (c :: Nat).
(a <= b) -> (b < c) -> a < c
transitiveNonstrictL a <= b
Lte b < c
Lt = forall (a :: Nat) (b :: Nat). a < b
Lt
zero :: 0 < 1
{-# inline zero #-}
zero :: 0 < 1
zero = forall (a :: Nat) (b :: Nat). a < b
Lt
absurd :: n < 0 -> void
{-# inline absurd #-}
absurd :: forall (n :: Nat) void. (n < 0) -> void
absurd n < 0
Lt = forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Arithmetic.Nat.absurd: n < 0"
constant :: forall a b. (CmpNat a b ~ 'LT) => (a < b)
{-# inline constant #-}
constant :: forall (a :: Nat) (b :: Nat). (CmpNat a b ~ 'LT) => a < b
constant = forall (a :: Nat) (b :: Nat). a < b
Lt
reciprocalA :: forall (m :: GHC.Nat) (n :: GHC.Nat) (p :: GHC.Nat).
(m < GHC.Div n p) -> (p GHC.* m) < n
{-# inline reciprocalA #-}
reciprocalA :: forall (m :: Nat) (n :: Nat) (p :: Nat).
(m < Div n p) -> (p * m) < n
reciprocalA m < Div n p
_ = forall (a :: Nat) (b :: Nat). a < b
Lt
reciprocalB :: forall (m :: GHC.Nat) (n :: GHC.Nat) (p :: GHC.Nat).
(m < GHC.Div (n GHC.- 1) p + 1) -> (p GHC.* m) < n
{-# inline reciprocalB #-}
reciprocalB :: forall (m :: Nat) (n :: Nat) (p :: Nat).
(m < (Div (n - 1) p + 1)) -> (p * m) < n
reciprocalB m < (Div (n - 1) p + 1)
_ = forall (a :: Nat) (b :: Nat). a < b
Lt