type-natural-0.8.1.0: Type-level natural and proofs of their properties.

Safe HaskellNone
LanguageHaskell2010

Data.Type.Natural

Contents

Description

Type level peano natural number, some arithmetic functions and their singletons.

Synopsis

Re-exported modules.

Natural Numbers

Peano natural numbers. It will be promoted to the type-level natural number.

data Nat Source #

Constructors

Z 
S Nat 

Instances

Enum Nat Source # 

Methods

succ :: Nat -> Nat #

pred :: Nat -> Nat #

toEnum :: Int -> Nat #

fromEnum :: Nat -> Int #

enumFrom :: Nat -> [Nat] #

enumFromThen :: Nat -> Nat -> [Nat] #

enumFromTo :: Nat -> Nat -> [Nat] #

enumFromThenTo :: Nat -> Nat -> Nat -> [Nat] #

Eq Nat Source # 

Methods

(==) :: Nat -> Nat -> Bool #

(/=) :: Nat -> Nat -> Bool #

Num Nat Source # 

Methods

(+) :: Nat -> Nat -> Nat #

(-) :: Nat -> Nat -> Nat #

(*) :: Nat -> Nat -> Nat #

negate :: Nat -> Nat #

abs :: Nat -> Nat #

signum :: Nat -> Nat #

fromInteger :: Integer -> Nat #

Ord Nat Source # 

Methods

compare :: Nat -> Nat -> Ordering #

(<) :: Nat -> Nat -> Bool #

(<=) :: Nat -> Nat -> Bool #

(>) :: Nat -> Nat -> Bool #

(>=) :: Nat -> Nat -> Bool #

max :: Nat -> Nat -> Nat #

min :: Nat -> Nat -> Nat #

Show Nat Source # 

Methods

showsPrec :: Int -> Nat -> ShowS #

show :: Nat -> String #

showList :: [Nat] -> ShowS #

SingKind Nat Source # 

Associated Types

type Demote Nat = (r :: *) #

PEnum Nat Source # 

Associated Types

type Succ Nat (arg :: Nat) :: a #

type Pred Nat (arg :: Nat) :: a #

type ToEnum Nat (arg :: Nat) :: a #

type FromEnum Nat (arg :: Nat) :: Nat #

type EnumFromTo Nat (arg :: Nat) (arg1 :: Nat) :: [a] #

type EnumFromThenTo Nat (arg :: Nat) (arg1 :: Nat) (arg2 :: Nat) :: [a] #

SEnum Nat Source # 
PNum Nat Source # 

Associated Types

type (Nat :+ (arg :: Nat)) (arg1 :: Nat) :: a #

type (Nat :- (arg :: Nat)) (arg1 :: Nat) :: a #

type (Nat :* (arg :: Nat)) (arg1 :: Nat) :: a #

type Negate Nat (arg :: Nat) :: a #

type Abs Nat (arg :: Nat) :: a #

type Signum Nat (arg :: Nat) :: a #

type FromInteger Nat (arg :: Nat) :: a #

SNum Nat Source # 
POrd Nat Source # 

Associated Types

type Compare Nat (arg :: Nat) (arg1 :: Nat) :: Ordering #

type (Nat :< (arg :: Nat)) (arg1 :: Nat) :: Bool #

type (Nat :<= (arg :: Nat)) (arg1 :: Nat) :: Bool #

type (Nat :> (arg :: Nat)) (arg1 :: Nat) :: Bool #

type (Nat :>= (arg :: Nat)) (arg1 :: Nat) :: Bool #

type Max Nat (arg :: Nat) (arg1 :: Nat) :: a #

type Min Nat (arg :: Nat) (arg1 :: Nat) :: a #

SOrd Nat Source # 

Methods

sCompare :: Sing Nat t1 -> Sing Nat t2 -> Sing Ordering (Apply Nat Ordering (Apply Nat (TyFun Nat Ordering -> Type) (CompareSym0 Nat) t1) t2) #

(%:<) :: Sing Nat t1 -> Sing Nat t2 -> Sing Bool (Apply Nat Bool (Apply Nat (TyFun Nat Bool -> Type) ((:<$) Nat) t1) t2) #

(%:<=) :: Sing Nat t1 -> Sing Nat t2 -> Sing Bool (Apply Nat Bool (Apply Nat (TyFun Nat Bool -> Type) ((:<=$) Nat) t1) t2) #

(%:>) :: Sing Nat t1 -> Sing Nat t2 -> Sing Bool (Apply Nat Bool (Apply Nat (TyFun Nat Bool -> Type) ((:>$) Nat) t1) t2) #

(%:>=) :: Sing Nat t1 -> Sing Nat t2 -> Sing Bool (Apply Nat Bool (Apply Nat (TyFun Nat Bool -> Type) ((:>=$) Nat) t1) t2) #

sMax :: Sing Nat t1 -> Sing Nat t2 -> Sing Nat (Apply Nat Nat (Apply Nat (TyFun Nat Nat -> Type) (MaxSym0 Nat) t1) t2) #

sMin :: Sing Nat t1 -> Sing Nat t2 -> Sing Nat (Apply Nat Nat (Apply Nat (TyFun Nat Nat -> Type) (MinSym0 Nat) t1) t2) #

SEq Nat Source # 

Methods

(%:==) :: Sing Nat a -> Sing Nat b -> Sing Bool ((Nat :== a) b) #

(%:/=) :: Sing Nat a -> Sing Nat b -> Sing Bool ((Nat :/= a) b) #

PEq Nat Source # 

Associated Types

type (Nat :== (x :: Nat)) (y :: Nat) :: Bool #

type (Nat :/= (x :: Nat)) (y :: Nat) :: Bool #

SDecide Nat Source # 

Methods

(%~) :: Sing Nat a -> Sing Nat b -> Decision ((Nat :~: a) b) #

SingI Nat Z Source # 

Methods

sing :: Sing Z a #

SingI Nat n => SingI Nat (S n) Source # 

Methods

sing :: Sing (S n) a #

SingI Nat n => Bounded (Ordinal Nat (S n)) # 

Methods

minBound :: Ordinal Nat (S n) #

maxBound :: Ordinal Nat (S n) #

SuppressUnusedWarnings (TyFun Nat Nat -> *) SSym0 Source # 
type Demote Nat Source # 
type Demote Nat = Nat
data Sing Nat Source # 
data Sing Nat where
type FromEnum Nat a Source # 
type FromEnum Nat a
type ToEnum Nat a Source # 
type ToEnum Nat a
type Pred Nat a Source # 
type Pred Nat a
type Succ Nat a Source # 
type Succ Nat a
type FromInteger Nat a Source # 
type Signum Nat a Source # 
type Signum Nat a
type Abs Nat a Source # 
type Abs Nat a
type Negate Nat arg Source # 
type Negate Nat arg = Apply Nat Nat (Negate_6989586621679400878Sym0 Nat) arg
type EnumFromTo Nat arg arg1 Source # 
type EnumFromTo Nat arg arg1 = Apply Nat [Nat] (Apply Nat (TyFun Nat [Nat] -> Type) (EnumFromTo_6989586621679800012Sym0 Nat) arg) arg1
type (:*) Nat a1 a2 Source # 
type (:*) Nat a1 a2
type (:-) Nat a1 a2 Source # 
type (:-) Nat a1 a2
type (:+) Nat a1 a2 Source # 
type (:+) Nat a1 a2
type Min Nat a1 a2 Source # 
type Min Nat a1 a2
type Max Nat a1 a2 Source # 
type Max Nat a1 a2
type (:>=) Nat a1 a2 Source # 
type (:>=) Nat a1 a2
type (:>) Nat a1 a2 Source # 
type (:>) Nat a1 a2
type (:<=) Nat a1 a2 Source # 
type (:<=) Nat a1 a2
type (:<) Nat a1 a2 Source # 
type (:<) Nat a1 a2
type Compare Nat arg arg1 Source # 
type Compare Nat arg arg1 = Apply Nat Ordering (Apply Nat (TyFun Nat Ordering -> Type) (Compare_6989586621679304250Sym0 Nat) arg) arg1
type (:/=) Nat x y Source # 
type (:/=) Nat x y = Not ((:==) Nat x y)
type (:==) Nat a b Source # 
type (:==) Nat a b
type Apply Nat Nat SSym0 l Source # 
type Apply Nat Nat SSym0 l = S l
type EnumFromThenTo Nat arg arg1 arg2 Source # 
type EnumFromThenTo Nat arg arg1 arg2 = Apply Nat [Nat] (Apply Nat (TyFun Nat [Nat] -> Type) (Apply Nat (TyFun Nat (TyFun Nat [Nat] -> Type) -> Type) (EnumFromThenTo_6989586621679800042Sym0 Nat) arg) arg1) arg2

type SSym1 (t :: Nat) = S t Source #

type ZSym0 = Z Source #

Singleton type for Nat.

type SNat = (Sing :: Nat -> Type) Source #

data family Sing k (a :: k) :: * #

The singleton kind-indexed data family.

Instances

data Sing Bool 
data Sing Bool where
data Sing Ordering 
data Sing Nat 
data Sing Nat where
data Sing Symbol 
data Sing Symbol where
data Sing () 
data Sing () where
data Sing Nat # 
data Sing Nat where
data Sing [a] 
data Sing [a] where
data Sing (Maybe a) 
data Sing (Maybe a) where
data Sing (NonEmpty a) 
data Sing (NonEmpty a) where
data Sing (Either a b) 
data Sing (Either a b) where
data Sing (a, b) 
data Sing (a, b) where
data Sing ((~>) k1 k2) 
data Sing ((~>) k1 k2) = SLambda {}
data Sing (a, b, c) 
data Sing (a, b, c) where
data Sing (a, b, c, d) 
data Sing (a, b, c, d) where
data Sing (a, b, c, d, e) 
data Sing (a, b, c, d, e) where
data Sing (a, b, c, d, e, f) 
data Sing (a, b, c, d, e, f) where
data Sing (a, b, c, d, e, f, g) 
data Sing (a, b, c, d, e, f, g) where

Arithmetic functions and their singletons.

min :: Ord a => a -> a -> a #

type family Min a (arg :: a) (arg1 :: a) :: a #

Instances

type Min Bool arg1 arg2 
type Min Bool arg1 arg2 = Apply Bool Bool (Apply Bool (TyFun Bool Bool -> Type) (Min_6989586621679304448Sym0 Bool) arg1) arg2
type Min Ordering arg1 arg2 
type Min Ordering arg1 arg2 = Apply Ordering Ordering (Apply Ordering (TyFun Ordering Ordering -> Type) (Min_6989586621679304448Sym0 Ordering) arg1) arg2
type Min Nat arg1 arg2 
type Min Nat arg1 arg2 = Apply Nat Nat (Apply Nat (TyFun Nat Nat -> Type) (Min_6989586621679304448Sym0 Nat) arg1) arg2
type Min Symbol arg1 arg2 
type Min Symbol arg1 arg2 = Apply Symbol Symbol (Apply Symbol (TyFun Symbol Symbol -> Type) (Min_6989586621679304448Sym0 Symbol) arg1) arg2
type Min () arg1 arg2 
type Min () arg1 arg2 = Apply () () (Apply () (TyFun () () -> Type) (Min_6989586621679304448Sym0 ()) arg1) arg2
type Min Nat a1 a2 # 
type Min Nat a1 a2
type Min [a] arg1 arg2 
type Min [a] arg1 arg2 = Apply [a] [a] (Apply [a] (TyFun [a] [a] -> Type) (Min_6989586621679304448Sym0 [a]) arg1) arg2
type Min (Maybe a) arg1 arg2 
type Min (Maybe a) arg1 arg2 = Apply (Maybe a) (Maybe a) (Apply (Maybe a) (TyFun (Maybe a) (Maybe a) -> Type) (Min_6989586621679304448Sym0 (Maybe a)) arg1) arg2
type Min (NonEmpty a) arg1 arg2 
type Min (NonEmpty a) arg1 arg2 = Apply (NonEmpty a) (NonEmpty a) (Apply (NonEmpty a) (TyFun (NonEmpty a) (NonEmpty a) -> Type) (Min_6989586621679304448Sym0 (NonEmpty a)) arg1) arg2
type Min (Either a b) arg1 arg2 
type Min (Either a b) arg1 arg2 = Apply (Either a b) (Either a b) (Apply (Either a b) (TyFun (Either a b) (Either a b) -> Type) (Min_6989586621679304448Sym0 (Either a b)) arg1) arg2
type Min (a, b) arg1 arg2 
type Min (a, b) arg1 arg2 = Apply (a, b) (a, b) (Apply (a, b) (TyFun (a, b) (a, b) -> Type) (Min_6989586621679304448Sym0 (a, b)) arg1) arg2
type Min (a, b, c) arg1 arg2 
type Min (a, b, c) arg1 arg2 = Apply (a, b, c) (a, b, c) (Apply (a, b, c) (TyFun (a, b, c) (a, b, c) -> Type) (Min_6989586621679304448Sym0 (a, b, c)) arg1) arg2
type Min (a, b, c, d) arg1 arg2 
type Min (a, b, c, d) arg1 arg2 = Apply (a, b, c, d) (a, b, c, d) (Apply (a, b, c, d) (TyFun (a, b, c, d) (a, b, c, d) -> Type) (Min_6989586621679304448Sym0 (a, b, c, d)) arg1) arg2
type Min (a, b, c, d, e) arg1 arg2 
type Min (a, b, c, d, e) arg1 arg2 = Apply (a, b, c, d, e) (a, b, c, d, e) (Apply (a, b, c, d, e) (TyFun (a, b, c, d, e) (a, b, c, d, e) -> Type) (Min_6989586621679304448Sym0 (a, b, c, d, e)) arg1) arg2
type Min (a, b, c, d, e, f) arg1 arg2 
type Min (a, b, c, d, e, f) arg1 arg2 = Apply (a, b, c, d, e, f) (a, b, c, d, e, f) (Apply (a, b, c, d, e, f) (TyFun (a, b, c, d, e, f) (a, b, c, d, e, f) -> Type) (Min_6989586621679304448Sym0 (a, b, c, d, e, f)) arg1) arg2
type Min (a, b, c, d, e, f, g) arg1 arg2 
type Min (a, b, c, d, e, f, g) arg1 arg2 = Apply (a, b, c, d, e, f, g) (a, b, c, d, e, f, g) (Apply (a, b, c, d, e, f, g) (TyFun (a, b, c, d, e, f, g) (a, b, c, d, e, f, g) -> Type) (Min_6989586621679304448Sym0 (a, b, c, d, e, f, g)) arg1) arg2

sMin :: SOrd a => forall (t1 :: a) (t2 :: a). Sing a t1 -> Sing a t2 -> Sing a (Apply a a (Apply a (TyFun a a -> Type) (MinSym0 a) t1) t2) #

max :: Ord a => a -> a -> a #

type family Max a (arg :: a) (arg1 :: a) :: a #

Instances

type Max Bool arg1 arg2 
type Max Bool arg1 arg2 = Apply Bool Bool (Apply Bool (TyFun Bool Bool -> Type) (Max_6989586621679304415Sym0 Bool) arg1) arg2
type Max Ordering arg1 arg2 
type Max Ordering arg1 arg2 = Apply Ordering Ordering (Apply Ordering (TyFun Ordering Ordering -> Type) (Max_6989586621679304415Sym0 Ordering) arg1) arg2
type Max Nat arg1 arg2 
type Max Nat arg1 arg2 = Apply Nat Nat (Apply Nat (TyFun Nat Nat -> Type) (Max_6989586621679304415Sym0 Nat) arg1) arg2
type Max Symbol arg1 arg2 
type Max Symbol arg1 arg2 = Apply Symbol Symbol (Apply Symbol (TyFun Symbol Symbol -> Type) (Max_6989586621679304415Sym0 Symbol) arg1) arg2
type Max () arg1 arg2 
type Max () arg1 arg2 = Apply () () (Apply () (TyFun () () -> Type) (Max_6989586621679304415Sym0 ()) arg1) arg2
type Max Nat a1 a2 # 
type Max Nat a1 a2
type Max [a] arg1 arg2 
type Max [a] arg1 arg2 = Apply [a] [a] (Apply [a] (TyFun [a] [a] -> Type) (Max_6989586621679304415Sym0 [a]) arg1) arg2
type Max (Maybe a) arg1 arg2 
type Max (Maybe a) arg1 arg2 = Apply (Maybe a) (Maybe a) (Apply (Maybe a) (TyFun (Maybe a) (Maybe a) -> Type) (Max_6989586621679304415Sym0 (Maybe a)) arg1) arg2
type Max (NonEmpty a) arg1 arg2 
type Max (NonEmpty a) arg1 arg2 = Apply (NonEmpty a) (NonEmpty a) (Apply (NonEmpty a) (TyFun (NonEmpty a) (NonEmpty a) -> Type) (Max_6989586621679304415Sym0 (NonEmpty a)) arg1) arg2
type Max (Either a b) arg1 arg2 
type Max (Either a b) arg1 arg2 = Apply (Either a b) (Either a b) (Apply (Either a b) (TyFun (Either a b) (Either a b) -> Type) (Max_6989586621679304415Sym0 (Either a b)) arg1) arg2
type Max (a, b) arg1 arg2 
type Max (a, b) arg1 arg2 = Apply (a, b) (a, b) (Apply (a, b) (TyFun (a, b) (a, b) -> Type) (Max_6989586621679304415Sym0 (a, b)) arg1) arg2
type Max (a, b, c) arg1 arg2 
type Max (a, b, c) arg1 arg2 = Apply (a, b, c) (a, b, c) (Apply (a, b, c) (TyFun (a, b, c) (a, b, c) -> Type) (Max_6989586621679304415Sym0 (a, b, c)) arg1) arg2
type Max (a, b, c, d) arg1 arg2 
type Max (a, b, c, d) arg1 arg2 = Apply (a, b, c, d) (a, b, c, d) (Apply (a, b, c, d) (TyFun (a, b, c, d) (a, b, c, d) -> Type) (Max_6989586621679304415Sym0 (a, b, c, d)) arg1) arg2
type Max (a, b, c, d, e) arg1 arg2 
type Max (a, b, c, d, e) arg1 arg2 = Apply (a, b, c, d, e) (a, b, c, d, e) (Apply (a, b, c, d, e) (TyFun (a, b, c, d, e) (a, b, c, d, e) -> Type) (Max_6989586621679304415Sym0 (a, b, c, d, e)) arg1) arg2
type Max (a, b, c, d, e, f) arg1 arg2 
type Max (a, b, c, d, e, f) arg1 arg2 = Apply (a, b, c, d, e, f) (a, b, c, d, e, f) (Apply (a, b, c, d, e, f) (TyFun (a, b, c, d, e, f) (a, b, c, d, e, f) -> Type) (Max_6989586621679304415Sym0 (a, b, c, d, e, f)) arg1) arg2
type Max (a, b, c, d, e, f, g) arg1 arg2 
type Max (a, b, c, d, e, f, g) arg1 arg2 = Apply (a, b, c, d, e, f, g) (a, b, c, d, e, f, g) (Apply (a, b, c, d, e, f, g) (TyFun (a, b, c, d, e, f, g) (a, b, c, d, e, f, g) -> Type) (Max_6989586621679304415Sym0 (a, b, c, d, e, f, g)) arg1) arg2

sMax :: SOrd a => forall (t1 :: a) (t2 :: a). Sing a t1 -> Sing a t2 -> Sing a (Apply a a (Apply a (TyFun a a -> Type) (MaxSym0 a) t1) t2) #

data MinSym0 a6989586621679302787 (l :: TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type)) :: forall a6989586621679302787. TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) -> * #

Instances

SuppressUnusedWarnings (TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) -> *) (MinSym0 a6989586621679302787) 

Methods

suppressUnusedWarnings :: Proxy (MinSym0 a6989586621679302787) t -> () #

type Apply a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) (MinSym0 a6989586621679302787) l 
type Apply a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) (MinSym0 a6989586621679302787) l = MinSym1 a6989586621679302787 l

data MinSym1 a6989586621679302787 (l :: a6989586621679302787) (l1 :: TyFun a6989586621679302787 a6989586621679302787) :: forall a6989586621679302787. a6989586621679302787 -> TyFun a6989586621679302787 a6989586621679302787 -> * #

Instances

SuppressUnusedWarnings (a6989586621679302787 -> TyFun a6989586621679302787 a6989586621679302787 -> *) (MinSym1 a6989586621679302787) 

Methods

suppressUnusedWarnings :: Proxy (MinSym1 a6989586621679302787) t -> () #

type Apply a a (MinSym1 a l1) l2 
type Apply a a (MinSym1 a l1) l2 = Min a l1 l2

type MinSym2 a6989586621679302787 (t :: a6989586621679302787) (t1 :: a6989586621679302787) = Min a6989586621679302787 t t1 #

data MaxSym0 a6989586621679302787 (l :: TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type)) :: forall a6989586621679302787. TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) -> * #

Instances

SuppressUnusedWarnings (TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) -> *) (MaxSym0 a6989586621679302787) 

Methods

suppressUnusedWarnings :: Proxy (MaxSym0 a6989586621679302787) t -> () #

type Apply a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) (MaxSym0 a6989586621679302787) l 
type Apply a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) (MaxSym0 a6989586621679302787) l = MaxSym1 a6989586621679302787 l

data MaxSym1 a6989586621679302787 (l :: a6989586621679302787) (l1 :: TyFun a6989586621679302787 a6989586621679302787) :: forall a6989586621679302787. a6989586621679302787 -> TyFun a6989586621679302787 a6989586621679302787 -> * #

Instances

SuppressUnusedWarnings (a6989586621679302787 -> TyFun a6989586621679302787 a6989586621679302787 -> *) (MaxSym1 a6989586621679302787) 

Methods

suppressUnusedWarnings :: Proxy (MaxSym1 a6989586621679302787) t -> () #

type Apply a a (MaxSym1 a l1) l2 
type Apply a a (MaxSym1 a l1) l2 = Max a l1 l2

type MaxSym2 a6989586621679302787 (t :: a6989586621679302787) (t1 :: a6989586621679302787) = Max a6989586621679302787 t t1 #

type (+) a b = (:+) a b infixl 6 Source #

type (+@#@$$$) a b = (:+$$$) a b Source #

(%+) :: forall nat (a :: nat) (b :: nat). SNum nat => Sing a -> Sing b -> Sing ((+) a b) infixl 6 Source #

type * a b = (:*) a b infixl 7 Source #

type (*@#@$$$) a b = (:*$$$) a b Source #

(%*) :: forall nat (a :: nat) (b :: nat). SNum nat => Sing a -> Sing b -> Sing (* a b) infixl 7 Source #

type (-) a b = (:-) a b infixl 6 Source #

type (**) a b = a :** b Source #

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

type (-@#@$$$) a b = (:-$$$) a b Source #

(%-) :: forall nat (a :: nat) (b :: nat). SNum nat => Sing a -> Sing b -> Sing ((-) a b) infixl 6 Source #

Type-level predicate & judgements

data Leq (n :: Nat) (m :: Nat) where Source #

Comparison via GADTs.

Constructors

ZeroLeq :: SNat m -> Leq Zero m 
SuccLeqSucc :: Leq n m -> Leq (S n) (S m) 

type (<=) a b = (:<=) a b infix 4 Source #

type LeqInstance n m = IsTrue (n <= m) Source #

boolToPropLeq :: (n <= m) ~ True => SNat n -> SNat m -> Leq n m Source #

boolToClassLeq :: (n <= m) ~ True => SNat n -> SNat m -> LeqInstance n m Source #

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

Conversion functions

natToInt :: Integral n => Nat -> n Source #

Convert Nat into normal integers.

intToNat :: (Integral a, Ord a) => a -> Nat Source #

Convert integral numbers into Nat

sNatToInt :: Num n => SNat x -> n Source #

Convert 'SNat n' into normal integers.

Quasi quotes for natural numbers

snat :: QuasiQuoter Source #

Quotesi-quoter for SNat. This can be used for an expression.

For example: [snat|12|] %+ [snat| 5 |].

Properties of natural numbers

class (SDecide nat, SNum nat, SEnum nat, SingKind nat, SingKind nat) => IsPeano nat where Source #

Methods

succOneCong :: Succ (Zero nat) :~: One nat Source #

succInj :: (Succ n :~: Succ (m :: nat)) -> n :~: m Source #

succInj' :: proxy n -> proxy' m -> (Succ n :~: Succ (m :: nat)) -> n :~: m Source #

succNonCyclic :: Sing n -> (Succ n :~: Zero nat) -> Void Source #

induction :: p (Zero nat) -> (forall n. Sing n -> p n -> p (S n)) -> Sing k -> p k Source #

plusMinus :: Sing (n :: nat) -> Sing m -> ((n + m) - m) :~: n Source #

plusMinus' :: Sing (n :: nat) -> Sing m -> ((n + m) - n) :~: m Source #

plusZeroL :: Sing n -> (Zero nat + n) :~: n Source #

plusSuccL :: Sing n -> Sing m -> (S n + m) :~: S (n + m :: nat) Source #

plusZeroR :: Sing n -> (n + Zero nat) :~: n Source #

plusSuccR :: Sing n -> Sing m -> (n + S m) :~: S (n + m :: nat) Source #

plusComm :: Sing n -> Sing m -> (n + m) :~: ((m :: nat) + n) Source #

plusAssoc :: forall n m l. Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) + l) :~: (n + (m + l)) Source #

multZeroL :: Sing n -> (Zero nat * n) :~: Zero nat Source #

multSuccL :: Sing (n :: nat) -> Sing m -> (S n * m) :~: ((n * m) + m) Source #

multZeroR :: Sing n -> (n * Zero nat) :~: Zero nat Source #

multSuccR :: Sing n -> Sing m -> (n * S m) :~: ((n * m) + (n :: nat)) Source #

multComm :: Sing (n :: nat) -> Sing m -> (n * m) :~: (m * n) Source #

multOneR :: Sing n -> (n * One nat) :~: n Source #

multOneL :: Sing n -> (One nat * n) :~: n Source #

plusMultDistrib :: Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) * l) :~: ((n * l) + (m * l)) Source #

multPlusDistrib :: Sing (n :: nat) -> Sing m -> Sing l -> (n * (m + l)) :~: ((n * m) + (n * l)) Source #

minusNilpotent :: Sing n -> (n - n) :~: Zero nat Source #

multAssoc :: Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) * l) :~: (n * (m * l)) Source #

plusEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) :~: (n + l)) -> m :~: l Source #

plusEqCancelR :: forall n m l. Sing (n :: nat) -> Sing m -> Sing l -> ((n + l) :~: (m + l)) -> n :~: m Source #

succAndPlusOneL :: Sing n -> Succ n :~: (One nat + n) Source #

succAndPlusOneR :: Sing n -> Succ n :~: (n + One nat) Source #

predSucc :: Sing n -> Pred (Succ n) :~: (n :: nat) Source #

zeroOrSucc :: Sing (n :: nat) -> ZeroOrSucc n Source #

plusEqZeroL :: Sing n -> Sing m -> ((n + m) :~: Zero nat) -> n :~: Zero nat Source #

plusEqZeroR :: Sing n -> Sing m -> ((n + m) :~: Zero nat) -> m :~: Zero nat Source #

predUnique :: Sing (n :: nat) -> Sing m -> (Succ n :~: m) -> n :~: Pred m Source #

multEqSuccElimL :: Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) :~: Succ l) -> n :~: Succ (Pred n) Source #

multEqSuccElimR :: Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) :~: Succ l) -> m :~: Succ (Pred m) Source #

minusZero :: Sing n -> (n - Zero nat) :~: n Source #

multEqCancelR :: Sing (n :: nat) -> Sing m -> Sing l -> ((n * Succ l) :~: (m * Succ l)) -> n :~: m Source #

succPred :: Sing n -> ((n :~: Zero nat) -> Void) -> Succ (Pred n) :~: n Source #

multEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> ((Succ n * m) :~: (Succ n * l)) -> m :~: l Source #

sPred' :: proxy n -> Sing (Succ n) -> Sing (n :: nat) Source #

toNatural :: Sing (n :: nat) -> Natural Source #

fromNatural :: Natural -> SomeSing nat Source #

plusCong :: (n :~: m) -> (n' :~: m') -> (n + n') :~: (m + m') Source #

plusCongR :: Sing k -> (n :~: m) -> (k + n) :~: (k + m) Source #

plusCongL :: (n :~: m) -> Sing k -> (n + k) :~: (m + k) Source #

snEqZAbsurd :: SingI n => (S n :~: Z) -> a Source #

plusInjectiveL :: SNat n -> SNat m -> SNat l -> ((n + m) :~: (n + l)) -> m :~: l Source #

plusInjectiveR :: SNat n -> SNat m -> SNat l -> ((n + l) :~: (m + l)) -> n :~: m Source #

multCongL :: (n :~: m) -> Sing k -> (n * k) :~: (m * k) Source #

multCongR :: Sing k -> (n :~: m) -> (k * n) :~: (k * m) Source #

multCong :: (n :~: m) -> (l :~: k) -> (n * l) :~: (m * k) Source #

plusMinusEqL :: SNat n -> SNat m -> ((n + m) - m) :~: n Source #

plusNeutralR :: SNat n -> SNat m -> ((n + m) :~: n) -> m :~: Z Source #

plusNeutralL :: SNat n -> SNat m -> ((n + m) :~: m) -> n :~: Z Source #

Properties of ordering Leq

class (SOrd nat, IsPeano nat) => PeanoOrder nat where Source #

Methods

leqToCmp :: Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> Either (a :~: b) (Compare a b :~: LT) Source #

eqlCmpEQ :: Sing (a :: nat) -> Sing b -> (a :~: b) -> Compare a b :~: EQ Source #

eqToRefl :: Sing (a :: nat) -> Sing b -> (Compare a b :~: EQ) -> a :~: b Source #

flipCompare :: Sing (a :: nat) -> Sing b -> FlipOrdering (Compare a b) :~: Compare b a Source #

ltToNeq :: Sing (a :: nat) -> Sing b -> (Compare a b :~: LT) -> (a :~: b) -> Void Source #

leqNeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> ((a :~: b) -> Void) -> Compare a b :~: LT Source #

succLeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (S a <= b) -> Compare a b :~: LT Source #

ltToLeq :: Sing (a :: nat) -> Sing b -> (Compare a b :~: LT) -> IsTrue (a <= b) Source #

gtToLeq :: Sing (a :: nat) -> Sing b -> (Compare a b :~: GT) -> IsTrue (b <= a) Source #

ltToSuccLeq :: Sing (a :: nat) -> Sing b -> (Compare a b :~: LT) -> IsTrue (Succ a <= b) Source #

cmpZero :: Sing a -> Compare (Zero nat) (Succ a) :~: LT Source #

leqToGT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ b <= a) -> Compare a b :~: GT Source #

cmpZero' :: Sing a -> Either (Compare (Zero nat) a :~: EQ) (Compare (Zero nat) a :~: LT) Source #

zeroNoLT :: Sing a -> (Compare a (Zero nat) :~: LT) -> Void Source #

ltRightPredSucc :: Sing (a :: nat) -> Sing b -> (Compare a b :~: LT) -> b :~: Succ (Pred b) Source #

cmpSucc :: Sing (n :: nat) -> Sing m -> Compare n m :~: Compare (Succ n) (Succ m) Source #

ltSucc :: Sing (a :: nat) -> Compare a (Succ a) :~: LT Source #

cmpSuccStepR :: Sing (n :: nat) -> Sing m -> (Compare n m :~: LT) -> Compare n (Succ m) :~: LT Source #

ltSuccLToLT :: Sing (n :: nat) -> Sing m -> (Compare (Succ n) m :~: LT) -> Compare n m :~: LT Source #

leqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ a <= b) -> Compare a b :~: LT Source #

leqZero :: Sing n -> IsTrue (Zero nat <= n) Source #

leqSucc :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (Succ n <= Succ m) Source #

fromLeqView :: LeqView (n :: nat) m -> IsTrue (n <= m) Source #

leqViewRefl :: Sing (n :: nat) -> LeqView n n Source #

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

leqWitness :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> DiffNat n m Source #

leqStep :: Sing (n :: nat) -> Sing m -> Sing l -> ((n + l) :~: m) -> IsTrue (n <= m) Source #

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

leqRefl :: Sing (n :: nat) -> IsTrue (n <= n) Source #

leqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (n <= Succ m) Source #

leqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n <= m) -> IsTrue (n <= m) Source #

leqReflexive :: Sing (n :: nat) -> Sing m -> (n :~: m) -> IsTrue (n <= m) Source #

leqTrans :: Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n <= m) -> IsTrue (m <= l) -> IsTrue (n <= l) Source #

leqAntisymm :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (m <= n) -> n :~: m Source #

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

leqZeroElim :: Sing n -> IsTrue (n <= Zero nat) -> n :~: Zero nat Source #

plusMonotoneL :: Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n <= m) -> IsTrue ((n + l) <= (m + l)) Source #

plusMonotoneR :: Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m <= l) -> IsTrue ((n + m) <= (n + l)) Source #

plusLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n <= (n + m)) Source #

plusLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m <= (n + m)) Source #

plusCancelLeqR :: Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + l) <= (m + l)) -> IsTrue (n <= m) Source #

plusCancelLeqL :: Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + m) <= (n + l)) -> IsTrue (m <= l) Source #

succLeqZeroAbsurd :: Sing n -> IsTrue (S n <= Zero nat) -> Void Source #

succLeqZeroAbsurd' :: Sing n -> (S n <= Zero nat) :~: False Source #

succLeqAbsurd :: Sing (n :: nat) -> IsTrue (S n <= n) -> Void Source #

succLeqAbsurd' :: Sing (n :: nat) -> (S n <= n) :~: False Source #

notLeqToLeq :: (n <= m) ~ False => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) Source #

leqSucc' :: Sing (n :: nat) -> Sing m -> (n <= m) :~: (Succ n <= Succ m) Source #

leqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Min n m :~: n Source #

geqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Min n m :~: m Source #

minComm :: Sing (n :: nat) -> Sing m -> Min n m :~: Min m n Source #

minLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= n) Source #

minLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= m) Source #

minLargest :: Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (l <= n) -> IsTrue (l <= m) -> IsTrue (l <= Min n m) Source #

leqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Max n m :~: m Source #

geqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Max n m :~: n Source #

maxComm :: Sing (n :: nat) -> Sing m -> Max n m :~: Max m n Source #

maxLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m <= Max n m) Source #

maxLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n <= Max n m) Source #

maxLeast :: Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (n <= l) -> IsTrue (m <= l) -> IsTrue (Max n m <= l) Source #

leqReversed :: Sing (n :: nat) -> Sing m -> (n <= m) :~: (m >= n) Source #

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

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

lneqToLT :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> Compare n m :~: LT Source #

ltToLneq :: Sing (n :: nat) -> Sing (m :: nat) -> (Compare n m :~: LT) -> IsTrue (n < m) Source #

lneqZero :: Sing (a :: nat) -> IsTrue (Zero nat < Succ a) Source #

lneqSucc :: Sing (n :: nat) -> IsTrue (n < Succ n) Source #

succLneqSucc :: Sing (n :: nat) -> Sing (m :: nat) -> (n < m) :~: (Succ n < Succ m) Source #

lneqRightPredSucc :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> m :~: Succ (Pred m) Source #

lneqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n < m) -> IsTrue (n < m) Source #

lneqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n < m) -> IsTrue (n < Succ m) Source #

plusStrictMonotone :: Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n < m) -> IsTrue (l < k) -> IsTrue ((n + l) < (m + k)) Source #

maxZeroL :: Sing n -> Max (Zero nat) n :~: n Source #

maxZeroR :: Sing n -> Max n (Zero nat) :~: n Source #

minZeroL :: Sing n -> Min (Zero nat) n :~: Zero nat Source #

minZeroR :: Sing n -> Min n (Zero nat) :~: Zero nat Source #

minusSucc :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> (Succ n - m) :~: Succ (n - m) Source #

lneqZeroAbsurd :: Sing n -> IsTrue (n < Zero nat) -> Void Source #

minusPlus :: forall (n :: nat) m. PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> ((n - m) + m) :~: n Source #

reflToSEqual :: SNat n -> SNat m -> (n :~: m) -> IsTrue (n == m) Source #

sLeqReflexive :: SNat n -> SNat m -> IsTrue (n == m) -> IsTrue (n <= m) Source #

nonSLeqToLT :: (n <= m) ~ False => SNat n -> SNat m -> Compare m n :~: LT Source #

Useful type synonyms and constructors

type family Zero :: Nat where ... Source #

Equations

Zero = ZSym0 

type family One :: Nat where ... Source #

Equations

One = Apply SSym0 ZeroSym0 

type family Two :: Nat where ... Source #

Equations

Two = Apply SSym0 OneSym0 

type family Three :: Nat where ... Source #

Equations

Three = Apply SSym0 TwoSym0 

type family Four :: Nat where ... Source #

Equations

Four = Apply SSym0 ThreeSym0 

type family Five :: Nat where ... Source #

Equations

Five = Apply SSym0 FourSym0 

type family Six :: Nat where ... Source #

Equations

Six = Apply SSym0 FiveSym0 

type family Seven :: Nat where ... Source #

Equations

Seven = Apply SSym0 SixSym0 

type family Eight :: Nat where ... Source #

Equations

Eight = Apply SSym0 SevenSym0 

type family Nine :: Nat where ... Source #

Equations

Nine = Apply SSym0 EightSym0 

type family Ten :: Nat where ... Source #

Equations

Ten = Apply SSym0 NineSym0 

type family Eleven :: Nat where ... Source #

Equations

Eleven = Apply SSym0 TenSym0 

type family Twelve :: Nat where ... Source #

type family Thirteen :: Nat where ... Source #

type family Fourteen :: Nat where ... Source #

type family Fifteen :: Nat where ... Source #

type family Sixteen :: Nat where ... Source #

type family Seventeen :: Nat where ... Source #

type family Eighteen :: Nat where ... Source #

type family Nineteen :: Nat where ... Source #

type family Twenty :: Nat where ... Source #

type family N0 :: Nat where ... Source #

Equations

N0 = ZeroSym0 

type family N1 :: Nat where ... Source #

Equations

N1 = OneSym0 

type family N2 :: Nat where ... Source #

Equations

N2 = TwoSym0 

type family N3 :: Nat where ... Source #

Equations

N3 = ThreeSym0 

type family N4 :: Nat where ... Source #

Equations

N4 = FourSym0 

type family N5 :: Nat where ... Source #

Equations

N5 = FiveSym0 

type family N6 :: Nat where ... Source #

Equations

N6 = SixSym0 

type family N7 :: Nat where ... Source #

Equations

N7 = SevenSym0 

type family N8 :: Nat where ... Source #

Equations

N8 = EightSym0 

type family N9 :: Nat where ... Source #

Equations

N9 = NineSym0 

type family N10 :: Nat where ... Source #

Equations

N10 = TenSym0 

type family N11 :: Nat where ... Source #

Equations

N11 = ElevenSym0 

type family N12 :: Nat where ... Source #

Equations

N12 = TwelveSym0 

type family N13 :: Nat where ... Source #

Equations

N13 = ThirteenSym0 

type family N14 :: Nat where ... Source #

Equations

N14 = FourteenSym0 

type family N15 :: Nat where ... Source #

Equations

N15 = FifteenSym0 

type family N16 :: Nat where ... Source #

Equations

N16 = SixteenSym0 

type family N17 :: Nat where ... Source #

Equations

N17 = SeventeenSym0 

type family N18 :: Nat where ... Source #

Equations

N18 = EighteenSym0 

type family N19 :: Nat where ... Source #

Equations

N19 = NineteenSym0 

type family N20 :: Nat where ... Source #

Equations

N20 = TwentySym0 

type N0Sym0 = N0 Source #

type N1Sym0 = N1 Source #

type N2Sym0 = N2 Source #

type N3Sym0 = N3 Source #

type N4Sym0 = N4 Source #

type N5Sym0 = N5 Source #

type N6Sym0 = N6 Source #

type N7Sym0 = N7 Source #

type N8Sym0 = N8 Source #

type N9Sym0 = N9 Source #

Orphan instances

IsPeano Nat Source #

Since 0.5.0.0

Methods

succOneCong :: (Nat :~: Succ Nat (Zero Nat)) (One Nat) Source #

succInj :: (Nat :~: Succ Nat n) (Succ Nat m) -> (Nat :~: n) m Source #

succInj' :: proxy n -> proxy' m -> (Nat :~: Succ Nat n) (Succ Nat m) -> (Nat :~: n) m Source #

succNonCyclic :: Sing Nat n -> (Nat :~: Succ Nat n) (Zero Nat) -> Void Source #

induction :: p (Zero Nat) -> (forall (n :: Nat). Sing Nat n -> p n -> p (S Nat n)) -> Sing Nat k -> p k Source #

plusMinus :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat - (Nat + n) m) m) n Source #

plusMinus' :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat - (Nat + n) m) n) m Source #

plusZeroL :: Sing Nat n -> (Nat :~: (Nat + Zero Nat) n) n Source #

plusSuccL :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat + S Nat n) m) (S Nat ((Nat + n) m)) Source #

plusZeroR :: Sing Nat n -> (Nat :~: (Nat + n) (Zero Nat)) n Source #

plusSuccR :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat + n) (S Nat m)) (S Nat ((Nat + n) m)) Source #

plusComm :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat + n) m) ((Nat + m) n) Source #

plusAssoc :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat + (Nat + n) m) l) ((Nat + n) ((Nat + m) l)) Source #

multZeroL :: Sing Nat n -> (Nat :~: (Nat * Zero Nat) n) (Zero Nat) Source #

multSuccL :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat * S Nat n) m) ((Nat + (Nat * n) m) m) Source #

multZeroR :: Sing Nat n -> (Nat :~: (Nat * n) (Zero Nat)) (Zero Nat) Source #

multSuccR :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat * n) (S Nat m)) ((Nat + (Nat * n) m) n) Source #

multComm :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat * n) m) ((Nat * m) n) Source #

multOneR :: Sing Nat n -> (Nat :~: (Nat * n) (One Nat)) n Source #

multOneL :: Sing Nat n -> (Nat :~: (Nat * One Nat) n) n Source #

plusMultDistrib :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * (Nat + n) m) l) ((Nat + (Nat * n) l) ((Nat * m) l)) Source #

multPlusDistrib :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * n) ((Nat + m) l)) ((Nat + (Nat * n) m) ((Nat * n) l)) Source #

minusNilpotent :: Sing Nat n -> (Nat :~: (Nat - n) n) (Zero Nat) Source #

multAssoc :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * (Nat * n) m) l) ((Nat * n) ((Nat * m) l)) Source #

plusEqCancelL :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat + n) m) ((Nat + n) l) -> (Nat :~: m) l Source #

plusEqCancelR :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat + n) l) ((Nat + m) l) -> (Nat :~: n) m Source #

succAndPlusOneL :: Sing Nat n -> (Nat :~: Succ Nat n) ((Nat + One Nat) n) Source #

succAndPlusOneR :: Sing Nat n -> (Nat :~: Succ Nat n) ((Nat + n) (One Nat)) Source #

predSucc :: Sing Nat n -> (Nat :~: Pred Nat (Succ Nat n)) n Source #

zeroOrSucc :: Sing Nat n -> ZeroOrSucc Nat n Source #

plusEqZeroL :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat + n) m) (Zero Nat) -> (Nat :~: n) (Zero Nat) Source #

plusEqZeroR :: Sing Nat n -> Sing Nat m -> (Nat :~: (Nat + n) m) (Zero Nat) -> (Nat :~: m) (Zero Nat) Source #

predUnique :: Sing Nat n -> Sing Nat m -> (Nat :~: Succ Nat n) m -> (Nat :~: n) (Pred Nat m) Source #

multEqSuccElimL :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * n) m) (Succ Nat l) -> (Nat :~: n) (Succ Nat (Pred Nat n)) Source #

multEqSuccElimR :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * n) m) (Succ Nat l) -> (Nat :~: m) (Succ Nat (Pred Nat m)) Source #

minusZero :: Sing Nat n -> (Nat :~: (Nat - n) (Zero Nat)) n Source #

multEqCancelR :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * n) (Succ Nat l)) ((Nat * m) (Succ Nat l)) -> (Nat :~: n) m Source #

succPred :: Sing Nat n -> ((Nat :~: n) (Zero Nat) -> Void) -> (Nat :~: Succ Nat (Pred Nat n)) n Source #

multEqCancelL :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat * Succ Nat n) m) ((Nat * Succ Nat n) l) -> (Nat :~: m) l Source #

sPred' :: proxy n -> Sing Nat (Succ Nat n) -> Sing Nat n Source #

toNatural :: Sing Nat n -> Natural Source #

fromNatural :: Natural -> SomeSing Nat Source #

PeanoOrder Nat Source # 

Methods

leqToCmp :: Sing Nat a -> Sing Nat b -> IsTrue ((Nat <= a) b) -> Either ((Nat :~: a) b) ((Ordering :~: Compare Nat a b) LT) Source #

eqlCmpEQ :: Sing Nat a -> Sing Nat b -> (Nat :~: a) b -> (Ordering :~: Compare Nat a b) EQ Source #

eqToRefl :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) EQ -> (Nat :~: a) b Source #

flipCompare :: Sing Nat a -> Sing Nat b -> (Ordering :~: FlipOrdering (Compare Nat a b)) (Compare Nat b a) Source #

ltToNeq :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) LT -> (Nat :~: a) b -> Void Source #

leqNeqToLT :: Sing Nat a -> Sing Nat b -> IsTrue ((Nat <= a) b) -> ((Nat :~: a) b -> Void) -> (Ordering :~: Compare Nat a b) LT Source #

succLeqToLT :: Sing Nat a -> Sing Nat b -> IsTrue ((Nat <= S Nat a) b) -> (Ordering :~: Compare Nat a b) LT Source #

ltToLeq :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) LT -> IsTrue ((Nat <= a) b) Source #

gtToLeq :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) GT -> IsTrue ((Nat <= b) a) Source #

ltToSuccLeq :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) LT -> IsTrue ((Nat <= Succ Nat a) b) Source #

cmpZero :: Sing Nat a -> (Ordering :~: Compare Nat (Zero Nat) (Succ Nat a)) LT Source #

leqToGT :: Sing Nat a -> Sing Nat b -> IsTrue ((Nat <= Succ Nat b) a) -> (Ordering :~: Compare Nat a b) GT Source #

cmpZero' :: Sing Nat a -> Either ((Ordering :~: Compare Nat (Zero Nat) a) EQ) ((Ordering :~: Compare Nat (Zero Nat) a) LT) Source #

zeroNoLT :: Sing Nat a -> (Ordering :~: Compare Nat a (Zero Nat)) LT -> Void Source #

ltRightPredSucc :: Sing Nat a -> Sing Nat b -> (Ordering :~: Compare Nat a b) LT -> (Nat :~: b) (Succ Nat (Pred Nat b)) Source #

cmpSucc :: Sing Nat n -> Sing Nat m -> (Ordering :~: Compare Nat n m) (Compare Nat (Succ Nat n) (Succ Nat m)) Source #

ltSucc :: Sing Nat a -> (Ordering :~: Compare Nat a (Succ Nat a)) LT Source #

cmpSuccStepR :: Sing Nat n -> Sing Nat m -> (Ordering :~: Compare Nat n m) LT -> (Ordering :~: Compare Nat n (Succ Nat m)) LT Source #

ltSuccLToLT :: Sing Nat n -> Sing Nat m -> (Ordering :~: Compare Nat (Succ Nat n) m) LT -> (Ordering :~: Compare Nat n m) LT Source #

leqToLT :: Sing Nat a -> Sing Nat b -> IsTrue ((Nat <= Succ Nat a) b) -> (Ordering :~: Compare Nat a b) LT Source #

leqZero :: Sing Nat n -> IsTrue ((Nat <= Zero Nat) n) Source #

leqSucc :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> IsTrue ((Nat <= Succ Nat n) (Succ Nat m)) Source #

fromLeqView :: LeqView Nat n m -> IsTrue ((Nat <= n) m) Source #

leqViewRefl :: Sing Nat n -> LeqView Nat n n Source #

viewLeq :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> LeqView Nat n m Source #

leqWitness :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> DiffNat Nat n m Source #

leqStep :: Sing Nat n -> Sing Nat m -> Sing Nat l -> (Nat :~: (Nat + n) l) m -> IsTrue ((Nat <= n) m) Source #

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

leqRefl :: Sing Nat n -> IsTrue ((Nat <= n) n) Source #

leqSuccStepR :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> IsTrue ((Nat <= n) (Succ Nat m)) Source #

leqSuccStepL :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= Succ Nat n) m) -> IsTrue ((Nat <= n) m) Source #

leqReflexive :: Sing Nat n -> Sing Nat m -> (Nat :~: n) m -> IsTrue ((Nat <= n) m) Source #

leqTrans :: Sing Nat n -> Sing Nat m -> Sing Nat l -> IsTrue ((Nat <= n) m) -> IsTrue ((Nat <= m) l) -> IsTrue ((Nat <= n) l) Source #

leqAntisymm :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> IsTrue ((Nat <= m) n) -> (Nat :~: n) m Source #

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

leqZeroElim :: Sing Nat n -> IsTrue ((Nat <= n) (Zero Nat)) -> (Nat :~: n) (Zero Nat) Source #

plusMonotoneL :: Sing Nat n -> Sing Nat m -> Sing Nat l -> IsTrue ((Nat <= n) m) -> IsTrue ((Nat <= (Nat + n) l) ((Nat + m) l)) Source #

plusMonotoneR :: Sing Nat n -> Sing Nat m -> Sing Nat l -> IsTrue ((Nat <= m) l) -> IsTrue ((Nat <= (Nat + n) m) ((Nat + n) l)) Source #

plusLeqL :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) ((Nat + n) m)) Source #

plusLeqR :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) ((Nat + n) m)) Source #

plusCancelLeqR :: Sing Nat n -> Sing Nat m -> Sing Nat l -> IsTrue ((Nat <= (Nat + n) l) ((Nat + m) l)) -> IsTrue ((Nat <= n) m) Source #

plusCancelLeqL :: Sing Nat n -> Sing Nat m -> Sing Nat l -> IsTrue ((Nat <= (Nat + n) m) ((Nat + n) l)) -> IsTrue ((Nat <= m) l) Source #

succLeqZeroAbsurd :: Sing Nat n -> IsTrue ((Nat <= S Nat n) (Zero Nat)) -> Void Source #

succLeqZeroAbsurd' :: Sing Nat n -> (Bool :~: (Nat <= S Nat n) (Zero Nat)) False Source #

succLeqAbsurd :: Sing Nat n -> IsTrue ((Nat <= S Nat n) n) -> Void Source #

succLeqAbsurd' :: Sing Nat n -> (Bool :~: (Nat <= S Nat n) n) False Source #

notLeqToLeq :: (Bool ~ (Nat <= n) m) False => Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) n) Source #

leqSucc' :: Sing Nat n -> Sing Nat m -> (Bool :~: (Nat <= n) m) ((Nat <= Succ Nat n) (Succ Nat m)) Source #

leqToMin :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> (Nat :~: Min Nat n m) n Source #

geqToMin :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) n) -> (Nat :~: Min Nat n m) m Source #

minComm :: Sing Nat n -> Sing Nat m -> (Nat :~: Min Nat n m) (Min Nat m n) Source #

minLeqL :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= Min Nat n m) n) Source #

minLeqR :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= Min Nat n m) m) Source #

minLargest :: Sing Nat l -> Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= l) n) -> IsTrue ((Nat <= l) m) -> IsTrue ((Nat <= l) (Min Nat n m)) Source #

leqToMax :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) m) -> (Nat :~: Max Nat n m) m Source #

geqToMax :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) n) -> (Nat :~: Max Nat n m) n Source #

maxComm :: Sing Nat n -> Sing Nat m -> (Nat :~: Max Nat n m) (Max Nat m n) Source #

maxLeqR :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) (Max Nat n m)) Source #

maxLeqL :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) (Max Nat n m)) Source #

maxLeast :: Sing Nat l -> Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= n) l) -> IsTrue ((Nat <= m) l) -> IsTrue ((Nat <= Max Nat n m) l) Source #

leqReversed :: Sing Nat n -> Sing Nat m -> (Bool :~: (Nat <= n) m) ((Nat >= m) n) Source #

lneqSuccLeq :: Sing Nat n -> Sing Nat m -> (Bool :~: (Nat < n) m) ((Nat <= Succ Nat n) m) Source #

lneqReversed :: Sing Nat n -> Sing Nat m -> (Bool :~: (Nat < n) m) ((Nat > m) n) Source #

lneqToLT :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat < n) m) -> (Ordering :~: Compare Nat n m) LT Source #

ltToLneq :: Sing Nat n -> Sing Nat m -> (Ordering :~: Compare Nat n m) LT -> IsTrue ((Nat < n) m) Source #

lneqZero :: Sing Nat a -> IsTrue ((Nat < Zero Nat) (Succ Nat a)) Source #

lneqSucc :: Sing Nat n -> IsTrue ((Nat < n) (Succ Nat n)) Source #

succLneqSucc :: Sing Nat n -> Sing Nat m -> (Bool :~: (Nat < n) m) ((Nat < Succ Nat n) (Succ Nat m)) Source #

lneqRightPredSucc :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat < n) m) -> (Nat :~: m) (Succ Nat (Pred Nat m)) Source #

lneqSuccStepL :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat < Succ Nat n) m) -> IsTrue ((Nat < n) m) Source #

lneqSuccStepR :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat < n) m) -> IsTrue ((Nat < n) (Succ Nat m)) Source #

plusStrictMonotone :: Sing Nat n -> Sing Nat m -> Sing Nat l -> Sing Nat k -> IsTrue ((Nat < n) m) -> IsTrue ((Nat < l) k) -> IsTrue ((Nat < (Nat + n) l) ((Nat + m) k)) Source #

maxZeroL :: Sing Nat n -> (Nat :~: Max Nat (Zero Nat) n) n Source #

maxZeroR :: Sing Nat n -> (Nat :~: Max Nat n (Zero Nat)) n Source #

minZeroL :: Sing Nat n -> (Nat :~: Min Nat (Zero Nat) n) (Zero Nat) Source #

minZeroR :: Sing Nat n -> (Nat :~: Min Nat n (Zero Nat)) (Zero Nat) Source #

minusSucc :: Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) n) -> (Nat :~: (Nat - Succ Nat n) m) (Succ Nat ((Nat - n) m)) Source #

lneqZeroAbsurd :: Sing Nat n -> IsTrue ((Nat < n) (Zero Nat)) -> Void Source #

minusPlus :: PeanoOrder Nat => Sing Nat n -> Sing Nat m -> IsTrue ((Nat <= m) n) -> (Nat :~: (Nat + (Nat - n) m) m) n Source #