type-natural-1.1.0.1: Type-level natural and proofs of their properties.
Safe HaskellNone
LanguageHaskell2010

Data.Type.Natural.Lemma.Order

Synopsis

Documentation

data DiffNat n m where Source #

Constructors

DiffNat :: SNat n -> SNat m -> DiffNat n (n + m) 

data LeqView n m where Source #

Constructors

LeqZero :: SNat n -> LeqView 0 n 
LeqSucc :: SNat n -> SNat m -> IsTrue (n <=? m) -> LeqView (Succ n) (Succ m) 

type (<) n m = (n <? m) ~ 'True infix 4 Source #

type (<?) n m = (n + 1) <=? m infix 4 Source #

(%<?) :: SNat n -> SNat m -> SBool (n <? m) infix 4 Source #

type (>) n m = (n >? m) ~ 'True infix 4 Source #

type (>?) n m = m <? n infix 4 Source #

(%>?) :: SNat n -> SNat m -> SBool (n >? m) infix 4 Source #

type (>=) n m = (n >=? m) ~ 'True infix 4 Source #

type (>=?) n m = m <=? n infix 4 Source #

(%>=?) :: SNat n -> SNat m -> SBool (n >=? m) infix 4 Source #

type family FlipOrdering ord where ... Source #

Equations

FlipOrdering 'LT = 'GT 
FlipOrdering 'GT = 'LT 
FlipOrdering 'EQ = 'EQ 

type Min n m = MinAux (n <=? m) n m Source #

sMin :: SNat n -> SNat m -> SNat (Min n m) Source #

type Max n m = MaxAux (n >=? m) n m Source #

sMax :: SNat n -> SNat m -> SNat (Max n m) Source #

Lemmas

coerceLeqL :: forall n m l. (n :~: m) -> SNat l -> IsTrue (n <=? l) -> IsTrue (m <=? l) Source #

Since 1.0.0.0 (type changed)

coerceLeqR :: forall n m l. SNat l -> (n :~: m) -> IsTrue (l <=? n) -> IsTrue (l <=? m) Source #

Since 1.0.0.0 (type changed)

sLeqCongL :: (a :~: b) -> SNat c -> (a <= c) :~: (b <= c) Source #

sLeqCongR :: SNat a -> (b :~: c) -> (a <= b) :~: (a <= c) Source #

sLeqCong :: (a :~: b) -> (c :~: d) -> (a <= c) :~: (b <= d) Source #

succDiffNat :: SNat n -> SNat m -> DiffNat n m -> DiffNat (Succ n) (Succ m) Source #

compareCongR :: SNat a -> (b :~: c) -> CmpNat a b :~: CmpNat a c Source #

leqToCmp :: SNat a -> SNat b -> IsTrue (a <=? b) -> Either (a :~: b) (CmpNat a b :~: 'LT) Source #

eqlCmpEQ :: SNat a -> SNat b -> (a :~: b) -> CmpNat a b :~: 'EQ Source #

eqToRefl :: SNat a -> SNat b -> (CmpNat a b :~: 'EQ) -> a :~: b Source #

ltToNeq :: SNat a -> SNat b -> (CmpNat a b :~: 'LT) -> (a :~: b) -> Void Source #

leqNeqToLT :: SNat a -> SNat b -> IsTrue (a <=? b) -> ((a :~: b) -> Void) -> CmpNat a b :~: 'LT Source #

succLeqToLT :: SNat a -> SNat b -> IsTrue (S a <=? b) -> CmpNat a b :~: 'LT Source #

ltToLeq :: SNat a -> SNat b -> (CmpNat a b :~: 'LT) -> IsTrue (a <=? b) Source #

gtToLeq :: SNat a -> SNat b -> (CmpNat a b :~: 'GT) -> IsTrue (b <=? a) Source #

ltToSuccLeq :: SNat a -> SNat b -> (CmpNat a b :~: 'LT) -> IsTrue (Succ a <=? b) Source #

cmpZero :: SNat a -> CmpNat 0 (Succ a) :~: 'LT Source #

leqToGT :: SNat a -> SNat b -> IsTrue (Succ b <=? a) -> CmpNat a b :~: 'GT Source #

cmpZero' :: SNat a -> Either (CmpNat 0 a :~: 'EQ) (CmpNat 0 a :~: 'LT) Source #

zeroNoLT :: SNat a -> (CmpNat a 0 :~: 'LT) -> Void Source #

ltRightPredSucc :: SNat a -> SNat b -> (CmpNat a b :~: 'LT) -> b :~: Succ (Pred b) Source #

cmpSucc :: SNat n -> SNat m -> CmpNat n m :~: CmpNat (Succ n) (Succ m) Source #

ltSucc :: SNat a -> CmpNat a (Succ a) :~: 'LT Source #

cmpSuccStepR :: forall n m. SNat n -> SNat m -> (CmpNat n m :~: 'LT) -> CmpNat n (Succ m) :~: 'LT Source #

ltSuccLToLT :: SNat n -> SNat m -> (CmpNat (Succ n) m :~: 'LT) -> CmpNat n m :~: 'LT Source #

leqToLT :: SNat a -> SNat b -> IsTrue (Succ a <=? b) -> CmpNat a b :~: 'LT Source #

leqZero :: SNat n -> IsTrue (0 <=? n) Source #

leqSucc :: SNat n -> SNat m -> IsTrue (n <=? m) -> IsTrue (Succ n <=? Succ m) Source #

viewLeq :: forall n m. SNat n -> SNat m -> IsTrue (n <=? m) -> LeqView n m Source #

leqWitness :: forall n m. SNat n -> SNat m -> IsTrue (n <=? m) -> DiffNat n m Source #

leqStep :: forall n m l. SNat n -> SNat m -> SNat l -> ((n + l) :~: m) -> IsTrue (n <=? m) Source #

leqNeqToSuccLeq :: SNat n -> SNat m -> IsTrue (n <=? m) -> ((n :~: m) -> Void) -> IsTrue (Succ n <=? m) Source #

leqRefl :: SNat n -> IsTrue (n <=? n) Source #

leqSuccStepR :: SNat n -> SNat m -> IsTrue (n <=? m) -> IsTrue (n <=? Succ m) Source #

leqSuccStepL :: SNat n -> SNat m -> IsTrue (Succ n <=? m) -> IsTrue (n <=? m) Source #

leqReflexive :: SNat n -> SNat m -> (n :~: m) -> IsTrue (n <=? m) Source #

leqTrans :: SNat n -> SNat m -> SNat l -> IsTrue (n <=? m) -> IsTrue (m <=? l) -> IsTrue (n <=? l) Source #

leqAntisymm :: SNat n -> SNat m -> IsTrue (n <=? m) -> IsTrue (m <=? n) -> n :~: m Source #

plusMonotone :: SNat n -> SNat m -> SNat l -> SNat k -> IsTrue (n <=? m) -> IsTrue (l <=? k) -> IsTrue ((n + l) <=? (m + k)) Source #

leqZeroElim :: SNat n -> IsTrue (n <=? 0) -> n :~: 0 Source #

plusMonotoneL :: SNat n -> SNat m -> SNat l -> IsTrue (n <=? m) -> IsTrue ((n + l) <=? (m + l)) Source #

plusMonotoneR :: SNat n -> SNat m -> SNat l -> IsTrue (m <=? l) -> IsTrue ((n + m) <=? (n + l)) Source #

plusLeqL :: SNat n -> SNat m -> IsTrue (n <=? (n + m)) Source #

plusLeqR :: SNat n -> SNat m -> IsTrue (m <=? (n + m)) Source #

plusCancelLeqR :: SNat n -> SNat m -> SNat l -> IsTrue ((n + l) <=? (m + l)) -> IsTrue (n <=? m) Source #

plusCancelLeqL :: SNat n -> SNat m -> SNat l -> IsTrue ((n + m) <=? (n + l)) -> IsTrue (m <=? l) Source #

notLeqToLeq :: forall n m. (n <=? m) ~ 'False => SNat n -> SNat m -> IsTrue (m <=? n) Source #

leqSucc' :: SNat n -> SNat m -> (n <=? m) :~: (Succ n <=? Succ m) Source #

leqToMin :: SNat n -> SNat m -> IsTrue (n <=? m) -> Min n m :~: n Source #

geqToMin :: SNat n -> SNat m -> IsTrue (m <=? n) -> Min n m :~: m Source #

minComm :: SNat n -> SNat m -> Min n m :~: Min m n Source #

minLeqL :: SNat n -> SNat m -> IsTrue (Min n m <=? n) Source #

minLeqR :: SNat n -> SNat m -> IsTrue (Min n m <=? m) Source #

minLargest :: SNat l -> SNat n -> SNat m -> IsTrue (l <=? n) -> IsTrue (l <=? m) -> IsTrue (l <=? Min n m) Source #

leqToMax :: SNat n -> SNat m -> IsTrue (n <=? m) -> Max n m :~: m Source #

geqToMax :: SNat n -> SNat m -> IsTrue (m <=? n) -> Max n m :~: n Source #

maxComm :: SNat n -> SNat m -> Max n m :~: Max m n Source #

maxLeqR :: SNat n -> SNat m -> IsTrue (m <=? Max n m) Source #

maxLeqL :: SNat n -> SNat m -> IsTrue (n <=? Max n m) Source #

maxLeast :: SNat l -> SNat n -> SNat m -> IsTrue (n <=? l) -> IsTrue (m <=? l) -> IsTrue (Max n m <=? l) Source #

lneqSuccLeq :: SNat n -> SNat m -> (n < m) :~: (Succ n <= m) Source #

lneqReversed :: SNat n -> SNat m -> (n < m) :~: (m > n) Source #

lneqToLT :: SNat n -> SNat m -> IsTrue (n <? m) -> CmpNat n m :~: 'LT Source #

ltToLneq :: SNat n -> SNat m -> (CmpNat n m :~: 'LT) -> IsTrue (n <? m) Source #

succLneqSucc :: SNat n -> SNat m -> (n <? m) :~: (Succ n <? Succ m) Source #

lneqRightPredSucc :: SNat n -> SNat m -> IsTrue (n <? m) -> m :~: Succ (Pred m) Source #

lneqSuccStepL :: SNat n -> SNat m -> IsTrue (Succ n <? m) -> IsTrue (n <? m) Source #

lneqSuccStepR :: SNat n -> SNat m -> IsTrue (n <? m) -> IsTrue (n <? Succ m) Source #

plusStrictMonotone :: SNat n -> SNat m -> SNat l -> SNat k -> IsTrue (n <? m) -> IsTrue (l <? k) -> IsTrue ((n + l) <? (m + k)) Source #

maxZeroL :: SNat n -> Max 0 n :~: n Source #

maxZeroR :: SNat n -> Max n 0 :~: n Source #

minZeroL :: SNat n -> Min 0 n :~: 0 Source #

minZeroR :: SNat n -> Min n 0 :~: 0 Source #

minusSucc :: SNat n -> SNat m -> IsTrue (m <=? n) -> (Succ n - m) :~: Succ (n - m) Source #

minusPlus :: forall n m. SNat n -> SNat m -> IsTrue (m <=? n) -> ((n - m) + m) :~: n Source #

minPlusTruncMinus :: SNat n -> SNat m -> (Min n m + (n -. m)) :~: n Source #

truncMinusLeq :: SNat n -> SNat m -> IsTrue ((n -. m) <=? n) Source #

type (-.) n m = Subt n m (m <=? n) infixl 6 Source #

Natural subtraction, truncated to zero if m > n.

(%-.) :: SNat n -> SNat m -> SNat (n -. m) Source #

Various witnesses for orderings

type LeqWitness n m = IsTrue (n <=? m) Source #

data a :<: b Source #

Instances

Instances details
Show (a :<: b) Source # 
Instance details

Defined in Data.Type.Natural.Lemma.Order

Methods

showsPrec :: Int -> (a :<: b) -> ShowS #

show :: (a :<: b) -> String #

showList :: [a :<: b] -> ShowS #

data Leq n m where Source #

Comparison via GADTs.

Constructors

ZeroLeq :: SNat m -> Leq 0 m 
SuccLeqSucc :: Leq n m -> Leq (n + 1) (m + 1) 

leqRhs :: Leq n m -> SNat m Source #

leqLhs :: Leq n m -> SNat n Source #

conversions between lax orders

propToBoolLeq :: forall n m. Leq n m -> LeqWitness n m Source #

boolToPropLeq :: n <= m => SNat n -> SNat m -> Leq n m Source #

conversions between strict orders

propToBoolLt :: (n :<: m) -> IsTrue (n <? m) Source #

boolToPropLt :: n < m => SNat n -> SNat m -> n :<: m Source #