packages feed

type-natural 0.7.1.4 → 0.8.0.0

raw patch · 14 files changed

+935/−760 lines, 14 filesdep −monomorphicdep ~constraintsdep ~equational-reasoningdep ~ghc-typelits-presburgerPVP ok

version bump matches the API change (PVP)

Dependencies removed: monomorphic

Dependency ranges changed: constraints, equational-reasoning, ghc-typelits-presburger, singletons, template-haskell

API changes (from Hackage documentation)

- Data.Type.Natural: (%:*) :: SNum a0 => forall (t0 :: a0) (t1 :: a0). Sing a0 t0 -> Sing a0 t1 -> Sing a0 (Apply a0 a0 (Apply a0 (TyFun a0 a0 -> Type) ((:*$) a0) t0) t1)
- Data.Type.Natural: (%:**) :: forall (t_anwy :: Nat) (t_anwz :: Nat). Sing t_anwy -> Sing t_anwz -> Sing (Apply (Apply (:**$) t_anwy) t_anwz :: Nat)
- Data.Type.Natural: (%:+) :: SNum a0 => forall (t0 :: a0) (t1 :: a0). Sing a0 t0 -> Sing a0 t1 -> Sing a0 (Apply a0 a0 (Apply a0 (TyFun a0 a0 -> Type) ((:+$) a0) t0) t1)
- Data.Type.Natural: (%:-) :: SNum a0 => forall (t0 :: a0) (t1 :: a0). Sing a0 t0 -> Sing a0 t1 -> Sing a0 (Apply a0 a0 (Apply a0 (TyFun a0 a0 -> Type) ((:-$) a0) t0) t1)
- Data.Type.Natural: data (:-$$) a6989586621679425695 (l0 :: a6989586621679425695) (l1 :: TyFun a6989586621679425695 a6989586621679425695) :: forall a6989586621679425695. a6989586621679425695 -> TyFun a6989586621679425695 a6989586621679425695 -> *
- Data.Type.Natural: data MaxSym0 a6989586621679305513 (l0 :: TyFun a6989586621679305513 (TyFun a6989586621679305513 a6989586621679305513 -> Type)) :: forall a6989586621679305513. TyFun a6989586621679305513 (TyFun a6989586621679305513 a6989586621679305513 -> Type) -> *
- Data.Type.Natural: data MaxSym1 a6989586621679305513 (l0 :: a6989586621679305513) (l1 :: TyFun a6989586621679305513 a6989586621679305513) :: forall a6989586621679305513. a6989586621679305513 -> TyFun a6989586621679305513 a6989586621679305513 -> *
- Data.Type.Natural: data MinSym0 a6989586621679305513 (l0 :: TyFun a6989586621679305513 (TyFun a6989586621679305513 a6989586621679305513 -> Type)) :: forall a6989586621679305513. TyFun a6989586621679305513 (TyFun a6989586621679305513 a6989586621679305513 -> Type) -> *
- Data.Type.Natural: data MinSym1 a6989586621679305513 (l0 :: a6989586621679305513) (l1 :: TyFun a6989586621679305513 a6989586621679305513) :: forall a6989586621679305513. a6989586621679305513 -> TyFun a6989586621679305513 a6989586621679305513 -> *
- Data.Type.Natural: instance Data.Type.Monomorphic.Monomorphicable Data.Singletons.Sing
- Data.Type.Natural.Builtin: instance Data.Type.Monomorphic.Monomorphicable Data.Singletons.Sing
- Data.Type.Natural.Class.Order: (%:-.) :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (n :-. m)
- Data.Type.Ordinal: instance (Data.Singletons.SingI m, Data.Singletons.SingI n, n ~ (m GHC.TypeLits.+ 1)) => GHC.Enum.Bounded (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1 (n :: nat1). (Data.Singletons.SingI n, Data.Type.Ordinal.HasOrdinal nat1) => GHC.Show.Show (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1 (n :: nat1). (Data.Type.Ordinal.HasOrdinal nat1, Data.Singletons.SingI n) => GHC.Enum.Enum (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1 (n :: nat1). (Data.Type.Ordinal.HasOrdinal nat1, Data.Singletons.SingI n) => GHC.Num.Num (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1 (n :: nat1). Data.Type.Ordinal.HasOrdinal nat1 => GHC.Classes.Eq (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1 (n :: nat1). Data.Type.Ordinal.HasOrdinal nat1 => GHC.Classes.Ord (Data.Type.Ordinal.Ordinal n)
- Data.Type.Ordinal: instance forall k (nat :: k) nat1. (Data.Type.Natural.Class.Order.PeanoOrder nat1, Data.Type.Monomorphic.Monomorphicable Data.Singletons.Sing, GHC.Real.Integral (Data.Type.Monomorphic.MonomorphicRep Data.Singletons.Sing), GHC.Show.Show (Data.Type.Monomorphic.MonomorphicRep Data.Singletons.Sing)) => Data.Type.Ordinal.HasOrdinal nat1
+ Data.Type.Natural: data MaxSym0 a6989586621679302787 (l :: TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type)) :: forall a6989586621679302787. () => TyFun a6989586621679302787 (TyFun a6989586621679302787 a6989586621679302787 -> Type) -> *
+ Data.Type.Natural: data MaxSym1 a6989586621679302787 (l :: a6989586621679302787) (l1 :: TyFun a6989586621679302787 a6989586621679302787) :: forall a6989586621679302787. () => a6989586621679302787 -> TyFun a6989586621679302787 a6989586621679302787 -> *
+ Data.Type.Natural: fromNatural :: IsPeano nat => Natural -> SomeSing nat
+ Data.Type.Natural: toNatural :: IsPeano nat => Sing (n :: nat) -> Natural
+ Data.Type.Natural: type *@#@$ = (:*$)
+ Data.Type.Natural: type *@#@$$ = (:*$$)
+ Data.Type.Natural: type +@#@$ = (:+$)
+ Data.Type.Natural: type +@#@$$ = (:+$$)
+ Data.Type.Natural: type -@#@$ = (:-$)
+ Data.Type.Natural: type -@#@$$ = (:-$$)
+ Data.Type.Natural.Builtin: (%*) :: forall nat_al84 (a_al82 :: nat_al84) (b_al83 :: nat_al84). SNum nat_al84 => Sing a_al82 -> Sing b_al83 -> Sing ((*) a_al82 b_al83)
+ Data.Type.Natural.Builtin: (%+) :: forall nat_al45 (a_al43 :: nat_al45) (b_al44 :: nat_al45). SNum nat_al45 => Sing a_al43 -> Sing b_al44 -> Sing ((+) a_al43 b_al44)
+ Data.Type.Natural.Builtin: (%-) :: forall nat_al6m (a_al6k :: nat_al6m) (b_al6l :: nat_al6m). SNum nat_al6m => Sing a_al6k -> Sing b_al6l -> Sing ((-) a_al6k b_al6l)
+ Data.Type.Natural.Builtin: (%/=) :: forall nat_akZc (a_akZa :: nat_akZc) (b_akZb :: nat_akZc). SEq nat_akZc => Sing a_akZa -> Sing b_akZb -> Sing ((/=) a_akZa b_akZb)
+ Data.Type.Natural.Builtin: (%<) :: forall nat_akRk (a_akRi :: nat_akRk) (b_akRj :: nat_akRk). SOrd nat_akRk => Sing a_akRi -> Sing b_akRj -> Sing ((<) a_akRi b_akRj)
+ Data.Type.Natural.Builtin: (%<=) :: forall nat_akVK (a_akVI :: nat_akVK) (b_akVJ :: nat_akVK). SOrd nat_akVK => Sing a_akVI -> Sing b_akVJ -> Sing ((<=) a_akVI b_akVJ)
+ Data.Type.Natural.Builtin: (%==) :: forall nat_al15 (a_al13 :: nat_al15) (b_al14 :: nat_al15). SEq nat_al15 => Sing a_al13 -> Sing b_al14 -> Sing ((==) a_al13 b_al14)
+ Data.Type.Natural.Builtin: (%>) :: forall nat_akU1 (a_akTZ :: nat_akU1) (b_akU0 :: nat_akU1). SOrd nat_akU1 => Sing a_akTZ -> Sing b_akU0 -> Sing ((>) a_akTZ b_akU0)
+ Data.Type.Natural.Builtin: (%>=) :: forall nat_akXt (a_akXr :: nat_akXt) (b_akXs :: nat_akXt). SOrd nat_akXt => Sing a_akXr -> Sing b_akXs -> Sing ((>=) a_akXr b_akXs)
+ Data.Type.Natural.Builtin: fromNatural :: IsPeano nat => Natural -> SomeSing nat
+ Data.Type.Natural.Builtin: infix 4 %==
+ Data.Type.Natural.Builtin: infixl 6 %-
+ Data.Type.Natural.Builtin: infixl 7 %*
+ Data.Type.Natural.Builtin: toNatural :: IsPeano nat => Sing (n :: nat) -> Natural
+ Data.Type.Natural.Builtin: type (*@#@$$$) a_al82 b_al83 = (:*$$$) a_al82 b_al83
+ Data.Type.Natural.Builtin: type *@#@$ = (:*$)
+ Data.Type.Natural.Builtin: type *@#@$$ = (:*$$)
+ Data.Type.Natural.Builtin: type +@#@$ = (:+$)
+ Data.Type.Natural.Builtin: type +@#@$$ = (:+$$)
+ Data.Type.Natural.Builtin: type -@#@$ = (:-$)
+ Data.Type.Natural.Builtin: type -@#@$$ = (:-$$)
+ Data.Type.Natural.Builtin: type /=@#@$ = (:/=$)
+ Data.Type.Natural.Builtin: type /=@#@$$ = (:/=$$)
+ Data.Type.Natural.Builtin: type <=@#@$ = (:<=$)
+ Data.Type.Natural.Builtin: type <=@#@$$ = (:<=$$)
+ Data.Type.Natural.Builtin: type <@#@$ = (:<$)
+ Data.Type.Natural.Builtin: type <@#@$$ = (:<$$)
+ Data.Type.Natural.Builtin: type ==@#@$ = (:==$)
+ Data.Type.Natural.Builtin: type ==@#@$$ = (:==$$)
+ Data.Type.Natural.Builtin: type >=@#@$ = (:>=$)
+ Data.Type.Natural.Builtin: type >=@#@$$ = (:>=$$)
+ Data.Type.Natural.Builtin: type >@#@$ = (:>$)
+ Data.Type.Natural.Builtin: type >@#@$$ = (:>$$)
+ Data.Type.Natural.Class.Arithmetic: (%*) :: forall nat_al84 (a_al82 :: nat_al84) (b_al83 :: nat_al84). SNum nat_al84 => Sing a_al82 -> Sing b_al83 -> Sing ((*) a_al82 b_al83)
+ Data.Type.Natural.Class.Arithmetic: (%+) :: forall nat_al45 (a_al43 :: nat_al45) (b_al44 :: nat_al45). SNum nat_al45 => Sing a_al43 -> Sing b_al44 -> Sing ((+) a_al43 b_al44)
+ Data.Type.Natural.Class.Arithmetic: (%-) :: forall nat_al6m (a_al6k :: nat_al6m) (b_al6l :: nat_al6m). SNum nat_al6m => Sing a_al6k -> Sing b_al6l -> Sing ((-) a_al6k b_al6l)
+ Data.Type.Natural.Class.Arithmetic: (%/=) :: forall nat_akZc (a_akZa :: nat_akZc) (b_akZb :: nat_akZc). SEq nat_akZc => Sing a_akZa -> Sing b_akZb -> Sing ((/=) a_akZa b_akZb)
+ Data.Type.Natural.Class.Arithmetic: (%<) :: forall nat_akRk (a_akRi :: nat_akRk) (b_akRj :: nat_akRk). SOrd nat_akRk => Sing a_akRi -> Sing b_akRj -> Sing ((<) a_akRi b_akRj)
+ Data.Type.Natural.Class.Arithmetic: (%<=) :: forall nat_akVK (a_akVI :: nat_akVK) (b_akVJ :: nat_akVK). SOrd nat_akVK => Sing a_akVI -> Sing b_akVJ -> Sing ((<=) a_akVI b_akVJ)
+ Data.Type.Natural.Class.Arithmetic: (%==) :: forall nat_al15 (a_al13 :: nat_al15) (b_al14 :: nat_al15). SEq nat_al15 => Sing a_al13 -> Sing b_al14 -> Sing ((==) a_al13 b_al14)
+ Data.Type.Natural.Class.Arithmetic: (%>) :: forall nat_akU1 (a_akTZ :: nat_akU1) (b_akU0 :: nat_akU1). SOrd nat_akU1 => Sing a_akTZ -> Sing b_akU0 -> Sing ((>) a_akTZ b_akU0)
+ Data.Type.Natural.Class.Arithmetic: (%>=) :: forall nat_akXt (a_akXr :: nat_akXt) (b_akXs :: nat_akXt). SOrd nat_akXt => Sing a_akXr -> Sing b_akXs -> Sing ((>=) a_akXr b_akXs)
+ Data.Type.Natural.Class.Arithmetic: fromNatural :: IsPeano nat => Natural -> SomeSing nat
+ Data.Type.Natural.Class.Arithmetic: infix 4 %==
+ Data.Type.Natural.Class.Arithmetic: infixl 6 %-
+ Data.Type.Natural.Class.Arithmetic: infixl 7 %*
+ Data.Type.Natural.Class.Arithmetic: toNatural :: IsPeano nat => Sing (n :: nat) -> Natural
+ Data.Type.Natural.Class.Arithmetic: type (*@#@$$$) a_al82 b_al83 = (:*$$$) a_al82 b_al83
+ Data.Type.Natural.Class.Arithmetic: type *@#@$ = (:*$)
+ Data.Type.Natural.Class.Arithmetic: type *@#@$$ = (:*$$)
+ Data.Type.Natural.Class.Arithmetic: type +@#@$ = (:+$)
+ Data.Type.Natural.Class.Arithmetic: type +@#@$$ = (:+$$)
+ Data.Type.Natural.Class.Arithmetic: type -@#@$ = (:-$)
+ Data.Type.Natural.Class.Arithmetic: type -@#@$$ = (:-$$)
+ Data.Type.Natural.Class.Arithmetic: type /=@#@$ = (:/=$)
+ Data.Type.Natural.Class.Arithmetic: type /=@#@$$ = (:/=$$)
+ Data.Type.Natural.Class.Arithmetic: type <=@#@$ = (:<=$)
+ Data.Type.Natural.Class.Arithmetic: type <=@#@$$ = (:<=$$)
+ Data.Type.Natural.Class.Arithmetic: type <@#@$ = (:<$)
+ Data.Type.Natural.Class.Arithmetic: type <@#@$$ = (:<$$)
+ Data.Type.Natural.Class.Arithmetic: type ==@#@$ = (:==$)
+ Data.Type.Natural.Class.Arithmetic: type ==@#@$$ = (:==$$)
+ Data.Type.Natural.Class.Arithmetic: type >=@#@$ = (:>=$)
+ Data.Type.Natural.Class.Arithmetic: type >=@#@$$ = (:>=$$)
+ Data.Type.Natural.Class.Arithmetic: type >@#@$ = (:>$)
+ Data.Type.Natural.Class.Arithmetic: type >@#@$$ = (:>$$)
+ Data.Type.Natural.Class.Order: (%*) :: forall nat_al84 (a_al82 :: nat_al84) (b_al83 :: nat_al84). SNum nat_al84 => Sing a_al82 -> Sing b_al83 -> Sing ((*) a_al82 b_al83)
+ Data.Type.Natural.Class.Order: (%+) :: forall nat_al45 (a_al43 :: nat_al45) (b_al44 :: nat_al45). SNum nat_al45 => Sing a_al43 -> Sing b_al44 -> Sing ((+) a_al43 b_al44)
+ Data.Type.Natural.Class.Order: (%-) :: forall nat_al6m (a_al6k :: nat_al6m) (b_al6l :: nat_al6m). SNum nat_al6m => Sing a_al6k -> Sing b_al6l -> Sing ((-) a_al6k b_al6l)
+ Data.Type.Natural.Class.Order: (%-.) :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (n -. m)
+ Data.Type.Natural.Class.Order: (%/=) :: forall nat_akZc (a_akZa :: nat_akZc) (b_akZb :: nat_akZc). SEq nat_akZc => Sing a_akZa -> Sing b_akZb -> Sing ((/=) a_akZa b_akZb)
+ Data.Type.Natural.Class.Order: (%<) :: forall nat_akRk (a_akRi :: nat_akRk) (b_akRj :: nat_akRk). SOrd nat_akRk => Sing a_akRi -> Sing b_akRj -> Sing ((<) a_akRi b_akRj)
+ Data.Type.Natural.Class.Order: (%<=) :: forall nat_akVK (a_akVI :: nat_akVK) (b_akVJ :: nat_akVK). SOrd nat_akVK => Sing a_akVI -> Sing b_akVJ -> Sing ((<=) a_akVI b_akVJ)
+ Data.Type.Natural.Class.Order: (%==) :: forall nat_al15 (a_al13 :: nat_al15) (b_al14 :: nat_al15). SEq nat_al15 => Sing a_al13 -> Sing b_al14 -> Sing ((==) a_al13 b_al14)
+ Data.Type.Natural.Class.Order: (%>) :: forall nat_akU1 (a_akTZ :: nat_akU1) (b_akU0 :: nat_akU1). SOrd nat_akU1 => Sing a_akTZ -> Sing b_akU0 -> Sing ((>) a_akTZ b_akU0)
+ Data.Type.Natural.Class.Order: (%>=) :: forall nat_akXt (a_akXr :: nat_akXt) (b_akXs :: nat_akXt). SOrd nat_akXt => Sing a_akXr -> Sing b_akXs -> Sing ((>=) a_akXr b_akXs)
+ Data.Type.Natural.Class.Order: infix 4 %==
+ Data.Type.Natural.Class.Order: infixl 6 %-
+ Data.Type.Natural.Class.Order: infixl 7 %*
+ Data.Type.Natural.Class.Order: type *@#@$ = (:*$)
+ Data.Type.Natural.Class.Order: type *@#@$$ = (:*$$)
+ Data.Type.Natural.Class.Order: type +@#@$ = (:+$)
+ Data.Type.Natural.Class.Order: type +@#@$$ = (:+$$)
+ Data.Type.Natural.Class.Order: type -@#@$ = (:-$)
+ Data.Type.Natural.Class.Order: type -@#@$$ = (:-$$)
+ Data.Type.Natural.Class.Order: type /=@#@$ = (:/=$)
+ Data.Type.Natural.Class.Order: type /=@#@$$ = (:/=$$)
+ Data.Type.Natural.Class.Order: type <=@#@$ = (:<=$)
+ Data.Type.Natural.Class.Order: type <=@#@$$ = (:<=$$)
+ Data.Type.Natural.Class.Order: type <@#@$ = (:<$)
+ Data.Type.Natural.Class.Order: type <@#@$$ = (:<$$)
+ Data.Type.Natural.Class.Order: type ==@#@$ = (:==$)
+ Data.Type.Natural.Class.Order: type ==@#@$$ = (:==$$)
+ Data.Type.Natural.Class.Order: type >=@#@$ = (:>=$)
+ Data.Type.Natural.Class.Order: type >=@#@$$ = (:>=$$)
+ Data.Type.Natural.Class.Order: type >@#@$ = (:>$)
+ Data.Type.Natural.Class.Order: type >@#@$$ = (:>$$)
+ Data.Type.Natural.Class.Order: type n -. m = Subt n m (m <= n)
+ Data.Type.Ordinal: instance (Data.Singletons.SingI m, Data.Singletons.SingI n, n ~ (m Data.Type.Natural.Singleton.Compat.+ 1)) => GHC.Enum.Bounded (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: instance (Data.Type.Natural.Class.Order.PeanoOrder nat, Data.Singletons.SingKind nat) => Data.Type.Ordinal.HasOrdinal nat
+ Data.Type.Ordinal: instance forall k (nat1 :: k) nat2 (n :: nat2). (Data.Singletons.SingI n, Data.Type.Ordinal.HasOrdinal nat2) => GHC.Show.Show (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: instance forall k (nat1 :: k) nat2 (n :: nat2). (Data.Type.Ordinal.HasOrdinal nat2, Data.Singletons.SingI n) => GHC.Enum.Enum (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: instance forall k (nat1 :: k) nat2 (n :: nat2). (Data.Type.Ordinal.HasOrdinal nat2, Data.Singletons.SingI n) => GHC.Num.Num (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: instance forall k (nat1 :: k) nat2 (n :: nat2). Data.Type.Ordinal.HasOrdinal nat2 => GHC.Classes.Eq (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: instance forall k (nat1 :: k) nat2 (n :: nat2). Data.Type.Ordinal.HasOrdinal nat2 => GHC.Classes.Ord (Data.Type.Ordinal.Ordinal n)
+ Data.Type.Ordinal: naturalToOrd :: forall nat n. (HasOrdinal nat, SingI n) => Natural -> Maybe (Ordinal (n :: nat))
+ Data.Type.Ordinal: naturalToOrd' :: HasOrdinal nat => Sing (n :: nat) -> Natural -> Maybe (Ordinal n)
+ Data.Type.Ordinal: ordToNatural :: HasOrdinal nat => Ordinal (n :: nat) -> Natural
+ Data.Type.Ordinal: reallyUnsafeNaturalToOrd :: forall pxy nat (n :: nat). (HasOrdinal nat, SingI n) => pxy nat -> Natural -> Ordinal n
+ Data.Type.Ordinal: unsafeFromInt' :: forall proxy (n :: nat). (HasOrdinal nat, SingI n) => proxy nat -> Int -> Ordinal n
+ Data.Type.Ordinal: unsafeNaturalToOrd :: forall (n :: nat). (HasOrdinal nat, SingI (n :: nat)) => Natural -> Ordinal n
+ Data.Type.Ordinal: unsafeNaturalToOrd' :: forall proxy (n :: nat). (HasOrdinal nat, SingI n) => proxy nat -> Natural -> Ordinal n
+ Data.Type.Ordinal.Builtin: naturalToOrd :: SingI (n :: Nat) => Natural -> Maybe (Ordinal n)
+ Data.Type.Ordinal.Builtin: naturalToOrd' :: Sing (n :: Nat) -> Natural -> Maybe (Ordinal n)
+ Data.Type.Ordinal.Builtin: ordToNatural :: Ordinal (n :: Nat) -> Natural
+ Data.Type.Ordinal.Builtin: unsafeNaturalToOrd :: SingI (n :: Nat) => Natural -> Ordinal n
+ Data.Type.Ordinal.Peano: naturalToOrd :: SingI (n :: Nat) => Natural -> Maybe (Ordinal n)
+ Data.Type.Ordinal.Peano: naturalToOrd' :: Sing (n :: Nat) -> Natural -> Maybe (Ordinal n)
+ Data.Type.Ordinal.Peano: ordToNatural :: Ordinal (n :: Nat) -> Natural
+ Data.Type.Ordinal.Peano: unsafeNaturalToOrd :: SingI (n :: Nat) => Natural -> Ordinal n
- Data.Type.Natural: (%*) :: SNat n -> SNat m -> SNat (n :*: m)
+ Data.Type.Natural: (%*) :: forall nat_al84 (a_al82 :: nat_al84) (b_al83 :: nat_al84). SNum nat_al84 => Sing a_al82 -> Sing b_al83 -> Sing ((*) a_al82 b_al83)
- Data.Type.Natural: (%**) :: SNat n -> SNat m -> SNat (n :**: m)
+ Data.Type.Natural: (%**) :: SNat n -> SNat m -> SNat (n ** m)
- Data.Type.Natural: (%+) :: SNat n -> SNat m -> SNat (n :+: m)
+ Data.Type.Natural: (%+) :: forall nat_al45 (a_al43 :: nat_al45) (b_al44 :: nat_al45). SNum nat_al45 => Sing a_al43 -> Sing b_al44 -> Sing ((+) a_al43 b_al44)
- Data.Type.Natural: (%-) :: (m :<= n) ~ True => SNat n -> SNat m -> SNat (n :-: m)
+ Data.Type.Natural: (%-) :: forall nat_al6m (a_al6k :: nat_al6m) (b_al6l :: nat_al6m). SNum nat_al6m => Sing a_al6k -> Sing b_al6l -> Sing ((-) a_al6k b_al6l)
- Data.Type.Natural: [SuccLeqSucc] :: Leq n m -> Leq (S n) (S m)
+ Data.Type.Natural: [SuccLeqSucc] :: Leq n m -> Leq ( 'S n) ( 'S m)
- Data.Type.Natural: boolToClassLeq :: (n :<= m) ~ True => SNat n -> SNat m -> LeqInstance n m
+ Data.Type.Natural: boolToClassLeq :: (n <= m) ~ 'True => SNat n -> SNat m -> LeqInstance n m
- Data.Type.Natural: boolToPropLeq :: (n :<= m) ~ True => SNat n -> SNat m -> Leq n m
+ Data.Type.Natural: boolToPropLeq :: (n <= m) ~ 'True => SNat n -> SNat m -> Leq n m
- Data.Type.Natural: class (SDecide nat, SNum nat, SEnum nat) => IsPeano nat where succInj' _ _ = succInj plusMinus' n m = start (n %:+ m %:- n) === m %:+ n %:- n `because` minusCongL (plusComm n m) n === m `because` plusMinus m n plusZeroL sn = idLProof (induction base step sn) where base :: PlusZeroL (Zero nat) base = IdentityL (plusZeroR sZero) step :: Sing (n :: nat) -> PlusZeroL n -> PlusZeroL (S n) step sk (IdentityL ih) = IdentityL $ start (sZero %:+ sS sk) === sS (sZero %:+ sk) `because` plusSuccR sZero sk === sS sk `because` succCong ih plusSuccL sn0 sm0 = plusSuccLProof (induction base step sm0) sn0 where base :: PlusSuccL (Zero nat) base = PlusSuccL $ \ sn -> start (sS sn %:+ sZero) === sS sn `because` plusZeroR (sS sn) === sS (sn %:+ sZero) `because` succCong (sym $ plusZeroR sn) step :: Sing (n :: nat) -> PlusSuccL n -> PlusSuccL (S n) step sm (PlusSuccL ih) = PlusSuccL $ \ sn -> start (sS sn %:+ sS sm) === sS (sS sn %:+ sm) `because` plusSuccR (sS sn) sm === sS (sS (sn %:+ sm)) `because` succCong (ih sn) === sS (sn %:+ sS sm) `because` succCong (sym $ plusSuccR sn sm) plusZeroR sn = idRProof (induction base step sn) where base :: PlusZeroR (Zero nat) base = IdentityR (plusZeroL sZero) step :: Sing (n :: nat) -> PlusZeroR n -> PlusZeroR (S n) step sk (IdentityR ih) = IdentityR $ start (sS sk %:+ sZero) === sS (sk %:+ sZero) `because` plusSuccL sk sZero === sS sk `because` succCong ih plusSuccR sn0 = plusSuccRProof (induction base step sn0) where base :: PlusSuccR (Zero nat) base = PlusSuccR $ \ sk -> start (sZero %:+ sS sk) === sS sk `because` plusZeroL (sS sk) === sS (sZero %:+ sk) `because` succCong (sym $ plusZeroL sk) step :: Sing (n :: nat) -> PlusSuccR n -> PlusSuccR (S n) step sn (PlusSuccR ih) = PlusSuccR $ \ sk -> start (sS sn %:+ sS sk) === sS (sn %:+ sS sk) `because` plusSuccL sn (sS sk) === sS (sS (sn %:+ sk)) `because` succCong (ih sk) === sS (sS sn %:+ sk) `because` succCong (sym $ plusSuccL sn sk) plusComm sn0 = commProof (induction base step sn0) where base :: PlusComm (Zero nat) base = Comm $ \ sk -> start (sZero %:+ sk) === sk `because` plusZeroL sk === (sk %:+ sZero) `because` sym (plusZeroR sk) step :: Sing (n :: nat) -> PlusComm n -> PlusComm (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:+ sk) === sS (sn %:+ sk) `because` plusSuccL sn sk === sS (sk %:+ sn) `because` succCong (ih sk) === sk %:+ sS sn `because` sym (plusSuccR sk sn) plusAssoc sn m l = assocProof (induction base step sn) m l where base :: Assoc (:+$$) (Zero nat) base = Assoc $ \ sk sl -> start ((sZero %:+ sk) %:+ sl) === sk %:+ sl `because` plusCongL (plusZeroL sk) sl === (sZero %:+ (sk %:+ sl)) `because` sym (plusZeroL (sk %:+ sl)) step :: forall k. Sing (k :: nat) -> Assoc (:+$$) k -> Assoc (:+$$) (S k) step sk (Assoc ih) = Assoc $ \ sl su -> start ((sS sk %:+ sl) %:+ su) === (sS (sk %:+ sl) %:+ su) `because` plusCongL (plusSuccL sk sl) su === sS (sk %:+ sl %:+ su) `because` plusSuccL (sk %:+ sl) su === sS (sk %:+ (sl %:+ su)) `because` succCong (ih sl su) === sS sk %:+ (sl %:+ su) `because` sym (plusSuccL sk (sl %:+ su)) multZeroL sn0 = multZeroLProof $ induction base step sn0 where base :: MultZeroL (Zero nat) base = MultZeroL (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroL k -> MultZeroL (S k) step sk (MultZeroL ih) = MultZeroL $ start (sZero %:* sS sk) === sZero %:* sk %:+ sZero `because` multSuccR sZero sk === sZero %:* sk `because` plusZeroR (sZero %:* sk) === sZero `because` ih multSuccL sn0 sm0 = multSuccLProof (induction base step sm0) sn0 where base :: MultSuccL (Zero nat) base = MultSuccL $ \ sk -> start (sS sk %:* sZero) === sZero `because` multZeroR (sS sk) === sk %:* sZero `because` sym (multZeroR sk) === sk %:* sZero %:+ sZero `because` sym (plusZeroR (sk %:* sZero)) step :: Sing (m :: nat) -> MultSuccL m -> MultSuccL (S m) step sm (MultSuccL ih) = MultSuccL $ \ sk -> start (sS sk %:* sS sm) === sS sk %:* sm %:+ sS sk `because` multSuccR (sS sk) sm === (sk %:* sm %:+ sm) %:+ sS sk `because` plusCongL (ih sk) (sS sk) === sS ((sk %:* sm %:+ sm) %:+ sk) `because` plusSuccR (sk %:* sm %:+ sm) sk === sS (sk %:* sm %:+ (sm %:+ sk)) `because` succCong (plusAssoc (sk %:* sm) sm sk) === sS (sk %:* sm %:+ (sk %:+ sm)) `because` succCong (plusCongR (sk %:* sm) (plusComm sm sk)) === sS ((sk %:* sm %:+ sk) %:+ sm) `because` succCong (sym $ plusAssoc (sk %:* sm) sk sm) === sS ((sk %:* sS sm) %:+ sm) `because` succCong (plusCongL (sym $ multSuccR sk sm) sm) === sk %:* sS sm %:+ sS sm `because` sym (plusSuccR (sk %:* sS sm) sm) multZeroR sn0 = multZeroRProof $ induction base step sn0 where base :: MultZeroR (Zero nat) base = MultZeroR (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroR k -> MultZeroR (S k) step sk (MultZeroR ih) = MultZeroR $ start (sS sk %:* sZero) === sk %:* sZero %:+ sZero `because` multSuccL sk sZero === sk %:* sZero `because` plusZeroR (sk %:* sZero) === sZero `because` ih multSuccR sn0 = multSuccRProof $ induction base step sn0 where base :: MultSuccR (Zero nat) base = MultSuccR $ \ sk -> start (sZero %:* sS sk) === sZero `because` multZeroL (sS sk) === sZero %:* sk `because` sym (multZeroL sk) === sZero %:* sk %:+ sZero `because` sym (plusZeroR (sZero %:* sk)) step :: Sing (n :: nat) -> MultSuccR n -> MultSuccR (S n) step sn (MultSuccR ih) = MultSuccR $ \ sk -> start (sS sn %:* sS sk) === sn %:* sS sk %:+ sS sk `because` multSuccL sn (sS sk) === sS (sn %:* sS sk %:+ sk) `because` plusSuccR (sn %:* sS sk) sk === sS (sn %:* sk %:+ sn %:+ sk) `because` succCong (plusCongL (ih sk) sk) === sS (sn %:* sk %:+ (sn %:+ sk)) `because` succCong (plusAssoc (sn %:* sk) sn sk) === sS (sn %:* sk %:+ (sk %:+ sn)) `because` succCong (plusCongR (sn %:* sk) (plusComm sn sk)) === sS (sn %:* sk %:+ sk %:+ sn) `because` succCong (sym $ plusAssoc (sn %:* sk) sk sn) === sS (sS sn %:* sk %:+ sn) `because` succCong (plusCongL (sym $ multSuccL sn sk) sn) === sS sn %:* sk %:+ sS sn `because` sym (plusSuccR (sS sn %:* sk) sn) multComm sn0 = commProof (induction base step sn0) where base :: Comm (:*$$) (Zero nat) base = Comm $ \ sk -> start (sZero %:* sk) === sZero `because` multZeroL sk === sk %:* sZero `because` sym (multZeroR sk) step :: Sing (n :: nat) -> Comm (:*$$) n -> Comm (:*$$) (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:* sk) === sn %:* sk %:+ sk `because` multSuccL sn sk === sk %:* sn %:+ sk `because` plusCongL (ih sk) sk === sk %:* sS sn `because` sym (multSuccR sk sn) multOneR sn = start (sn %:* sOne) === sn %:* sS sZero `because` multCongR sn (sym $ succOneCong) === sn %:* sZero %:+ sn `because` multSuccR sn sZero === sZero %:+ sn `because` plusCongL (multZeroR sn) sn === sn `because` plusZeroL sn multOneL sn = start (sOne %:* sn) === sn %:* sOne `because` multComm sOne sn === sn `because` multOneR sn plusMultDistrib sn0 = plusMultDistribProof $ induction base step sn0 where base :: PlusMultDistrib (Zero nat) base = PlusMultDistrib $ \ sk sl -> start ((sZero %:+ sk) %:* sl) === (sk %:* sl) `because` multCongL (plusZeroL sk) sl === sZero %:+ (sk %:* sl) `because` sym (plusZeroL (sk %:* sl)) === sZero %:* sl %:+ sk %:* sl `because` plusCongL (sym $ multZeroL sl) (sk %:* sl) step :: Sing (n :: nat) -> PlusMultDistrib n -> PlusMultDistrib (S n) step sn (PlusMultDistrib ih) = PlusMultDistrib $ \ sk sl -> start ((sS sn %:+ sk) %:* sl) === (sS (sn %:+ sk) %:* sl) `because` multCongL (plusSuccL sn sk) sl === (sn %:+ sk) %:* sl %:+ sl `because` multSuccL (sn %:+ sk) sl === (sn %:* sl %:+ sk %:* sl) %:+ sl `because` plusCongL (ih sk sl) sl === sn %:* sl %:+ (sk %:* sl %:+ sl) `because` plusAssoc (sn %:* sl) (sk %:* sl) sl === sn %:* sl %:+ (sl %:+ sk %:* sl) `because` plusCongR (sn %:* sl) (plusComm (sk %:* sl) sl) === (sn %:* sl %:+ sl) %:+ sk %:* sl `because` sym (plusAssoc (sn %:* sl) sl (sk %:* sl)) === (sS sn %:* sl) %:+ sk %:* sl `because` plusCongL (sym $ multSuccL sn sl) (sk %:* sl) multPlusDistrib n m l = start (n %:* (m %:+ l)) === (m %:+ l) %:* n `because` multComm n (m %:+ l) === m %:* n %:+ l %:* n `because` plusMultDistrib m l n === n %:* m %:+ n %:* l `because` plusCong (multComm m n) (multComm l n) minusNilpotent n = start (n %:- n) === (sZero %:+ n) %:- n `because` minusCongL (sym $ plusZeroL n) n === sZero `because` plusMinus sZero n multAssoc sn0 = assocProof $ induction base step sn0 where base :: Assoc (:*$$) (Zero nat) base = Assoc $ \ m l -> start (sZero %:* m %:* l) === sZero %:* l `because` multCongL (multZeroL m) l === sZero `because` multZeroL l === sZero %:* (m %:* l) `because` sym (multZeroL (m %:* l)) step :: Sing (n :: nat) -> Assoc (:*$$) n -> Assoc (:*$$) (S n) step n _ = Assoc $ \ m l -> start (sS n %:* m %:* l) === (n %:* m %:+ m) %:* l `because` multCongL (multSuccL n m) l === n %:* m %:* l %:+ m %:* l `because` plusMultDistrib (n %:* m) m l === n %:* (m %:* l) %:+ m %:* l `because` plusCongL (multAssoc n m l) (m %:* l) === sS n %:* (m %:* l) `because` sym (multSuccL n (m %:* l)) plusEqCancelL = plusEqCancelLProof . induction base step where base :: PlusEqCancelL (Zero nat) base = PlusEqCancelL $ \ l m nlnm -> start l === sZero %:+ l `because` sym (plusZeroL l) === sZero %:+ m `because` nlnm === m `because` plusZeroL m step :: Sing (n :: nat) -> PlusEqCancelL n -> PlusEqCancelL (Succ n) step n (PlusEqCancelL ih) = PlusEqCancelL $ \ l m snlsnm -> succInj $ ih (sS l) (sS m) $ start (n %:+ sS l) === sS (n %:+ l) `because` plusSuccR n l === sS n %:+ l `because` sym (plusSuccL n l) === sS n %:+ m `because` snlsnm === sS (n %:+ m) `because` plusSuccL n m === n %:+ sS m `because` sym (plusSuccR n m) plusEqCancelR n m l nlml = plusEqCancelL l n m $ start (l %:+ n) === (n %:+ l) `because` plusComm l n === (m %:+ l) `because` nlml === (l %:+ m) `because` plusComm m l succAndPlusOneL = proofSuccPlusL . induction base step where base :: SuccPlusL (Zero nat) base = SuccPlusL $ start (sSucc sZero) === sOne `because` succOneCong === sOne %:+ sZero `because` sym (plusZeroR sOne) step :: Sing (n :: nat) -> SuccPlusL n -> SuccPlusL (Succ n) step sn (SuccPlusL ih) = SuccPlusL $ start (sSucc (sSucc sn)) === sSucc (sOne %:+ sn) `because` succCong ih === sOne %:+ sSucc sn `because` sym (plusSuccR sOne sn) succAndPlusOneR n = start (sSucc n) === sOne %:+ n `because` succAndPlusOneL n === n %:+ sOne `because` plusComm sOne n zeroOrSucc = induction base step where base = IsZero step sn _ = IsSucc sn plusEqZeroL n m Refl = case zeroOrSucc n of { IsZero -> Refl IsSucc pn -> absurd $ succNonCyclic (pn %:+ m) (sym $ plusSuccL pn m) } plusEqZeroR n m = plusEqZeroL m n . trans (plusComm m n) predUnique n m snEm = start n === (sPred (sSucc n)) `because` sym (predSucc n) === sPred m `because` predCong snEm multEqSuccElimL n m l nmEsl = case zeroOrSucc n of { IsZero -> absurd $ succNonCyclic l $ sym $ start sZero === sZero %:* m `because` sym (multZeroL m) === sSucc l `because` nmEsl IsSucc pn -> succCong (predUnique pn n Refl) } multEqSuccElimR n m l nmEsl = multEqSuccElimL m n l (multComm m n `trans` nmEsl) minusZero n = start (n %:- sZero) === (n %:+ sZero) %:- sZero `because` minusCongL (sym $ plusZeroR n) sZero === n `because` plusMinus n sZero multEqCancelR = proofMultEqCancelR . induction base step where base :: MultEqCancelR (Zero nat) base = MultEqCancelR $ \ m l zslmsl -> sym $ plusEqZeroR (m %:* l) m $ sym $ start sZero === sZero %:* l `because` sym (multZeroL l) === sZero %:* l %:+ sZero `because` sym (plusZeroR (sZero %:* l)) === sZero %:* sSucc l `because` sym (multSuccR sZero l) === m %:* sSucc l `because` zslmsl === m %:* l %:+ m `because` multSuccR m l step :: Sing (n :: nat) -> MultEqCancelR n -> MultEqCancelR (Succ n) step n (MultEqCancelR ih) = MultEqCancelR $ \ m l snmssnl -> let m' = sPred m pf = start (m %:* sSucc l) === sSucc n %:* sSucc l `because` sym snmssnl === n %:* sSucc l %:+ sSucc l `because` multSuccL n (sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l sm'Em = multEqSuccElimL m (sSucc l) (n %:* sSucc l %:+ l) pf pf' = ih m' l $ plusEqCancelR (n %:* sSucc l) (m' %:* sSucc l) (sSucc l) $ start (n %:* sSucc l %:+ sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l === m %:* sSucc l `because` sym pf === sSucc m' %:* sSucc l `because` multCongL sm'Em (sSucc l) === (m' %:* sSucc l %:+ sSucc l) `because` multSuccL m' (sSucc l) in succCong pf' `trans` sym sm'Em succPred n nonZero = case zeroOrSucc n of { IsZero -> absurd $ nonZero Refl IsSucc n' -> sym $ succCong $ predUnique n' n Refl } multEqCancelL n m l snmEsnl = multEqCancelR m l n $ multComm m (sSucc n) `trans` snmEsnl `trans` multComm (sSucc n) l sPred' pxy sn = coerce (succInj $ succCong $ predSucc (sPred' pxy sn)) (sPred sn)
+ Data.Type.Natural: class (SDecide nat, SNum nat, SEnum nat, SingKind nat, SingKind nat) => IsPeano nat
- Data.Type.Natural: class (SOrd nat, IsPeano nat) => PeanoOrder nat where ltToNeq a b aLTb aEQb = eliminate $ start SLT === sCompare a b `because` sym aLTb === SEQ `because` eqlCmpEQ a b aEQb leqNeqToLT a b aLEQb aNEQb = either (absurd . aNEQb) id $ leqToCmp a b aLEQb succLeqToLT a b saLEQb = case leqWitness (sSucc a) b saLEQb of { DiffNat _ k -> let aLEQb = leqStep a b (sSucc k) $ start (a %:+ sSucc k) === sSucc (a %:+ k) `because` plusSuccR a k === sSucc a %:+ k `because` sym (plusSuccL a k) =~= b aNEQb aeqb = succNonCyclic k $ plusEqCancelL a (sSucc k) sZero $ start (a %:+ sSucc k) === sSucc (a %:+ k) `because` plusSuccR a k === (sSucc a) %:+ k `because` sym (plusSuccL a k) =~= b === a `because` sym aeqb === a %:+ sZero `because` sym (plusZeroR a) in leqNeqToLT a b aLEQb aNEQb } gtToLeq n m nGTm = ltToLeq m n $ start (sCompare m n) === sFlipOrdering (sCompare n m) `because` sym (flipCompare n m) === sFlipOrdering SGT `because` congFlipOrdering nGTm =~= SLT ltToSuccLeq n m nLTm = leqNeqToSuccLeq n m (ltToLeq n m nLTm) (ltToNeq n m nLTm) cmpZero sn = leqToLT sZero (sSucc sn) $ leqStep (sSucc sZero) (sSucc sn) sn $ start (sSucc sZero %:+ sn) === sSucc (sZero %:+ sn) `because` plusSuccL sZero sn === sSucc sn `because` succCong (plusZeroL sn) leqToGT a b sbLEQa = start (sCompare a b) === sFlipOrdering (sCompare b a) `because` sym (flipCompare b a) === sFlipOrdering SLT `because` congFlipOrdering (leqToLT b a sbLEQa) =~= SGT cmpZero' n = case zeroOrSucc n of { IsZero -> Left $ eqlCmpEQ sZero n Refl IsSucc n' -> Right $ cmpZero n' } zeroNoLT n eql = case cmpZero' n of { Left cmp0nEQ -> eliminate $ start SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare n sZero) `because` congFlipOrdering (sym eql) === sCompare sZero n `because` flipCompare n sZero === SEQ `because` cmp0nEQ Right cmp0nLT -> eliminate $ start SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare n sZero) `because` congFlipOrdering (sym eql) === sCompare sZero n `because` flipCompare n sZero === SLT `because` cmp0nLT } ltRightPredSucc a b aLTb = case zeroOrSucc b of { IsZero -> absurd $ zeroNoLT a aLTb IsSucc b' -> sym $ start (sSucc (sPred b)) =~= sSucc (sPred (sSucc b')) === sSucc b' `because` succCong (predSucc b') =~= b } cmpSucc n m = case sCompare n m of { SEQ -> let nEQm = eqToRefl n m Refl in sym $ eqlCmpEQ (sSucc n) (sSucc m) $ succCong nEQm SLT -> case leqWitness (sSucc n) m $ ltToSuccLeq n m Refl of { DiffNat _ k -> sym $ succLeqToLT (sSucc n) (sSucc m) $ leqStep (sSucc (sSucc n)) (sSucc m) k $ start (sSucc (sSucc n) %:+ k) === sSucc (sSucc n %:+ k) `because` plusSuccL (sSucc n) k =~= sSucc m } SGT -> case leqWitness (sSucc m) n $ ltToSuccLeq m n (sym $ flipCompare n m) of { DiffNat _ k -> let pf = (succLeqToLT (sSucc m) (sSucc n) $ leqStep (sSucc (sSucc m)) (sSucc n) k $ start (sSucc (sSucc m) %:+ k) === sSucc (sSucc m %:+ k) `because` plusSuccL (sSucc m) k =~= sSucc n) in start (sCompare n m) =~= SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare (sSucc m) (sSucc n)) `because` congFlipOrdering (sym pf) === sCompare (sSucc n) (sSucc m) `because` flipCompare (sSucc m) (sSucc n) } } ltSucc = proofLTSucc . induction base step where base :: LTSucc (Zero nat) base = LTSucc $ cmpZero (sZero :: Sing (Zero nat)) step :: Sing (n :: nat) -> LTSucc n -> LTSucc (Succ n) step n (LTSucc ih) = LTSucc $ start (sCompare (sSucc n) (sSucc (sSucc n))) === sCompare n (sSucc n) `because` sym (cmpSucc n (sSucc n)) === SLT `because` ih cmpSuccStepR = proofCmpSuccStepR . induction base step where base :: CmpSuccStepR (Zero nat) base = CmpSuccStepR $ \ m _ -> cmpZero m step :: Sing (n :: nat) -> CmpSuccStepR n -> CmpSuccStepR (Succ n) step n (CmpSuccStepR ih) = CmpSuccStepR $ \ m snltm -> case zeroOrSucc m of { IsZero -> absurd $ zeroNoLT (sSucc n) snltm IsSucc m' -> let nLTm' = trans (cmpSucc n m') snltm in start (sCompare (sSucc n) (sSucc m)) =~= sCompare (sSucc n) (sSucc (sSucc m')) === sCompare n (sSucc m') `because` sym (cmpSucc n (sSucc m')) === SLT `because` ih m' nLTm' } ltSuccLToLT n m snLTm = case zeroOrSucc m of { IsZero -> absurd $ zeroNoLT (sSucc n) snLTm IsSucc m' -> let nLTm = cmpSucc n m' `trans` snLTm in start (sCompare n (sSucc m')) === SLT `because` cmpSuccStepR n m' nLTm } leqToLT n m snLEQm = case leqToCmp (sSucc n) m snLEQm of { Left eql -> withRefl eql $ start (sCompare n m) =~= sCompare n (sSucc n) === SLT `because` ltSucc n Right nLTm -> ltSuccLToLT n m nLTm } leqZero sn = case zeroOrSucc sn of { IsZero -> leqRefl sn IsSucc pn -> ltToLeq sZero sn $ cmpZero pn } leqSucc n m nLEQm = case leqToCmp n m nLEQm of { Left eql -> withRefl eql $ leqRefl (sSucc n) Right nLTm -> ltToLeq (sSucc n) (sSucc m) $ sym (cmpSucc n m) `trans` nLTm } fromLeqView (LeqZero n) = leqZero n fromLeqView (LeqSucc n m nLEQm) = leqSucc n m nLEQm leqViewRefl = proofLeqViewRefl . induction base step where base :: LeqViewRefl (Zero nat) base = LeqViewRefl $ LeqZero sZero step :: Sing (n :: nat) -> LeqViewRefl n -> LeqViewRefl (Succ n) step n (LeqViewRefl nLEQn) = LeqViewRefl $ LeqSucc n n (fromLeqView nLEQn) viewLeq n m nLEQm = case (zeroOrSucc n, leqToCmp n m nLEQm) of { (IsZero, _) -> LeqZero m (_, Left Refl) -> leqViewRefl n (IsSucc n', Right nLTm) -> let sm'EQm = ltRightPredSucc n m nLTm m' = sPred m n'LTm' = cmpSucc n' m' `trans` compareCongR n (sym sm'EQm) `trans` nLTm in coerce (sym sm'EQm) $ LeqSucc n' m' $ ltToLeq n' m' n'LTm' } leqWitness = leqWitPf . induction base step where base :: LeqWitPf (Zero nat) base = LeqWitPf $ \ sm _ -> coerce (plusZeroL sm) $ DiffNat sZero sm step :: Sing (n :: nat) -> LeqWitPf n -> LeqWitPf (Succ n) step (n :: Sing n) (LeqWitPf ih) = LeqWitPf $ \ m snLEQm -> case viewLeq (sSucc n) m snLEQm of { LeqZero _ -> absurd $ succNonCyclic n Refl LeqSucc (_ :: Sing n') pm nLEQpm -> succDiffNat n pm $ ih pm $ coerceLeqL (succInj Refl :: n' :~: n) pm nLEQpm } leqStep = leqStepPf . induction base step where base :: LeqStepPf (Zero nat) base = LeqStepPf $ \ k _ _ -> leqZero k step :: Sing (n :: nat) -> LeqStepPf n -> LeqStepPf (Succ n) step n (LeqStepPf ih) = LeqStepPf $ \ k l snPlEqk -> let kEQspk = start k === sSucc n %:+ l `because` sym snPlEqk === sSucc (n %:+ l) `because` plusSuccL n l pk = n %:+ l in coerceLeqR (sSucc n) (sym kEQspk) $ leqSucc n pk $ ih pk l Refl leqNeqToSuccLeq n m nLEQm nNEQm = case leqWitness n m nLEQm of { DiffNat _ k -> case zeroOrSucc k of { IsZero -> absurd $ nNEQm $ sym $ plusZeroR n IsSucc k' -> leqStep (sSucc n) m k' $ start (sSucc n %:+ k') === sSucc (n %:+ k') `because` plusSuccL n k' === n %:+ sSucc k' `because` sym (plusSuccR n k') =~= m } } leqRefl sn = leqStep sn sn sZero (plusZeroR sn) leqSuccStepR n m nLEQm = case leqWitness n m nLEQm of { DiffNat _ k -> leqStep n (sSucc m) (sSucc k) $ start (n %:+ sSucc k) === sSucc (n %:+ k) `because` plusSuccR n k =~= sSucc m } leqSuccStepL n m snLEQm = leqTrans n (sSucc n) m (leqSuccStepR n n $ leqRefl n) snLEQm leqReflexive n _ Refl = leqRefl n leqTrans n m k nLEm mLEk = case leqWitness n m nLEm of { DiffNat _ mMn -> case leqWitness m k mLEk of { DiffNat _ kMn -> leqStep n k (mMn %:+ kMn) (sym $ plusAssoc n mMn kMn) } } leqAntisymm n m nLEm mLEn = case (leqWitness n m nLEm, leqWitness m n mLEn) of { (DiffNat _ mMn, DiffNat _ nMm) -> let pEQ0 = plusEqCancelL n (mMn %:+ nMm) sZero $ start (n %:+ (mMn %:+ nMm)) === (n %:+ mMn) %:+ nMm `because` sym (plusAssoc n mMn nMm) =~= m %:+ nMm =~= n === n %:+ sZero `because` sym (plusZeroR n) nMmEQ0 = plusEqZeroL mMn nMm pEQ0 in sym $ start m =~= n %:+ mMn === n %:+ sZero `because` plusCongR n nMmEQ0 === n `because` plusZeroR n } plusMonotone n m l k nLEm lLEk = case (leqWitness n m nLEm, leqWitness l k lLEk) of { (DiffNat _ mMINn, DiffNat _ kMINl) -> let r = mMINn %:+ kMINl in leqStep (n %:+ l) (m %:+ k) r $ start (n %:+ l %:+ r) === n %:+ (l %:+ r) `because` plusAssoc n l r =~= n %:+ (l %:+ (mMINn %:+ kMINl)) === n %:+ (l %:+ (kMINl %:+ mMINn)) `because` plusCongR n (plusCongR l (plusComm mMINn kMINl)) === n %:+ ((l %:+ kMINl) %:+ mMINn) `because` plusCongR n (sym $ plusAssoc l kMINl mMINn) =~= n %:+ (k %:+ mMINn) === n %:+ (mMINn %:+ k) `because` plusCongR n (plusComm k mMINn) === n %:+ mMINn %:+ k `because` sym (plusAssoc n mMINn k) =~= m %:+ k } leqZeroElim n nLE0 = case viewLeq n sZero nLE0 of { LeqZero _ -> Refl LeqSucc _ pZ _ -> absurd $ succNonCyclic pZ Refl } plusMonotoneL n m l leq = plusMonotone n m l l leq (leqRefl l) plusMonotoneR n m l leq = plusMonotone n n m l (leqRefl n) leq plusLeqL n m = leqStep n (n %:+ m) m Refl plusLeqR n m = leqStep m (n %:+ m) n $ plusComm m n plusCancelLeqR n m l nlLEQml = case leqWitness (n %:+ l) (m %:+ l) nlLEQml of { DiffNat _ k -> let pf = plusEqCancelR (n %:+ k) m l $ start ((n %:+ k) %:+ l) === n %:+ (k %:+ l) `because` plusAssoc n k l === n %:+ (l %:+ k) `because` plusCongR n (plusComm k l) === n %:+ l %:+ k `because` sym (plusAssoc n l k) =~= m %:+ l in leqStep n m k pf } plusCancelLeqL n m l nmLEQnl = plusCancelLeqR m l n $ coerceLeqL (plusComm n m) (l %:+ n) $ coerceLeqR (n %:+ m) (plusComm n l) nmLEQnl succLeqZeroAbsurd n leq = succNonCyclic n (leqZeroElim (sSucc n) leq) succLeqZeroAbsurd' n = case sSucc n %:<= sZero of { STrue -> absurd $ succLeqZeroAbsurd n Witness SFalse -> Refl } succLeqAbsurd n snLEQn = eliminate $ start SLT === sCompare n n `because` sym (succLeqToLT n n snLEQn) === SEQ `because` eqlCmpEQ n n Refl succLeqAbsurd' n = case sSucc n %:<= n of { STrue -> absurd $ succLeqAbsurd n Witness SFalse -> Refl } notLeqToLeq n m = case sCompare n m of { SLT -> eliminate $ ltToLeq n m Refl SEQ -> eliminate $ leqReflexive n m $ eqToRefl n m Refl SGT -> gtToLeq n m Refl } leqSucc' n m = case n %:<= m of { STrue -> withWitness (leqSucc n m Witness) Refl SFalse -> case sSucc n %:<= sSucc m of { SFalse -> Refl STrue -> case viewLeq (sSucc n) (sSucc m) Witness of { LeqZero _ -> absurd $ succNonCyclic n Refl LeqSucc n' m' Witness -> eliminate $ start STrue =~= (n' %:<= m') === (n %:<= m) `because` sLeqCong (succInj' n' n Refl) (succInj' m' m Refl) =~= SFalse } } } leqToMin n m nLEQm = leqAntisymm (sMin n m) n (minLeqL n m) (minLargest n n m (leqRefl n) nLEQm) geqToMin n m mLEQn = leqAntisymm (sMin n m) m (minLeqR n m) (minLargest m n m mLEQn (leqRefl m)) minComm n m = case n %:<= m of { STrue -> start (sMin n m) === n `because` leqToMin n m Witness === sMin m n `because` sym (geqToMin m n Witness) SFalse -> start (sMin n m) === m `because` geqToMin n m (notLeqToLeq n m) === sMin m n `because` sym (leqToMin m n $ notLeqToLeq n m) } minLeqL n m = case n %:<= m of { STrue -> leqReflexive (sMin n m) n $ leqToMin n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans (sMin n m) m n (leqReflexive (sMin n m) m (geqToMin n m mLEQn)) $ mLEQn } minLeqR n m = leqTrans (sMin n m) (sMin m n) m (leqReflexive (sMin n m) (sMin m n) $ minComm n m) (minLeqL m n) minLargest l n m lLEQn lLEQm = withSingI l $ withSingI n $ withSingI m $ withSingI (sMin n m) $ case n %:<= m of { STrue -> leqTrans l n (sMin n m) lLEQn $ leqReflexive sing sing $ sym $ leqToMin n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans l m (sMin n m) lLEQm $ leqReflexive sing sing $ sym $ geqToMin n m mLEQn } leqToMax n m nLEQm = leqAntisymm (sMax n m) m (maxLeast m n m nLEQm (leqRefl m)) (maxLeqR n m) geqToMax n m mLEQn = leqAntisymm (sMax n m) n (maxLeast n n m (leqRefl n) mLEQn) (maxLeqL n m) maxComm n m = case n %:<= m of { STrue -> start (sMax n m) === m `because` leqToMax n m Witness === sMax m n `because` sym (geqToMax m n Witness) SFalse -> start (sMax n m) === n `because` geqToMax n m (notLeqToLeq n m) === sMax m n `because` sym (leqToMax m n $ notLeqToLeq n m) } maxLeqR n m = case n %:<= m of { STrue -> leqReflexive m (sMax n m) $ sym $ leqToMax n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans m n (sMax n m) mLEQn (leqReflexive n (sMax n m) (sym $ geqToMax n m mLEQn)) } maxLeqL n m = leqTrans n (sMax m n) (sMax n m) (maxLeqR m n) (leqReflexive (sMax m n) (sMax n m) $ maxComm m n) maxLeast l n m lLEQn lLEQm = withSingI l $ withSingI n $ withSingI m $ withSingI (sMax n m) $ case n %:<= m of { STrue -> leqTrans (sMax n m) m l (leqReflexive sing sing $ leqToMax n m Witness) lLEQm SFalse -> let mLEQn = notLeqToLeq n m in leqTrans (sMax n m) n l (leqReflexive sing sing $ geqToMax n m mLEQn) lLEQn } lneqToLT n m nLNEm = succLeqToLT n m $ coerce (lneqSuccLeq n m) nLNEm ltToLneq n m nLTm = coerce (sym $ lneqSuccLeq n m) $ ltToSuccLeq n m nLTm lneqZero n = ltToLneq sZero (sSucc n) $ cmpZero n lneqSucc n = ltToLneq n (sSucc n) $ ltSucc n succLneqSucc n m = start (n %:< m) === (sSucc n %:<= m) `because` lneqSuccLeq n m === (sSucc (sSucc n) %:<= sSucc m) `because` leqSucc' (sSucc n) m === (sSucc n %:< sSucc m) `because` sym (lneqSuccLeq (sSucc n) (sSucc m)) lneqRightPredSucc n m nLNEQm = ltRightPredSucc n m $ lneqToLT n m nLNEQm lneqSuccStepL n m snLNEQm = coerce (sym $ lneqSuccLeq n m) $ leqSuccStepL (sSucc n) m $ coerce (lneqSuccLeq (sSucc n) m) snLNEQm lneqSuccStepR n m nLNEQm = coerce (sym $ lneqSuccLeq n (sSucc m)) $ leqSuccStepR (sSucc n) m $ coerce (lneqSuccLeq n m) nLNEQm plusStrictMonotone n m l k nLNm lLNk = coerce (sym $ lneqSuccLeq (n %:+ l) (m %:+ k)) $ flip coerceLeqL (m %:+ k) (plusSuccL n l) $ plusMonotone (sSucc n) m l k (coerce (lneqSuccLeq n m) nLNm) (leqTrans l (sSucc l) k (leqSuccStepR l l (leqRefl l)) $ coerce (lneqSuccLeq l k) lLNk) maxZeroL n = leqToMax sZero n (leqZero n) maxZeroR n = geqToMax n sZero (leqZero n) minZeroL n = leqToMin sZero n (leqZero n) minZeroR n = geqToMin n sZero (leqZero n) minusSucc n m mLEQn = case leqWitness m n mLEQn of { DiffNat _ k -> start (sSucc n %:- m) =~= sSucc (m %:+ k) %:- m === (m %:+ sSucc k) %:- m `because` minusCongL (sym $ plusSuccR m k) m === (sSucc k %:+ m) %:- m `because` minusCongL (plusComm m (sSucc k)) m === sSucc k `because` plusMinus (sSucc k) m === sSucc (k %:+ m %:- m) `because` succCong (sym $ plusMinus k m) === sSucc (m %:+ k %:- m) `because` succCong (minusCongL (plusComm k m) m) =~= sSucc (n %:- m) } lneqZeroAbsurd n leq = succLeqZeroAbsurd n (coerce (lneqSuccLeq n sZero) leq) minusPlus n m mLEQn = case leqWitness m n mLEQn of { DiffNat _ k -> start (n %:- m %:+ m) =~= m %:+ k %:- m %:+ m === k %:+ m %:- m %:+ m `because` plusCongL (minusCongL (plusComm m k) m) m === k %:+ m `because` plusCongL (plusMinus k m) m === m %:+ k `because` plusComm k m =~= n }
+ Data.Type.Natural: class (SOrd nat, IsPeano nat) => PeanoOrder nat
- Data.Type.Natural: cmpSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare n m :~: LT -> Compare n (Succ m) :~: LT
+ Data.Type.Natural: cmpSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare n m :~: 'LT -> Compare n (Succ m) :~: 'LT
- Data.Type.Natural: cmpZero :: PeanoOrder nat => Sing a -> Compare (Zero nat) (Succ a) :~: LT
+ Data.Type.Natural: cmpZero :: PeanoOrder nat => Sing a -> Compare (Zero nat) (Succ a) :~: 'LT
- Data.Type.Natural: cmpZero' :: PeanoOrder nat => Sing a -> Either (Compare (Zero nat) a :~: EQ) (Compare (Zero nat) a :~: LT)
+ Data.Type.Natural: cmpZero' :: PeanoOrder nat => Sing a -> Either (Compare (Zero nat) a :~: 'EQ) (Compare (Zero nat) a :~: 'LT)
- Data.Type.Natural: data SSym0 (l_ajw7 :: TyFun Nat Nat)
+ Data.Type.Natural: data SSym0 (l_anme :: TyFun Nat Nat)
- Data.Type.Natural: eqToRefl :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: EQ -> a :~: b
+ Data.Type.Natural: eqToRefl :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'EQ -> a :~: b
- Data.Type.Natural: eqlCmpEQ :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> a :~: b -> Compare a b :~: EQ
+ Data.Type.Natural: eqlCmpEQ :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> a :~: b -> Compare a b :~: 'EQ
- Data.Type.Natural: fromLeqView :: PeanoOrder nat => LeqView (n :: nat) m -> IsTrue (n :<= m)
+ Data.Type.Natural: fromLeqView :: PeanoOrder nat => LeqView (n :: nat) m -> IsTrue (n <= m)
- Data.Type.Natural: geqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Max n m :~: n
+ Data.Type.Natural: geqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Max n m :~: n
- Data.Type.Natural: geqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Min n m :~: m
+ Data.Type.Natural: geqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Min n m :~: m
- Data.Type.Natural: gtToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: GT -> IsTrue (b :<= a)
+ Data.Type.Natural: gtToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'GT -> IsTrue (b <= a)
- Data.Type.Natural: leqAntisymm :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (m :<= n) -> n :~: m
+ Data.Type.Natural: leqAntisymm :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (m <= n) -> n :~: m
- Data.Type.Natural: leqNeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a :<= b) -> (a :~: b -> Void) -> Compare a b :~: LT
+ Data.Type.Natural: leqNeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> (a :~: b -> Void) -> Compare a b :~: 'LT
- Data.Type.Natural: leqNeqToSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> (n :~: m -> Void) -> IsTrue (Succ n :<= m)
+ Data.Type.Natural: leqNeqToSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> (n :~: m -> Void) -> IsTrue (Succ n <= m)
- Data.Type.Natural: leqRefl :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n :<= n)
+ Data.Type.Natural: leqRefl :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n <= n)
- Data.Type.Natural: leqReflexive :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n :<= m)
+ Data.Type.Natural: leqReflexive :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n <= m)
- Data.Type.Natural: leqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :<= m) :~: (m :>= n)
+ Data.Type.Natural: leqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n <= m) :~: (m >= n)
- Data.Type.Natural: leqStep :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ l) :~: m -> IsTrue (n :<= m)
+ Data.Type.Natural: leqStep :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + l) :~: m -> IsTrue (n <= m)
- Data.Type.Natural: leqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (Succ n :<= Succ m)
+ Data.Type.Natural: leqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (Succ n <= Succ m)
- Data.Type.Natural: leqSucc' :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :<= m) :~: (Succ n :<= Succ m)
+ Data.Type.Natural: leqSucc' :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n <= m) :~: (Succ n <= Succ m)
- Data.Type.Natural: leqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n :<= m) -> IsTrue (n :<= m)
+ Data.Type.Natural: leqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n <= m) -> IsTrue (n <= m)
- Data.Type.Natural: leqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (n :<= Succ m)
+ Data.Type.Natural: leqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (n <= Succ m)
- Data.Type.Natural: leqToCmp :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a :<= b) -> Either (a :~: b) (Compare a b :~: LT)
+ Data.Type.Natural: leqToCmp :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> Either (a :~: b) (Compare a b :~: 'LT)
- Data.Type.Natural: leqToGT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ b :<= a) -> Compare a b :~: GT
+ Data.Type.Natural: leqToGT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ b <= a) -> Compare a b :~: 'GT
- Data.Type.Natural: leqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ a :<= b) -> Compare a b :~: LT
+ Data.Type.Natural: leqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ a <= b) -> Compare a b :~: 'LT
- Data.Type.Natural: leqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Max n m :~: m
+ Data.Type.Natural: leqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Max n m :~: m
- Data.Type.Natural: leqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Min n m :~: n
+ Data.Type.Natural: leqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Min n m :~: n
- Data.Type.Natural: leqTrans :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n :<= m) -> IsTrue (m :<= l) -> IsTrue (n :<= l)
+ Data.Type.Natural: leqTrans :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n <= m) -> IsTrue (m <= l) -> IsTrue (n <= l)
- Data.Type.Natural: leqWitness :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> DiffNat n m
+ Data.Type.Natural: leqWitness :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> DiffNat n m
- Data.Type.Natural: leqZero :: PeanoOrder nat => Sing n -> IsTrue (Zero nat :<= n)
+ Data.Type.Natural: leqZero :: PeanoOrder nat => Sing n -> IsTrue (Zero nat <= n)
- Data.Type.Natural: leqZeroElim :: PeanoOrder nat => Sing n -> IsTrue (n :<= Zero nat) -> n :~: Zero nat
+ Data.Type.Natural: leqZeroElim :: PeanoOrder nat => Sing n -> IsTrue (n <= Zero nat) -> n :~: Zero nat
- Data.Type.Natural: lneqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :< m) :~: (m :> n)
+ Data.Type.Natural: lneqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n < m) :~: (m > n)
- Data.Type.Natural: lneqRightPredSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m) -> m :~: Succ (Pred m)
+ Data.Type.Natural: lneqRightPredSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> m :~: Succ (Pred m)
- Data.Type.Natural: lneqSucc :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n :< Succ n)
+ Data.Type.Natural: lneqSucc :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n < Succ n)
- Data.Type.Natural: lneqSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :< m) :~: (Succ n :<= m)
+ Data.Type.Natural: lneqSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n < m) :~: (Succ n <= m)
- Data.Type.Natural: lneqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n :< m) -> IsTrue (n :< m)
+ Data.Type.Natural: lneqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n < m) -> IsTrue (n < m)
- Data.Type.Natural: lneqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :< m) -> IsTrue (n :< Succ m)
+ Data.Type.Natural: lneqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n < m) -> IsTrue (n < Succ m)
- Data.Type.Natural: lneqToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m) -> Compare n m :~: LT
+ Data.Type.Natural: lneqToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> Compare n m :~: 'LT
- Data.Type.Natural: lneqZero :: PeanoOrder nat => Sing (a :: nat) -> IsTrue (Zero nat :< Succ a)
+ Data.Type.Natural: lneqZero :: PeanoOrder nat => Sing (a :: nat) -> IsTrue (Zero nat < Succ a)
- Data.Type.Natural: lneqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (n :< Zero nat) -> Void
+ Data.Type.Natural: lneqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (n < Zero nat) -> Void
- Data.Type.Natural: ltRightPredSucc :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> b :~: Succ (Pred b)
+ Data.Type.Natural: ltRightPredSucc :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> b :~: Succ (Pred b)
- Data.Type.Natural: ltSucc :: PeanoOrder nat => Sing (a :: nat) -> Compare a (Succ a) :~: LT
+ Data.Type.Natural: ltSucc :: PeanoOrder nat => Sing (a :: nat) -> Compare a (Succ a) :~: 'LT
- Data.Type.Natural: ltSuccLToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare (Succ n) m :~: LT -> Compare n m :~: LT
+ Data.Type.Natural: ltSuccLToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare (Succ n) m :~: 'LT -> Compare n m :~: 'LT
- Data.Type.Natural: ltToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> IsTrue (a :<= b)
+ Data.Type.Natural: ltToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> IsTrue (a <= b)
- Data.Type.Natural: ltToLneq :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> Compare n m :~: LT -> IsTrue (n :< m)
+ Data.Type.Natural: ltToLneq :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> Compare n m :~: 'LT -> IsTrue (n < m)
- Data.Type.Natural: ltToNeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> a :~: b -> Void
+ Data.Type.Natural: ltToNeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> a :~: b -> Void
- Data.Type.Natural: ltToSuccLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> IsTrue (Succ a :<= b)
+ Data.Type.Natural: ltToSuccLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> IsTrue (Succ a <= b)
- Data.Type.Natural: maxLeast :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (n :<= l) -> IsTrue (m :<= l) -> IsTrue (Max n m :<= l)
+ Data.Type.Natural: maxLeast :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (n <= l) -> IsTrue (m <= l) -> IsTrue (Max n m <= l)
- Data.Type.Natural: maxLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= Max n m)
+ Data.Type.Natural: maxLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= Max n m)
- Data.Type.Natural: maxLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= Max n m)
+ Data.Type.Natural: maxLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= Max n m)
- Data.Type.Natural: minLargest :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (l :<= n) -> IsTrue (l :<= m) -> IsTrue (l :<= Min n m)
+ Data.Type.Natural: minLargest :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (l <= n) -> IsTrue (l <= m) -> IsTrue (l <= Min n m)
- Data.Type.Natural: minLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= n)
+ Data.Type.Natural: minLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= n)
- Data.Type.Natural: minLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= m)
+ Data.Type.Natural: minLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= m)
- Data.Type.Natural: minusNilpotent :: IsPeano nat => Sing n -> (n :- n) :~: Zero nat
+ Data.Type.Natural: minusNilpotent :: IsPeano nat => Sing n -> (n - n) :~: Zero nat
- Data.Type.Natural: minusPlus :: forall (n :: nat) m. (PeanoOrder nat, PeanoOrder nat) => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> ((n :- m) :+ m) :~: n
+ Data.Type.Natural: minusPlus :: forall (n :: nat) m. (PeanoOrder nat, PeanoOrder nat) => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> ((n - m) + m) :~: n
- Data.Type.Natural: minusSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> (Succ n :- m) :~: Succ (n :- m)
+ Data.Type.Natural: minusSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> (Succ n - m) :~: Succ (n - m)
- Data.Type.Natural: minusZero :: IsPeano nat => Sing n -> (n :- Zero nat) :~: n
+ Data.Type.Natural: minusZero :: IsPeano nat => Sing n -> (n - Zero nat) :~: n
- Data.Type.Natural: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :* m) :* l) :~: (n :* (m :* l))
+ Data.Type.Natural: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) * l) :~: (n * (m * l))
- Data.Type.Natural: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n :* m) :~: (m :* n)
+ Data.Type.Natural: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n * m) :~: (m * n)
- Data.Type.Natural: multCong :: n :~: m -> l :~: k -> (n :* l) :~: (m :* k)
+ Data.Type.Natural: multCong :: n :~: m -> l :~: k -> (n * l) :~: (m * k)
- Data.Type.Natural: multCongL :: n :~: m -> Sing k -> (n :* k) :~: (m :* k)
+ Data.Type.Natural: multCongL :: n :~: m -> Sing k -> (n * k) :~: (m * k)
- Data.Type.Natural: multCongR :: Sing k -> n :~: m -> (k :* n) :~: (k :* m)
+ Data.Type.Natural: multCongR :: Sing k -> n :~: m -> (k * n) :~: (k * m)
- Data.Type.Natural: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n :* m) :~: (Succ n :* l) -> m :~: l
+ Data.Type.Natural: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n * m) :~: (Succ n * l) -> m :~: l
- Data.Type.Natural: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* Succ l) :~: (m :* Succ l) -> n :~: m
+ Data.Type.Natural: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * Succ l) :~: (m * Succ l) -> n :~: m
- Data.Type.Natural: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> n :~: Succ (Pred n)
+ Data.Type.Natural: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> n :~: Succ (Pred n)
- Data.Type.Natural: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> m :~: Succ (Pred m)
+ Data.Type.Natural: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> m :~: Succ (Pred m)
- Data.Type.Natural: multOneL :: IsPeano nat => Sing n -> (One nat :* n) :~: n
+ Data.Type.Natural: multOneL :: IsPeano nat => Sing n -> (One nat * n) :~: n
- Data.Type.Natural: multOneR :: IsPeano nat => Sing n -> (n :* One nat) :~: n
+ Data.Type.Natural: multOneR :: IsPeano nat => Sing n -> (n * One nat) :~: n
- Data.Type.Natural: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* (m :+ l)) :~: ((n :* m) :+ (n :* l))
+ Data.Type.Natural: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * (m + l)) :~: ((n * m) + (n * l))
- Data.Type.Natural: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n :* m) :~: ((n :* m) :+ m)
+ Data.Type.Natural: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n * m) :~: ((n * m) + m)
- Data.Type.Natural: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n :* S m) :~: ((n :* m) :+ (n :: nat))
+ Data.Type.Natural: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n * S m) :~: ((n * m) + (n :: nat))
- Data.Type.Natural: multZeroL :: IsPeano nat => Sing n -> (Zero nat :* n) :~: Zero nat
+ Data.Type.Natural: multZeroL :: IsPeano nat => Sing n -> (Zero nat * n) :~: Zero nat
- Data.Type.Natural: multZeroR :: IsPeano nat => Sing n -> (n :* Zero nat) :~: Zero nat
+ Data.Type.Natural: multZeroR :: IsPeano nat => Sing n -> (n * Zero nat) :~: Zero nat
- Data.Type.Natural: nonSLeqToLT :: (n :<= m) ~ False => SNat n -> SNat m -> Compare m n :~: LT
+ Data.Type.Natural: nonSLeqToLT :: (n <= m) ~ 'False => SNat n -> SNat m -> Compare m n :~: 'LT
- Data.Type.Natural: notLeqToLeq :: (PeanoOrder nat, (n :<= m) ~ False) => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n)
+ Data.Type.Natural: notLeqToLeq :: (PeanoOrder nat, ((n <= m) ~ 'False)) => Sing (n :: nat) -> Sing m -> IsTrue (m <= n)
- Data.Type.Natural: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :+ l) :~: (n :+ (m :+ l))
+ Data.Type.Natural: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) + l) :~: (n + (m + l))
- Data.Type.Natural: plusCancelLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n :+ m) :<= (n :+ l)) -> IsTrue (m :<= l)
+ Data.Type.Natural: plusCancelLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + m) <= (n + l)) -> IsTrue (m <= l)
- Data.Type.Natural: plusCancelLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n :+ l) :<= (m :+ l)) -> IsTrue (n :<= m)
+ Data.Type.Natural: plusCancelLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + l) <= (m + l)) -> IsTrue (n <= m)
- Data.Type.Natural: plusComm :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: ((m :: nat) :+ n)
+ Data.Type.Natural: plusComm :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: ((m :: nat) + n)
- Data.Type.Natural: plusCong :: n :~: m -> n' :~: m' -> (n :+ n') :~: (m :+ m')
+ Data.Type.Natural: plusCong :: n :~: m -> n' :~: m' -> (n + n') :~: (m + m')
- Data.Type.Natural: plusCongL :: n :~: m -> Sing k -> (n :+ k) :~: (m :+ k)
+ Data.Type.Natural: plusCongL :: n :~: m -> Sing k -> (n + k) :~: (m + k)
- Data.Type.Natural: plusCongR :: Sing k -> n :~: m -> (k :+ n) :~: (k :+ m)
+ Data.Type.Natural: plusCongR :: Sing k -> n :~: m -> (k + n) :~: (k + m)
- Data.Type.Natural: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ m) :~: (n :+ l) -> m :~: l
+ Data.Type.Natural: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + m) :~: (n + l) -> m :~: l
- Data.Type.Natural: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ l) :~: (m :+ l) -> n :~: m
+ Data.Type.Natural: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + l) :~: (m + l) -> n :~: m
- Data.Type.Natural: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> n :~: Zero nat
+ Data.Type.Natural: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> n :~: Zero nat
- Data.Type.Natural: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> m :~: Zero nat
+ Data.Type.Natural: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> m :~: Zero nat
- Data.Type.Natural: plusInjectiveL :: SNat n -> SNat m -> SNat l -> (n :+ m) :~: (n :+ l) -> m :~: l
+ Data.Type.Natural: plusInjectiveL :: SNat n -> SNat m -> SNat l -> (n + m) :~: (n + l) -> m :~: l
- Data.Type.Natural: plusInjectiveR :: SNat n -> SNat m -> SNat l -> (n :+ l) :~: (m :+ l) -> n :~: m
+ Data.Type.Natural: plusInjectiveR :: SNat n -> SNat m -> SNat l -> (n + l) :~: (m + l) -> n :~: m
- Data.Type.Natural: plusLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= (n :+ m))
+ Data.Type.Natural: plusLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= (n + m))
- Data.Type.Natural: plusLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= (n :+ m))
+ Data.Type.Natural: plusLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= (n + m))
- Data.Type.Natural: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- m) :~: n
+ Data.Type.Natural: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - m) :~: n
- Data.Type.Natural: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- n) :~: m
+ Data.Type.Natural: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - n) :~: m
- Data.Type.Natural: plusMinusEqL :: SNat n -> SNat m -> ((n :+: m) :-: m) :~: n
+ Data.Type.Natural: plusMinusEqL :: SNat n -> SNat m -> ((n + m) - m) :~: n
- Data.Type.Natural: plusMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n :<= m) -> IsTrue (l :<= k) -> IsTrue ((n :+ l) :<= (m :+ k))
+ Data.Type.Natural: plusMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n <= m) -> IsTrue (l <= k) -> IsTrue ((n + l) <= (m + k))
- Data.Type.Natural: plusMonotoneL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n :<= m) -> IsTrue ((n :+ l) :<= (m :+ l))
+ Data.Type.Natural: plusMonotoneL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n <= m) -> IsTrue ((n + l) <= (m + l))
- Data.Type.Natural: plusMonotoneR :: PeanoOrder nat => Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m :<= l) -> IsTrue ((n :+ m) :<= (n :+ l))
+ Data.Type.Natural: plusMonotoneR :: PeanoOrder nat => Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m <= l) -> IsTrue ((n + m) <= (n + l))
- Data.Type.Natural: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :* l) :~: ((n :* l) :+ (m :* l))
+ Data.Type.Natural: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) * l) :~: ((n * l) + (m * l))
- Data.Type.Natural: plusNeutralL :: SNat n -> SNat m -> (n :+ m) :~: m -> n :~: Z
+ Data.Type.Natural: plusNeutralL :: SNat n -> SNat m -> (n + m) :~: m -> n :~: 'Z
- Data.Type.Natural: plusNeutralR :: SNat n -> SNat m -> (n :+ m) :~: n -> m :~: Z
+ Data.Type.Natural: plusNeutralR :: SNat n -> SNat m -> (n + m) :~: n -> m :~: 'Z
- Data.Type.Natural: plusStrictMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n :< m) -> IsTrue (l :< k) -> IsTrue ((n :+ l) :< (m :+ k))
+ Data.Type.Natural: plusStrictMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n < m) -> IsTrue (l < k) -> IsTrue ((n + l) < (m + k))
- Data.Type.Natural: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n :+ m) :~: S (n :+ m :: nat)
+ Data.Type.Natural: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n + m) :~: S (n + m :: nat)
- Data.Type.Natural: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n :+ S m) :~: S (n :+ m :: nat)
+ Data.Type.Natural: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n + S m) :~: S (n + m :: nat)
- Data.Type.Natural: plusZeroL :: IsPeano nat => Sing n -> (Zero nat :+ n) :~: n
+ Data.Type.Natural: plusZeroL :: IsPeano nat => Sing n -> (Zero nat + n) :~: n
- Data.Type.Natural: plusZeroR :: IsPeano nat => Sing n -> (n :+ Zero nat) :~: n
+ Data.Type.Natural: plusZeroR :: IsPeano nat => Sing n -> (n + Zero nat) :~: n
- Data.Type.Natural: reflToSEqual :: SNat n -> SNat m -> n :~: m -> IsTrue (n :== m)
+ Data.Type.Natural: reflToSEqual :: SNat n -> SNat m -> n :~: m -> IsTrue (n == m)
- Data.Type.Natural: sLeqReflexive :: SNat n -> SNat m -> IsTrue (n :== m) -> IsTrue (n :<= m)
+ Data.Type.Natural: sLeqReflexive :: SNat n -> SNat m -> IsTrue (n == m) -> IsTrue (n <= m)
- Data.Type.Natural: sMax :: SOrd a0 => forall (t0 :: a0) (t1 :: a0). Sing a0 t0 -> Sing a0 t1 -> Sing a0 (Apply a0 a0 (Apply a0 (TyFun a0 a0 -> Type) (MaxSym0 a0) t0) t1)
+ Data.Type.Natural: 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.Type.Natural: sMin :: SOrd a0 => forall (t0 :: a0) (t1 :: a0). Sing a0 t0 -> Sing a0 t1 -> Sing a0 (Apply a0 a0 (Apply a0 (TyFun a0 a0 -> Type) (MinSym0 a0) t0) t1)
+ Data.Type.Natural: 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
- Data.Type.Natural: snEqZAbsurd :: SingI n => S n :~: Z -> a
+ Data.Type.Natural: snEqZAbsurd :: SingI n => 'S n :~: 'Z -> a
- Data.Type.Natural: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat :+ n)
+ Data.Type.Natural: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat + n)
- Data.Type.Natural: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n :+ One nat)
+ Data.Type.Natural: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n + One nat)
- Data.Type.Natural: succLeqAbsurd :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (S n :<= n) -> Void
+ Data.Type.Natural: succLeqAbsurd :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (S n <= n) -> Void
- Data.Type.Natural: succLeqAbsurd' :: PeanoOrder nat => Sing (n :: nat) -> (S n :<= n) :~: False
+ Data.Type.Natural: succLeqAbsurd' :: PeanoOrder nat => Sing (n :: nat) -> (S n <= n) :~: 'False
- Data.Type.Natural: succLeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (S a :<= b) -> Compare a b :~: LT
+ Data.Type.Natural: succLeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (S a <= b) -> Compare a b :~: 'LT
- Data.Type.Natural: succLeqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (S n :<= Zero nat) -> Void
+ Data.Type.Natural: succLeqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (S n <= Zero nat) -> Void
- Data.Type.Natural: succLeqZeroAbsurd' :: PeanoOrder nat => Sing n -> (S n :<= Zero nat) :~: False
+ Data.Type.Natural: succLeqZeroAbsurd' :: PeanoOrder nat => Sing n -> (S n <= Zero nat) :~: 'False
- Data.Type.Natural: succLneqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> (n :< m) :~: (Succ n :< Succ m)
+ Data.Type.Natural: succLneqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> (n < m) :~: (Succ n < Succ m)
- Data.Type.Natural: type (:-$$$) a6989586621679425695 (t0 :: a6989586621679425695) (t1 :: a6989586621679425695) = (:-) a6989586621679425695 t0 t1
+ Data.Type.Natural: type (<=) a_akVI b_akVJ = (:<=) a_akVI b_akVJ
- Data.Type.Natural: type LeqInstance n m = IsTrue (n :<= m)
+ Data.Type.Natural: type LeqInstance n m = IsTrue (n <= m)
- Data.Type.Natural: type MaxSym2 a6989586621679305513 (t0 :: a6989586621679305513) (t1 :: a6989586621679305513) = Max a6989586621679305513 t0 t1
+ Data.Type.Natural: type MaxSym2 a6989586621679302787 (t :: a6989586621679302787) (t1 :: a6989586621679302787) = Max a6989586621679302787 t t1
- Data.Type.Natural: type MinSym2 a6989586621679305513 (t0 :: a6989586621679305513) (t1 :: a6989586621679305513) = Min a6989586621679305513 t0 t1
+ Data.Type.Natural: type MinSym2 a6989586621679302787 (t :: a6989586621679302787) (t1 :: a6989586621679302787) = Min a6989586621679302787 t t1
- Data.Type.Natural: type SSym1 (t_ajw6 :: Nat) = S t_ajw6
+ Data.Type.Natural: type SSym1 (t_anmd :: Nat) = S t_anmd
- Data.Type.Natural: viewLeq :: forall n m. PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> LeqView n m
+ Data.Type.Natural: viewLeq :: forall n m. PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> LeqView n m
- Data.Type.Natural: zeroNoLT :: PeanoOrder nat => Sing a -> Compare a (Zero nat) :~: LT -> Void
+ Data.Type.Natural: zeroNoLT :: PeanoOrder nat => Sing a -> Compare a (Zero nat) :~: 'LT -> Void
- Data.Type.Natural.Builtin: class (SDecide nat, SNum nat, SEnum nat) => IsPeano nat where succInj' _ _ = succInj plusMinus' n m = start (n %:+ m %:- n) === m %:+ n %:- n `because` minusCongL (plusComm n m) n === m `because` plusMinus m n plusZeroL sn = idLProof (induction base step sn) where base :: PlusZeroL (Zero nat) base = IdentityL (plusZeroR sZero) step :: Sing (n :: nat) -> PlusZeroL n -> PlusZeroL (S n) step sk (IdentityL ih) = IdentityL $ start (sZero %:+ sS sk) === sS (sZero %:+ sk) `because` plusSuccR sZero sk === sS sk `because` succCong ih plusSuccL sn0 sm0 = plusSuccLProof (induction base step sm0) sn0 where base :: PlusSuccL (Zero nat) base = PlusSuccL $ \ sn -> start (sS sn %:+ sZero) === sS sn `because` plusZeroR (sS sn) === sS (sn %:+ sZero) `because` succCong (sym $ plusZeroR sn) step :: Sing (n :: nat) -> PlusSuccL n -> PlusSuccL (S n) step sm (PlusSuccL ih) = PlusSuccL $ \ sn -> start (sS sn %:+ sS sm) === sS (sS sn %:+ sm) `because` plusSuccR (sS sn) sm === sS (sS (sn %:+ sm)) `because` succCong (ih sn) === sS (sn %:+ sS sm) `because` succCong (sym $ plusSuccR sn sm) plusZeroR sn = idRProof (induction base step sn) where base :: PlusZeroR (Zero nat) base = IdentityR (plusZeroL sZero) step :: Sing (n :: nat) -> PlusZeroR n -> PlusZeroR (S n) step sk (IdentityR ih) = IdentityR $ start (sS sk %:+ sZero) === sS (sk %:+ sZero) `because` plusSuccL sk sZero === sS sk `because` succCong ih plusSuccR sn0 = plusSuccRProof (induction base step sn0) where base :: PlusSuccR (Zero nat) base = PlusSuccR $ \ sk -> start (sZero %:+ sS sk) === sS sk `because` plusZeroL (sS sk) === sS (sZero %:+ sk) `because` succCong (sym $ plusZeroL sk) step :: Sing (n :: nat) -> PlusSuccR n -> PlusSuccR (S n) step sn (PlusSuccR ih) = PlusSuccR $ \ sk -> start (sS sn %:+ sS sk) === sS (sn %:+ sS sk) `because` plusSuccL sn (sS sk) === sS (sS (sn %:+ sk)) `because` succCong (ih sk) === sS (sS sn %:+ sk) `because` succCong (sym $ plusSuccL sn sk) plusComm sn0 = commProof (induction base step sn0) where base :: PlusComm (Zero nat) base = Comm $ \ sk -> start (sZero %:+ sk) === sk `because` plusZeroL sk === (sk %:+ sZero) `because` sym (plusZeroR sk) step :: Sing (n :: nat) -> PlusComm n -> PlusComm (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:+ sk) === sS (sn %:+ sk) `because` plusSuccL sn sk === sS (sk %:+ sn) `because` succCong (ih sk) === sk %:+ sS sn `because` sym (plusSuccR sk sn) plusAssoc sn m l = assocProof (induction base step sn) m l where base :: Assoc (:+$$) (Zero nat) base = Assoc $ \ sk sl -> start ((sZero %:+ sk) %:+ sl) === sk %:+ sl `because` plusCongL (plusZeroL sk) sl === (sZero %:+ (sk %:+ sl)) `because` sym (plusZeroL (sk %:+ sl)) step :: forall k. Sing (k :: nat) -> Assoc (:+$$) k -> Assoc (:+$$) (S k) step sk (Assoc ih) = Assoc $ \ sl su -> start ((sS sk %:+ sl) %:+ su) === (sS (sk %:+ sl) %:+ su) `because` plusCongL (plusSuccL sk sl) su === sS (sk %:+ sl %:+ su) `because` plusSuccL (sk %:+ sl) su === sS (sk %:+ (sl %:+ su)) `because` succCong (ih sl su) === sS sk %:+ (sl %:+ su) `because` sym (plusSuccL sk (sl %:+ su)) multZeroL sn0 = multZeroLProof $ induction base step sn0 where base :: MultZeroL (Zero nat) base = MultZeroL (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroL k -> MultZeroL (S k) step sk (MultZeroL ih) = MultZeroL $ start (sZero %:* sS sk) === sZero %:* sk %:+ sZero `because` multSuccR sZero sk === sZero %:* sk `because` plusZeroR (sZero %:* sk) === sZero `because` ih multSuccL sn0 sm0 = multSuccLProof (induction base step sm0) sn0 where base :: MultSuccL (Zero nat) base = MultSuccL $ \ sk -> start (sS sk %:* sZero) === sZero `because` multZeroR (sS sk) === sk %:* sZero `because` sym (multZeroR sk) === sk %:* sZero %:+ sZero `because` sym (plusZeroR (sk %:* sZero)) step :: Sing (m :: nat) -> MultSuccL m -> MultSuccL (S m) step sm (MultSuccL ih) = MultSuccL $ \ sk -> start (sS sk %:* sS sm) === sS sk %:* sm %:+ sS sk `because` multSuccR (sS sk) sm === (sk %:* sm %:+ sm) %:+ sS sk `because` plusCongL (ih sk) (sS sk) === sS ((sk %:* sm %:+ sm) %:+ sk) `because` plusSuccR (sk %:* sm %:+ sm) sk === sS (sk %:* sm %:+ (sm %:+ sk)) `because` succCong (plusAssoc (sk %:* sm) sm sk) === sS (sk %:* sm %:+ (sk %:+ sm)) `because` succCong (plusCongR (sk %:* sm) (plusComm sm sk)) === sS ((sk %:* sm %:+ sk) %:+ sm) `because` succCong (sym $ plusAssoc (sk %:* sm) sk sm) === sS ((sk %:* sS sm) %:+ sm) `because` succCong (plusCongL (sym $ multSuccR sk sm) sm) === sk %:* sS sm %:+ sS sm `because` sym (plusSuccR (sk %:* sS sm) sm) multZeroR sn0 = multZeroRProof $ induction base step sn0 where base :: MultZeroR (Zero nat) base = MultZeroR (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroR k -> MultZeroR (S k) step sk (MultZeroR ih) = MultZeroR $ start (sS sk %:* sZero) === sk %:* sZero %:+ sZero `because` multSuccL sk sZero === sk %:* sZero `because` plusZeroR (sk %:* sZero) === sZero `because` ih multSuccR sn0 = multSuccRProof $ induction base step sn0 where base :: MultSuccR (Zero nat) base = MultSuccR $ \ sk -> start (sZero %:* sS sk) === sZero `because` multZeroL (sS sk) === sZero %:* sk `because` sym (multZeroL sk) === sZero %:* sk %:+ sZero `because` sym (plusZeroR (sZero %:* sk)) step :: Sing (n :: nat) -> MultSuccR n -> MultSuccR (S n) step sn (MultSuccR ih) = MultSuccR $ \ sk -> start (sS sn %:* sS sk) === sn %:* sS sk %:+ sS sk `because` multSuccL sn (sS sk) === sS (sn %:* sS sk %:+ sk) `because` plusSuccR (sn %:* sS sk) sk === sS (sn %:* sk %:+ sn %:+ sk) `because` succCong (plusCongL (ih sk) sk) === sS (sn %:* sk %:+ (sn %:+ sk)) `because` succCong (plusAssoc (sn %:* sk) sn sk) === sS (sn %:* sk %:+ (sk %:+ sn)) `because` succCong (plusCongR (sn %:* sk) (plusComm sn sk)) === sS (sn %:* sk %:+ sk %:+ sn) `because` succCong (sym $ plusAssoc (sn %:* sk) sk sn) === sS (sS sn %:* sk %:+ sn) `because` succCong (plusCongL (sym $ multSuccL sn sk) sn) === sS sn %:* sk %:+ sS sn `because` sym (plusSuccR (sS sn %:* sk) sn) multComm sn0 = commProof (induction base step sn0) where base :: Comm (:*$$) (Zero nat) base = Comm $ \ sk -> start (sZero %:* sk) === sZero `because` multZeroL sk === sk %:* sZero `because` sym (multZeroR sk) step :: Sing (n :: nat) -> Comm (:*$$) n -> Comm (:*$$) (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:* sk) === sn %:* sk %:+ sk `because` multSuccL sn sk === sk %:* sn %:+ sk `because` plusCongL (ih sk) sk === sk %:* sS sn `because` sym (multSuccR sk sn) multOneR sn = start (sn %:* sOne) === sn %:* sS sZero `because` multCongR sn (sym $ succOneCong) === sn %:* sZero %:+ sn `because` multSuccR sn sZero === sZero %:+ sn `because` plusCongL (multZeroR sn) sn === sn `because` plusZeroL sn multOneL sn = start (sOne %:* sn) === sn %:* sOne `because` multComm sOne sn === sn `because` multOneR sn plusMultDistrib sn0 = plusMultDistribProof $ induction base step sn0 where base :: PlusMultDistrib (Zero nat) base = PlusMultDistrib $ \ sk sl -> start ((sZero %:+ sk) %:* sl) === (sk %:* sl) `because` multCongL (plusZeroL sk) sl === sZero %:+ (sk %:* sl) `because` sym (plusZeroL (sk %:* sl)) === sZero %:* sl %:+ sk %:* sl `because` plusCongL (sym $ multZeroL sl) (sk %:* sl) step :: Sing (n :: nat) -> PlusMultDistrib n -> PlusMultDistrib (S n) step sn (PlusMultDistrib ih) = PlusMultDistrib $ \ sk sl -> start ((sS sn %:+ sk) %:* sl) === (sS (sn %:+ sk) %:* sl) `because` multCongL (plusSuccL sn sk) sl === (sn %:+ sk) %:* sl %:+ sl `because` multSuccL (sn %:+ sk) sl === (sn %:* sl %:+ sk %:* sl) %:+ sl `because` plusCongL (ih sk sl) sl === sn %:* sl %:+ (sk %:* sl %:+ sl) `because` plusAssoc (sn %:* sl) (sk %:* sl) sl === sn %:* sl %:+ (sl %:+ sk %:* sl) `because` plusCongR (sn %:* sl) (plusComm (sk %:* sl) sl) === (sn %:* sl %:+ sl) %:+ sk %:* sl `because` sym (plusAssoc (sn %:* sl) sl (sk %:* sl)) === (sS sn %:* sl) %:+ sk %:* sl `because` plusCongL (sym $ multSuccL sn sl) (sk %:* sl) multPlusDistrib n m l = start (n %:* (m %:+ l)) === (m %:+ l) %:* n `because` multComm n (m %:+ l) === m %:* n %:+ l %:* n `because` plusMultDistrib m l n === n %:* m %:+ n %:* l `because` plusCong (multComm m n) (multComm l n) minusNilpotent n = start (n %:- n) === (sZero %:+ n) %:- n `because` minusCongL (sym $ plusZeroL n) n === sZero `because` plusMinus sZero n multAssoc sn0 = assocProof $ induction base step sn0 where base :: Assoc (:*$$) (Zero nat) base = Assoc $ \ m l -> start (sZero %:* m %:* l) === sZero %:* l `because` multCongL (multZeroL m) l === sZero `because` multZeroL l === sZero %:* (m %:* l) `because` sym (multZeroL (m %:* l)) step :: Sing (n :: nat) -> Assoc (:*$$) n -> Assoc (:*$$) (S n) step n _ = Assoc $ \ m l -> start (sS n %:* m %:* l) === (n %:* m %:+ m) %:* l `because` multCongL (multSuccL n m) l === n %:* m %:* l %:+ m %:* l `because` plusMultDistrib (n %:* m) m l === n %:* (m %:* l) %:+ m %:* l `because` plusCongL (multAssoc n m l) (m %:* l) === sS n %:* (m %:* l) `because` sym (multSuccL n (m %:* l)) plusEqCancelL = plusEqCancelLProof . induction base step where base :: PlusEqCancelL (Zero nat) base = PlusEqCancelL $ \ l m nlnm -> start l === sZero %:+ l `because` sym (plusZeroL l) === sZero %:+ m `because` nlnm === m `because` plusZeroL m step :: Sing (n :: nat) -> PlusEqCancelL n -> PlusEqCancelL (Succ n) step n (PlusEqCancelL ih) = PlusEqCancelL $ \ l m snlsnm -> succInj $ ih (sS l) (sS m) $ start (n %:+ sS l) === sS (n %:+ l) `because` plusSuccR n l === sS n %:+ l `because` sym (plusSuccL n l) === sS n %:+ m `because` snlsnm === sS (n %:+ m) `because` plusSuccL n m === n %:+ sS m `because` sym (plusSuccR n m) plusEqCancelR n m l nlml = plusEqCancelL l n m $ start (l %:+ n) === (n %:+ l) `because` plusComm l n === (m %:+ l) `because` nlml === (l %:+ m) `because` plusComm m l succAndPlusOneL = proofSuccPlusL . induction base step where base :: SuccPlusL (Zero nat) base = SuccPlusL $ start (sSucc sZero) === sOne `because` succOneCong === sOne %:+ sZero `because` sym (plusZeroR sOne) step :: Sing (n :: nat) -> SuccPlusL n -> SuccPlusL (Succ n) step sn (SuccPlusL ih) = SuccPlusL $ start (sSucc (sSucc sn)) === sSucc (sOne %:+ sn) `because` succCong ih === sOne %:+ sSucc sn `because` sym (plusSuccR sOne sn) succAndPlusOneR n = start (sSucc n) === sOne %:+ n `because` succAndPlusOneL n === n %:+ sOne `because` plusComm sOne n zeroOrSucc = induction base step where base = IsZero step sn _ = IsSucc sn plusEqZeroL n m Refl = case zeroOrSucc n of { IsZero -> Refl IsSucc pn -> absurd $ succNonCyclic (pn %:+ m) (sym $ plusSuccL pn m) } plusEqZeroR n m = plusEqZeroL m n . trans (plusComm m n) predUnique n m snEm = start n === (sPred (sSucc n)) `because` sym (predSucc n) === sPred m `because` predCong snEm multEqSuccElimL n m l nmEsl = case zeroOrSucc n of { IsZero -> absurd $ succNonCyclic l $ sym $ start sZero === sZero %:* m `because` sym (multZeroL m) === sSucc l `because` nmEsl IsSucc pn -> succCong (predUnique pn n Refl) } multEqSuccElimR n m l nmEsl = multEqSuccElimL m n l (multComm m n `trans` nmEsl) minusZero n = start (n %:- sZero) === (n %:+ sZero) %:- sZero `because` minusCongL (sym $ plusZeroR n) sZero === n `because` plusMinus n sZero multEqCancelR = proofMultEqCancelR . induction base step where base :: MultEqCancelR (Zero nat) base = MultEqCancelR $ \ m l zslmsl -> sym $ plusEqZeroR (m %:* l) m $ sym $ start sZero === sZero %:* l `because` sym (multZeroL l) === sZero %:* l %:+ sZero `because` sym (plusZeroR (sZero %:* l)) === sZero %:* sSucc l `because` sym (multSuccR sZero l) === m %:* sSucc l `because` zslmsl === m %:* l %:+ m `because` multSuccR m l step :: Sing (n :: nat) -> MultEqCancelR n -> MultEqCancelR (Succ n) step n (MultEqCancelR ih) = MultEqCancelR $ \ m l snmssnl -> let m' = sPred m pf = start (m %:* sSucc l) === sSucc n %:* sSucc l `because` sym snmssnl === n %:* sSucc l %:+ sSucc l `because` multSuccL n (sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l sm'Em = multEqSuccElimL m (sSucc l) (n %:* sSucc l %:+ l) pf pf' = ih m' l $ plusEqCancelR (n %:* sSucc l) (m' %:* sSucc l) (sSucc l) $ start (n %:* sSucc l %:+ sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l === m %:* sSucc l `because` sym pf === sSucc m' %:* sSucc l `because` multCongL sm'Em (sSucc l) === (m' %:* sSucc l %:+ sSucc l) `because` multSuccL m' (sSucc l) in succCong pf' `trans` sym sm'Em succPred n nonZero = case zeroOrSucc n of { IsZero -> absurd $ nonZero Refl IsSucc n' -> sym $ succCong $ predUnique n' n Refl } multEqCancelL n m l snmEsnl = multEqCancelR m l n $ multComm m (sSucc n) `trans` snmEsnl `trans` multComm (sSucc n) l sPred' pxy sn = coerce (succInj $ succCong $ predSucc (sPred' pxy sn)) (sPred sn)
+ Data.Type.Natural.Builtin: class (SDecide nat, SNum nat, SEnum nat, SingKind nat, SingKind nat) => IsPeano nat
- Data.Type.Natural.Builtin: fromPeanoMonotone :: ((n :<= m) ~ True) => Sing n -> Sing m -> (FromPeano n <=? FromPeano m) :~: True
+ Data.Type.Natural.Builtin: fromPeanoMonotone :: ((n <= m) ~ 'True) => Sing n -> Sing m -> (FromPeano n <=? FromPeano m) :~: 'True
- Data.Type.Natural.Builtin: fromPeanoMultCong :: Sing n -> Sing m -> FromPeano (n :* m) :~: (FromPeano n :* FromPeano m)
+ Data.Type.Natural.Builtin: fromPeanoMultCong :: Sing n -> Sing m -> FromPeano (n * m) :~: (FromPeano n * FromPeano m)
- Data.Type.Natural.Builtin: fromPeanoPlusCong :: Sing n -> Sing m -> FromPeano (n :+ m) :~: (FromPeano n :+ FromPeano m)
+ Data.Type.Natural.Builtin: fromPeanoPlusCong :: Sing n -> Sing m -> FromPeano (n + m) :~: (FromPeano n + FromPeano m)
- Data.Type.Natural.Builtin: fromPeanoSuccCong :: Sing n -> FromPeano (S n) :~: Succ (FromPeano n)
+ Data.Type.Natural.Builtin: fromPeanoSuccCong :: Sing n -> FromPeano ( 'S n) :~: Succ (FromPeano n)
- Data.Type.Natural.Builtin: fromPeanoZeroCong :: FromPeano Z :~: 0
+ Data.Type.Natural.Builtin: fromPeanoZeroCong :: FromPeano 'Z :~: 0
- Data.Type.Natural.Builtin: minusNilpotent :: IsPeano nat => Sing n -> (n :- n) :~: Zero nat
+ Data.Type.Natural.Builtin: minusNilpotent :: IsPeano nat => Sing n -> (n - n) :~: Zero nat
- Data.Type.Natural.Builtin: minusZero :: IsPeano nat => Sing n -> (n :- Zero nat) :~: n
+ Data.Type.Natural.Builtin: minusZero :: IsPeano nat => Sing n -> (n - Zero nat) :~: n
- Data.Type.Natural.Builtin: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :* m) :* l) :~: (n :* (m :* l))
+ Data.Type.Natural.Builtin: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) * l) :~: (n * (m * l))
- Data.Type.Natural.Builtin: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n :* m) :~: (m :* n)
+ Data.Type.Natural.Builtin: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n * m) :~: (m * n)
- Data.Type.Natural.Builtin: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n :* m) :~: (Succ n :* l) -> m :~: l
+ Data.Type.Natural.Builtin: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n * m) :~: (Succ n * l) -> m :~: l
- Data.Type.Natural.Builtin: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* Succ l) :~: (m :* Succ l) -> n :~: m
+ Data.Type.Natural.Builtin: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * Succ l) :~: (m * Succ l) -> n :~: m
- Data.Type.Natural.Builtin: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> n :~: Succ (Pred n)
+ Data.Type.Natural.Builtin: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> n :~: Succ (Pred n)
- Data.Type.Natural.Builtin: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> m :~: Succ (Pred m)
+ Data.Type.Natural.Builtin: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> m :~: Succ (Pred m)
- Data.Type.Natural.Builtin: multOneL :: IsPeano nat => Sing n -> (One nat :* n) :~: n
+ Data.Type.Natural.Builtin: multOneL :: IsPeano nat => Sing n -> (One nat * n) :~: n
- Data.Type.Natural.Builtin: multOneR :: IsPeano nat => Sing n -> (n :* One nat) :~: n
+ Data.Type.Natural.Builtin: multOneR :: IsPeano nat => Sing n -> (n * One nat) :~: n
- Data.Type.Natural.Builtin: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* (m :+ l)) :~: ((n :* m) :+ (n :* l))
+ Data.Type.Natural.Builtin: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * (m + l)) :~: ((n * m) + (n * l))
- Data.Type.Natural.Builtin: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n :* m) :~: ((n :* m) :+ m)
+ Data.Type.Natural.Builtin: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n * m) :~: ((n * m) + m)
- Data.Type.Natural.Builtin: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n :* S m) :~: ((n :* m) :+ (n :: nat))
+ Data.Type.Natural.Builtin: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n * S m) :~: ((n * m) + (n :: nat))
- Data.Type.Natural.Builtin: multZeroL :: IsPeano nat => Sing n -> (Zero nat :* n) :~: Zero nat
+ Data.Type.Natural.Builtin: multZeroL :: IsPeano nat => Sing n -> (Zero nat * n) :~: Zero nat
- Data.Type.Natural.Builtin: multZeroR :: IsPeano nat => Sing n -> (n :* Zero nat) :~: Zero nat
+ Data.Type.Natural.Builtin: multZeroR :: IsPeano nat => Sing n -> (n * Zero nat) :~: Zero nat
- Data.Type.Natural.Builtin: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :+ l) :~: (n :+ (m :+ l))
+ Data.Type.Natural.Builtin: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) + l) :~: (n + (m + l))
- Data.Type.Natural.Builtin: plusComm :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: ((m :: nat) :+ n)
+ Data.Type.Natural.Builtin: plusComm :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: ((m :: nat) + n)
- Data.Type.Natural.Builtin: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ m) :~: (n :+ l) -> m :~: l
+ Data.Type.Natural.Builtin: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + m) :~: (n + l) -> m :~: l
- Data.Type.Natural.Builtin: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ l) :~: (m :+ l) -> n :~: m
+ Data.Type.Natural.Builtin: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + l) :~: (m + l) -> n :~: m
- Data.Type.Natural.Builtin: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> n :~: Zero nat
+ Data.Type.Natural.Builtin: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> n :~: Zero nat
- Data.Type.Natural.Builtin: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> m :~: Zero nat
+ Data.Type.Natural.Builtin: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> m :~: Zero nat
- Data.Type.Natural.Builtin: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- m) :~: n
+ Data.Type.Natural.Builtin: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - m) :~: n
- Data.Type.Natural.Builtin: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- n) :~: m
+ Data.Type.Natural.Builtin: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - n) :~: m
- Data.Type.Natural.Builtin: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :* l) :~: ((n :* l) :+ (m :* l))
+ Data.Type.Natural.Builtin: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) * l) :~: ((n * l) + (m * l))
- Data.Type.Natural.Builtin: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n :+ m) :~: S (n :+ m :: nat)
+ Data.Type.Natural.Builtin: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n + m) :~: S (n + m :: nat)
- Data.Type.Natural.Builtin: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n :+ S m) :~: S (n :+ m :: nat)
+ Data.Type.Natural.Builtin: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n + S m) :~: S (n + m :: nat)
- Data.Type.Natural.Builtin: plusZeroL :: IsPeano nat => Sing n -> (Zero nat :+ n) :~: n
+ Data.Type.Natural.Builtin: plusZeroL :: IsPeano nat => Sing n -> (Zero nat + n) :~: n
- Data.Type.Natural.Builtin: plusZeroR :: IsPeano nat => Sing n -> (n :+ Zero nat) :~: n
+ Data.Type.Natural.Builtin: plusZeroR :: IsPeano nat => Sing n -> (n + Zero nat) :~: n
- Data.Type.Natural.Builtin: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat :+ n)
+ Data.Type.Natural.Builtin: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat + n)
- Data.Type.Natural.Builtin: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n :+ One nat)
+ Data.Type.Natural.Builtin: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n + One nat)
- Data.Type.Natural.Builtin: toPeanoInjective :: ToPeano n :~: ToPeano m -> n :~: m
+ Data.Type.Natural.Builtin: toPeanoInjective :: forall n m. (KnownNat n, KnownNat m) => ToPeano n :~: ToPeano m -> n :~: m
- Data.Type.Natural.Builtin: toPeanoMonotone :: (n <= m) => Sing n -> Sing m -> ((ToPeano n) :<= (ToPeano m)) :~: True
+ Data.Type.Natural.Builtin: toPeanoMonotone :: (n <= m) => Sing n -> Sing m -> ((ToPeano n) <= (ToPeano m)) :~: 'True
- Data.Type.Natural.Builtin: toPeanoMultCong :: Sing n -> Sing m -> ToPeano (n :* m) :~: (ToPeano n :* ToPeano m)
+ Data.Type.Natural.Builtin: toPeanoMultCong :: Sing n -> Sing m -> ToPeano (n * m) :~: (ToPeano n * ToPeano m)
- Data.Type.Natural.Builtin: toPeanoPlusCong :: Sing n -> Sing m -> ToPeano (n + m) :~: (ToPeano n :+ ToPeano m)
+ Data.Type.Natural.Builtin: toPeanoPlusCong :: Sing n -> Sing m -> ToPeano (n + m) :~: (ToPeano n + ToPeano m)
- Data.Type.Natural.Builtin: toPeanoSuccCong :: Sing n -> ToPeano (Succ n) :~: S (ToPeano n)
+ Data.Type.Natural.Builtin: toPeanoSuccCong :: Sing n -> ToPeano (Succ n) :~: 'S (ToPeano n)
- Data.Type.Natural.Builtin: toPeanoZeroCong :: ToPeano 0 :~: Z
+ Data.Type.Natural.Builtin: toPeanoZeroCong :: ToPeano 0 :~: 'Z
- Data.Type.Natural.Class.Arithmetic: class (SDecide nat, SNum nat, SEnum nat) => IsPeano nat where succInj' _ _ = succInj plusMinus' n m = start (n %:+ m %:- n) === m %:+ n %:- n `because` minusCongL (plusComm n m) n === m `because` plusMinus m n plusZeroL sn = idLProof (induction base step sn) where base :: PlusZeroL (Zero nat) base = IdentityL (plusZeroR sZero) step :: Sing (n :: nat) -> PlusZeroL n -> PlusZeroL (S n) step sk (IdentityL ih) = IdentityL $ start (sZero %:+ sS sk) === sS (sZero %:+ sk) `because` plusSuccR sZero sk === sS sk `because` succCong ih plusSuccL sn0 sm0 = plusSuccLProof (induction base step sm0) sn0 where base :: PlusSuccL (Zero nat) base = PlusSuccL $ \ sn -> start (sS sn %:+ sZero) === sS sn `because` plusZeroR (sS sn) === sS (sn %:+ sZero) `because` succCong (sym $ plusZeroR sn) step :: Sing (n :: nat) -> PlusSuccL n -> PlusSuccL (S n) step sm (PlusSuccL ih) = PlusSuccL $ \ sn -> start (sS sn %:+ sS sm) === sS (sS sn %:+ sm) `because` plusSuccR (sS sn) sm === sS (sS (sn %:+ sm)) `because` succCong (ih sn) === sS (sn %:+ sS sm) `because` succCong (sym $ plusSuccR sn sm) plusZeroR sn = idRProof (induction base step sn) where base :: PlusZeroR (Zero nat) base = IdentityR (plusZeroL sZero) step :: Sing (n :: nat) -> PlusZeroR n -> PlusZeroR (S n) step sk (IdentityR ih) = IdentityR $ start (sS sk %:+ sZero) === sS (sk %:+ sZero) `because` plusSuccL sk sZero === sS sk `because` succCong ih plusSuccR sn0 = plusSuccRProof (induction base step sn0) where base :: PlusSuccR (Zero nat) base = PlusSuccR $ \ sk -> start (sZero %:+ sS sk) === sS sk `because` plusZeroL (sS sk) === sS (sZero %:+ sk) `because` succCong (sym $ plusZeroL sk) step :: Sing (n :: nat) -> PlusSuccR n -> PlusSuccR (S n) step sn (PlusSuccR ih) = PlusSuccR $ \ sk -> start (sS sn %:+ sS sk) === sS (sn %:+ sS sk) `because` plusSuccL sn (sS sk) === sS (sS (sn %:+ sk)) `because` succCong (ih sk) === sS (sS sn %:+ sk) `because` succCong (sym $ plusSuccL sn sk) plusComm sn0 = commProof (induction base step sn0) where base :: PlusComm (Zero nat) base = Comm $ \ sk -> start (sZero %:+ sk) === sk `because` plusZeroL sk === (sk %:+ sZero) `because` sym (plusZeroR sk) step :: Sing (n :: nat) -> PlusComm n -> PlusComm (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:+ sk) === sS (sn %:+ sk) `because` plusSuccL sn sk === sS (sk %:+ sn) `because` succCong (ih sk) === sk %:+ sS sn `because` sym (plusSuccR sk sn) plusAssoc sn m l = assocProof (induction base step sn) m l where base :: Assoc (:+$$) (Zero nat) base = Assoc $ \ sk sl -> start ((sZero %:+ sk) %:+ sl) === sk %:+ sl `because` plusCongL (plusZeroL sk) sl === (sZero %:+ (sk %:+ sl)) `because` sym (plusZeroL (sk %:+ sl)) step :: forall k. Sing (k :: nat) -> Assoc (:+$$) k -> Assoc (:+$$) (S k) step sk (Assoc ih) = Assoc $ \ sl su -> start ((sS sk %:+ sl) %:+ su) === (sS (sk %:+ sl) %:+ su) `because` plusCongL (plusSuccL sk sl) su === sS (sk %:+ sl %:+ su) `because` plusSuccL (sk %:+ sl) su === sS (sk %:+ (sl %:+ su)) `because` succCong (ih sl su) === sS sk %:+ (sl %:+ su) `because` sym (plusSuccL sk (sl %:+ su)) multZeroL sn0 = multZeroLProof $ induction base step sn0 where base :: MultZeroL (Zero nat) base = MultZeroL (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroL k -> MultZeroL (S k) step sk (MultZeroL ih) = MultZeroL $ start (sZero %:* sS sk) === sZero %:* sk %:+ sZero `because` multSuccR sZero sk === sZero %:* sk `because` plusZeroR (sZero %:* sk) === sZero `because` ih multSuccL sn0 sm0 = multSuccLProof (induction base step sm0) sn0 where base :: MultSuccL (Zero nat) base = MultSuccL $ \ sk -> start (sS sk %:* sZero) === sZero `because` multZeroR (sS sk) === sk %:* sZero `because` sym (multZeroR sk) === sk %:* sZero %:+ sZero `because` sym (plusZeroR (sk %:* sZero)) step :: Sing (m :: nat) -> MultSuccL m -> MultSuccL (S m) step sm (MultSuccL ih) = MultSuccL $ \ sk -> start (sS sk %:* sS sm) === sS sk %:* sm %:+ sS sk `because` multSuccR (sS sk) sm === (sk %:* sm %:+ sm) %:+ sS sk `because` plusCongL (ih sk) (sS sk) === sS ((sk %:* sm %:+ sm) %:+ sk) `because` plusSuccR (sk %:* sm %:+ sm) sk === sS (sk %:* sm %:+ (sm %:+ sk)) `because` succCong (plusAssoc (sk %:* sm) sm sk) === sS (sk %:* sm %:+ (sk %:+ sm)) `because` succCong (plusCongR (sk %:* sm) (plusComm sm sk)) === sS ((sk %:* sm %:+ sk) %:+ sm) `because` succCong (sym $ plusAssoc (sk %:* sm) sk sm) === sS ((sk %:* sS sm) %:+ sm) `because` succCong (plusCongL (sym $ multSuccR sk sm) sm) === sk %:* sS sm %:+ sS sm `because` sym (plusSuccR (sk %:* sS sm) sm) multZeroR sn0 = multZeroRProof $ induction base step sn0 where base :: MultZeroR (Zero nat) base = MultZeroR (multZeroR sZero) step :: Sing (k :: nat) -> MultZeroR k -> MultZeroR (S k) step sk (MultZeroR ih) = MultZeroR $ start (sS sk %:* sZero) === sk %:* sZero %:+ sZero `because` multSuccL sk sZero === sk %:* sZero `because` plusZeroR (sk %:* sZero) === sZero `because` ih multSuccR sn0 = multSuccRProof $ induction base step sn0 where base :: MultSuccR (Zero nat) base = MultSuccR $ \ sk -> start (sZero %:* sS sk) === sZero `because` multZeroL (sS sk) === sZero %:* sk `because` sym (multZeroL sk) === sZero %:* sk %:+ sZero `because` sym (plusZeroR (sZero %:* sk)) step :: Sing (n :: nat) -> MultSuccR n -> MultSuccR (S n) step sn (MultSuccR ih) = MultSuccR $ \ sk -> start (sS sn %:* sS sk) === sn %:* sS sk %:+ sS sk `because` multSuccL sn (sS sk) === sS (sn %:* sS sk %:+ sk) `because` plusSuccR (sn %:* sS sk) sk === sS (sn %:* sk %:+ sn %:+ sk) `because` succCong (plusCongL (ih sk) sk) === sS (sn %:* sk %:+ (sn %:+ sk)) `because` succCong (plusAssoc (sn %:* sk) sn sk) === sS (sn %:* sk %:+ (sk %:+ sn)) `because` succCong (plusCongR (sn %:* sk) (plusComm sn sk)) === sS (sn %:* sk %:+ sk %:+ sn) `because` succCong (sym $ plusAssoc (sn %:* sk) sk sn) === sS (sS sn %:* sk %:+ sn) `because` succCong (plusCongL (sym $ multSuccL sn sk) sn) === sS sn %:* sk %:+ sS sn `because` sym (plusSuccR (sS sn %:* sk) sn) multComm sn0 = commProof (induction base step sn0) where base :: Comm (:*$$) (Zero nat) base = Comm $ \ sk -> start (sZero %:* sk) === sZero `because` multZeroL sk === sk %:* sZero `because` sym (multZeroR sk) step :: Sing (n :: nat) -> Comm (:*$$) n -> Comm (:*$$) (S n) step sn (Comm ih) = Comm $ \ sk -> start (sS sn %:* sk) === sn %:* sk %:+ sk `because` multSuccL sn sk === sk %:* sn %:+ sk `because` plusCongL (ih sk) sk === sk %:* sS sn `because` sym (multSuccR sk sn) multOneR sn = start (sn %:* sOne) === sn %:* sS sZero `because` multCongR sn (sym $ succOneCong) === sn %:* sZero %:+ sn `because` multSuccR sn sZero === sZero %:+ sn `because` plusCongL (multZeroR sn) sn === sn `because` plusZeroL sn multOneL sn = start (sOne %:* sn) === sn %:* sOne `because` multComm sOne sn === sn `because` multOneR sn plusMultDistrib sn0 = plusMultDistribProof $ induction base step sn0 where base :: PlusMultDistrib (Zero nat) base = PlusMultDistrib $ \ sk sl -> start ((sZero %:+ sk) %:* sl) === (sk %:* sl) `because` multCongL (plusZeroL sk) sl === sZero %:+ (sk %:* sl) `because` sym (plusZeroL (sk %:* sl)) === sZero %:* sl %:+ sk %:* sl `because` plusCongL (sym $ multZeroL sl) (sk %:* sl) step :: Sing (n :: nat) -> PlusMultDistrib n -> PlusMultDistrib (S n) step sn (PlusMultDistrib ih) = PlusMultDistrib $ \ sk sl -> start ((sS sn %:+ sk) %:* sl) === (sS (sn %:+ sk) %:* sl) `because` multCongL (plusSuccL sn sk) sl === (sn %:+ sk) %:* sl %:+ sl `because` multSuccL (sn %:+ sk) sl === (sn %:* sl %:+ sk %:* sl) %:+ sl `because` plusCongL (ih sk sl) sl === sn %:* sl %:+ (sk %:* sl %:+ sl) `because` plusAssoc (sn %:* sl) (sk %:* sl) sl === sn %:* sl %:+ (sl %:+ sk %:* sl) `because` plusCongR (sn %:* sl) (plusComm (sk %:* sl) sl) === (sn %:* sl %:+ sl) %:+ sk %:* sl `because` sym (plusAssoc (sn %:* sl) sl (sk %:* sl)) === (sS sn %:* sl) %:+ sk %:* sl `because` plusCongL (sym $ multSuccL sn sl) (sk %:* sl) multPlusDistrib n m l = start (n %:* (m %:+ l)) === (m %:+ l) %:* n `because` multComm n (m %:+ l) === m %:* n %:+ l %:* n `because` plusMultDistrib m l n === n %:* m %:+ n %:* l `because` plusCong (multComm m n) (multComm l n) minusNilpotent n = start (n %:- n) === (sZero %:+ n) %:- n `because` minusCongL (sym $ plusZeroL n) n === sZero `because` plusMinus sZero n multAssoc sn0 = assocProof $ induction base step sn0 where base :: Assoc (:*$$) (Zero nat) base = Assoc $ \ m l -> start (sZero %:* m %:* l) === sZero %:* l `because` multCongL (multZeroL m) l === sZero `because` multZeroL l === sZero %:* (m %:* l) `because` sym (multZeroL (m %:* l)) step :: Sing (n :: nat) -> Assoc (:*$$) n -> Assoc (:*$$) (S n) step n _ = Assoc $ \ m l -> start (sS n %:* m %:* l) === (n %:* m %:+ m) %:* l `because` multCongL (multSuccL n m) l === n %:* m %:* l %:+ m %:* l `because` plusMultDistrib (n %:* m) m l === n %:* (m %:* l) %:+ m %:* l `because` plusCongL (multAssoc n m l) (m %:* l) === sS n %:* (m %:* l) `because` sym (multSuccL n (m %:* l)) plusEqCancelL = plusEqCancelLProof . induction base step where base :: PlusEqCancelL (Zero nat) base = PlusEqCancelL $ \ l m nlnm -> start l === sZero %:+ l `because` sym (plusZeroL l) === sZero %:+ m `because` nlnm === m `because` plusZeroL m step :: Sing (n :: nat) -> PlusEqCancelL n -> PlusEqCancelL (Succ n) step n (PlusEqCancelL ih) = PlusEqCancelL $ \ l m snlsnm -> succInj $ ih (sS l) (sS m) $ start (n %:+ sS l) === sS (n %:+ l) `because` plusSuccR n l === sS n %:+ l `because` sym (plusSuccL n l) === sS n %:+ m `because` snlsnm === sS (n %:+ m) `because` plusSuccL n m === n %:+ sS m `because` sym (plusSuccR n m) plusEqCancelR n m l nlml = plusEqCancelL l n m $ start (l %:+ n) === (n %:+ l) `because` plusComm l n === (m %:+ l) `because` nlml === (l %:+ m) `because` plusComm m l succAndPlusOneL = proofSuccPlusL . induction base step where base :: SuccPlusL (Zero nat) base = SuccPlusL $ start (sSucc sZero) === sOne `because` succOneCong === sOne %:+ sZero `because` sym (plusZeroR sOne) step :: Sing (n :: nat) -> SuccPlusL n -> SuccPlusL (Succ n) step sn (SuccPlusL ih) = SuccPlusL $ start (sSucc (sSucc sn)) === sSucc (sOne %:+ sn) `because` succCong ih === sOne %:+ sSucc sn `because` sym (plusSuccR sOne sn) succAndPlusOneR n = start (sSucc n) === sOne %:+ n `because` succAndPlusOneL n === n %:+ sOne `because` plusComm sOne n zeroOrSucc = induction base step where base = IsZero step sn _ = IsSucc sn plusEqZeroL n m Refl = case zeroOrSucc n of { IsZero -> Refl IsSucc pn -> absurd $ succNonCyclic (pn %:+ m) (sym $ plusSuccL pn m) } plusEqZeroR n m = plusEqZeroL m n . trans (plusComm m n) predUnique n m snEm = start n === (sPred (sSucc n)) `because` sym (predSucc n) === sPred m `because` predCong snEm multEqSuccElimL n m l nmEsl = case zeroOrSucc n of { IsZero -> absurd $ succNonCyclic l $ sym $ start sZero === sZero %:* m `because` sym (multZeroL m) === sSucc l `because` nmEsl IsSucc pn -> succCong (predUnique pn n Refl) } multEqSuccElimR n m l nmEsl = multEqSuccElimL m n l (multComm m n `trans` nmEsl) minusZero n = start (n %:- sZero) === (n %:+ sZero) %:- sZero `because` minusCongL (sym $ plusZeroR n) sZero === n `because` plusMinus n sZero multEqCancelR = proofMultEqCancelR . induction base step where base :: MultEqCancelR (Zero nat) base = MultEqCancelR $ \ m l zslmsl -> sym $ plusEqZeroR (m %:* l) m $ sym $ start sZero === sZero %:* l `because` sym (multZeroL l) === sZero %:* l %:+ sZero `because` sym (plusZeroR (sZero %:* l)) === sZero %:* sSucc l `because` sym (multSuccR sZero l) === m %:* sSucc l `because` zslmsl === m %:* l %:+ m `because` multSuccR m l step :: Sing (n :: nat) -> MultEqCancelR n -> MultEqCancelR (Succ n) step n (MultEqCancelR ih) = MultEqCancelR $ \ m l snmssnl -> let m' = sPred m pf = start (m %:* sSucc l) === sSucc n %:* sSucc l `because` sym snmssnl === n %:* sSucc l %:+ sSucc l `because` multSuccL n (sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l sm'Em = multEqSuccElimL m (sSucc l) (n %:* sSucc l %:+ l) pf pf' = ih m' l $ plusEqCancelR (n %:* sSucc l) (m' %:* sSucc l) (sSucc l) $ start (n %:* sSucc l %:+ sSucc l) === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l === m %:* sSucc l `because` sym pf === sSucc m' %:* sSucc l `because` multCongL sm'Em (sSucc l) === (m' %:* sSucc l %:+ sSucc l) `because` multSuccL m' (sSucc l) in succCong pf' `trans` sym sm'Em succPred n nonZero = case zeroOrSucc n of { IsZero -> absurd $ nonZero Refl IsSucc n' -> sym $ succCong $ predUnique n' n Refl } multEqCancelL n m l snmEsnl = multEqCancelR m l n $ multComm m (sSucc n) `trans` snmEsnl `trans` multComm (sSucc n) l sPred' pxy sn = coerce (succInj $ succCong $ predSucc (sPred' pxy sn)) (sPred sn)
+ Data.Type.Natural.Class.Arithmetic: class (SDecide nat, SNum nat, SEnum nat, SingKind nat, SingKind nat) => IsPeano nat
- Data.Type.Natural.Class.Arithmetic: minusCong :: n :~: m -> l :~: k -> (n :- l) :~: (m :- k)
+ Data.Type.Natural.Class.Arithmetic: minusCong :: n :~: m -> l :~: k -> (n - l) :~: (m - k)
- Data.Type.Natural.Class.Arithmetic: minusCongL :: n :~: m -> Sing k -> (n :- k) :~: (m :- k)
+ Data.Type.Natural.Class.Arithmetic: minusCongL :: n :~: m -> Sing k -> (n - k) :~: (m - k)
- Data.Type.Natural.Class.Arithmetic: minusCongR :: Sing k -> n :~: m -> (k :- n) :~: (k :- m)
+ Data.Type.Natural.Class.Arithmetic: minusCongR :: Sing k -> n :~: m -> (k - n) :~: (k - m)
- Data.Type.Natural.Class.Arithmetic: minusNilpotent :: IsPeano nat => Sing n -> (n :- n) :~: Zero nat
+ Data.Type.Natural.Class.Arithmetic: minusNilpotent :: IsPeano nat => Sing n -> (n - n) :~: Zero nat
- Data.Type.Natural.Class.Arithmetic: minusZero :: IsPeano nat => Sing n -> (n :- Zero nat) :~: n
+ Data.Type.Natural.Class.Arithmetic: minusZero :: IsPeano nat => Sing n -> (n - Zero nat) :~: n
- Data.Type.Natural.Class.Arithmetic: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :* m) :* l) :~: (n :* (m :* l))
+ Data.Type.Natural.Class.Arithmetic: multAssoc :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n * m) * l) :~: (n * (m * l))
- Data.Type.Natural.Class.Arithmetic: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n :* m) :~: (m :* n)
+ Data.Type.Natural.Class.Arithmetic: multComm :: IsPeano nat => Sing (n :: nat) -> Sing m -> (n * m) :~: (m * n)
- Data.Type.Natural.Class.Arithmetic: multCong :: n :~: m -> l :~: k -> (n :* l) :~: (m :* k)
+ Data.Type.Natural.Class.Arithmetic: multCong :: n :~: m -> l :~: k -> (n * l) :~: (m * k)
- Data.Type.Natural.Class.Arithmetic: multCongL :: n :~: m -> Sing k -> (n :* k) :~: (m :* k)
+ Data.Type.Natural.Class.Arithmetic: multCongL :: n :~: m -> Sing k -> (n * k) :~: (m * k)
- Data.Type.Natural.Class.Arithmetic: multCongR :: Sing k -> n :~: m -> (k :* n) :~: (k :* m)
+ Data.Type.Natural.Class.Arithmetic: multCongR :: Sing k -> n :~: m -> (k * n) :~: (k * m)
- Data.Type.Natural.Class.Arithmetic: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n :* m) :~: (Succ n :* l) -> m :~: l
+ Data.Type.Natural.Class.Arithmetic: multEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (Succ n * m) :~: (Succ n * l) -> m :~: l
- Data.Type.Natural.Class.Arithmetic: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* Succ l) :~: (m :* Succ l) -> n :~: m
+ Data.Type.Natural.Class.Arithmetic: multEqCancelR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * Succ l) :~: (m * Succ l) -> n :~: m
- Data.Type.Natural.Class.Arithmetic: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> n :~: Succ (Pred n)
+ Data.Type.Natural.Class.Arithmetic: multEqSuccElimL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> n :~: Succ (Pred n)
- Data.Type.Natural.Class.Arithmetic: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* m) :~: Succ l -> m :~: Succ (Pred m)
+ Data.Type.Natural.Class.Arithmetic: multEqSuccElimR :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * m) :~: Succ l -> m :~: Succ (Pred m)
- Data.Type.Natural.Class.Arithmetic: multOneL :: IsPeano nat => Sing n -> (One nat :* n) :~: n
+ Data.Type.Natural.Class.Arithmetic: multOneL :: IsPeano nat => Sing n -> (One nat * n) :~: n
- Data.Type.Natural.Class.Arithmetic: multOneR :: IsPeano nat => Sing n -> (n :* One nat) :~: n
+ Data.Type.Natural.Class.Arithmetic: multOneR :: IsPeano nat => Sing n -> (n * One nat) :~: n
- Data.Type.Natural.Class.Arithmetic: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :* (m :+ l)) :~: ((n :* m) :+ (n :* l))
+ Data.Type.Natural.Class.Arithmetic: multPlusDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n * (m + l)) :~: ((n * m) + (n * l))
- Data.Type.Natural.Class.Arithmetic: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n :* m) :~: ((n :* m) :+ m)
+ Data.Type.Natural.Class.Arithmetic: multSuccL :: IsPeano nat => Sing (n :: nat) -> Sing m -> (S n * m) :~: ((n * m) + m)
- Data.Type.Natural.Class.Arithmetic: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n :* S m) :~: ((n :* m) :+ (n :: nat))
+ Data.Type.Natural.Class.Arithmetic: multSuccR :: IsPeano nat => Sing n -> Sing m -> (n * S m) :~: ((n * m) + (n :: nat))
- Data.Type.Natural.Class.Arithmetic: multZeroL :: IsPeano nat => Sing n -> (Zero nat :* n) :~: Zero nat
+ Data.Type.Natural.Class.Arithmetic: multZeroL :: IsPeano nat => Sing n -> (Zero nat * n) :~: Zero nat
- Data.Type.Natural.Class.Arithmetic: multZeroR :: IsPeano nat => Sing n -> (n :* Zero nat) :~: Zero nat
+ Data.Type.Natural.Class.Arithmetic: multZeroR :: IsPeano nat => Sing n -> (n * Zero nat) :~: Zero nat
- Data.Type.Natural.Class.Arithmetic: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :+ l) :~: (n :+ (m :+ l))
+ Data.Type.Natural.Class.Arithmetic: plusAssoc :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) + l) :~: (n + (m + l))
- Data.Type.Natural.Class.Arithmetic: plusComm :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: ((m :: nat) :+ n)
+ Data.Type.Natural.Class.Arithmetic: plusComm :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: ((m :: nat) + n)
- Data.Type.Natural.Class.Arithmetic: plusCong :: n :~: m -> n' :~: m' -> (n :+ n') :~: (m :+ m')
+ Data.Type.Natural.Class.Arithmetic: plusCong :: n :~: m -> n' :~: m' -> (n + n') :~: (m + m')
- Data.Type.Natural.Class.Arithmetic: plusCongL :: n :~: m -> Sing k -> (n :+ k) :~: (m :+ k)
+ Data.Type.Natural.Class.Arithmetic: plusCongL :: n :~: m -> Sing k -> (n + k) :~: (m + k)
- Data.Type.Natural.Class.Arithmetic: plusCongR :: Sing k -> n :~: m -> (k :+ n) :~: (k :+ m)
+ Data.Type.Natural.Class.Arithmetic: plusCongR :: Sing k -> n :~: m -> (k + n) :~: (k + m)
- Data.Type.Natural.Class.Arithmetic: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ m) :~: (n :+ l) -> m :~: l
+ Data.Type.Natural.Class.Arithmetic: plusEqCancelL :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + m) :~: (n + l) -> m :~: l
- Data.Type.Natural.Class.Arithmetic: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ l) :~: (m :+ l) -> n :~: m
+ Data.Type.Natural.Class.Arithmetic: plusEqCancelR :: forall n m l. IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + l) :~: (m + l) -> n :~: m
- Data.Type.Natural.Class.Arithmetic: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> n :~: Zero nat
+ Data.Type.Natural.Class.Arithmetic: plusEqZeroL :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> n :~: Zero nat
- Data.Type.Natural.Class.Arithmetic: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n :+ m) :~: Zero nat -> m :~: Zero nat
+ Data.Type.Natural.Class.Arithmetic: plusEqZeroR :: IsPeano nat => Sing n -> Sing m -> (n + m) :~: Zero nat -> m :~: Zero nat
- Data.Type.Natural.Class.Arithmetic: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- m) :~: n
+ Data.Type.Natural.Class.Arithmetic: plusMinus :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - m) :~: n
- Data.Type.Natural.Class.Arithmetic: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n :+ m) :- n) :~: m
+ Data.Type.Natural.Class.Arithmetic: plusMinus' :: IsPeano nat => Sing (n :: nat) -> Sing m -> ((n + m) - n) :~: m
- Data.Type.Natural.Class.Arithmetic: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n :+ m) :* l) :~: ((n :* l) :+ (m :* l))
+ Data.Type.Natural.Class.Arithmetic: plusMultDistrib :: IsPeano nat => Sing (n :: nat) -> Sing m -> Sing l -> ((n + m) * l) :~: ((n * l) + (m * l))
- Data.Type.Natural.Class.Arithmetic: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n :+ m) :~: S (n :+ m :: nat)
+ Data.Type.Natural.Class.Arithmetic: plusSuccL :: IsPeano nat => Sing n -> Sing m -> (S n + m) :~: S (n + m :: nat)
- Data.Type.Natural.Class.Arithmetic: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n :+ S m) :~: S (n :+ m :: nat)
+ Data.Type.Natural.Class.Arithmetic: plusSuccR :: IsPeano nat => Sing n -> Sing m -> (n + S m) :~: S (n + m :: nat)
- Data.Type.Natural.Class.Arithmetic: plusZeroL :: IsPeano nat => Sing n -> (Zero nat :+ n) :~: n
+ Data.Type.Natural.Class.Arithmetic: plusZeroL :: IsPeano nat => Sing n -> (Zero nat + n) :~: n
- Data.Type.Natural.Class.Arithmetic: plusZeroR :: IsPeano nat => Sing n -> (n :+ Zero nat) :~: n
+ Data.Type.Natural.Class.Arithmetic: plusZeroR :: IsPeano nat => Sing n -> (n + Zero nat) :~: n
- Data.Type.Natural.Class.Arithmetic: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat :+ n)
+ Data.Type.Natural.Class.Arithmetic: succAndPlusOneL :: IsPeano nat => Sing n -> Succ n :~: (One nat + n)
- Data.Type.Natural.Class.Arithmetic: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n :+ One nat)
+ Data.Type.Natural.Class.Arithmetic: succAndPlusOneR :: IsPeano nat => Sing n -> Succ n :~: (n + One nat)
- Data.Type.Natural.Class.Order: [DiffNat] :: Sing n -> Sing m -> DiffNat n (n :+ m)
+ Data.Type.Natural.Class.Order: [DiffNat] :: Sing n -> Sing m -> DiffNat n (n + m)
- Data.Type.Natural.Class.Order: [LeqSucc] :: Sing n -> Sing m -> IsTrue (n :<= m) -> LeqView (Succ n) (Succ m)
+ Data.Type.Natural.Class.Order: [LeqSucc] :: Sing n -> Sing m -> IsTrue (n <= m) -> LeqView (Succ n) (Succ m)
- Data.Type.Natural.Class.Order: class (SOrd nat, IsPeano nat) => PeanoOrder nat where ltToNeq a b aLTb aEQb = eliminate $ start SLT === sCompare a b `because` sym aLTb === SEQ `because` eqlCmpEQ a b aEQb leqNeqToLT a b aLEQb aNEQb = either (absurd . aNEQb) id $ leqToCmp a b aLEQb succLeqToLT a b saLEQb = case leqWitness (sSucc a) b saLEQb of { DiffNat _ k -> let aLEQb = leqStep a b (sSucc k) $ start (a %:+ sSucc k) === sSucc (a %:+ k) `because` plusSuccR a k === sSucc a %:+ k `because` sym (plusSuccL a k) =~= b aNEQb aeqb = succNonCyclic k $ plusEqCancelL a (sSucc k) sZero $ start (a %:+ sSucc k) === sSucc (a %:+ k) `because` plusSuccR a k === (sSucc a) %:+ k `because` sym (plusSuccL a k) =~= b === a `because` sym aeqb === a %:+ sZero `because` sym (plusZeroR a) in leqNeqToLT a b aLEQb aNEQb } gtToLeq n m nGTm = ltToLeq m n $ start (sCompare m n) === sFlipOrdering (sCompare n m) `because` sym (flipCompare n m) === sFlipOrdering SGT `because` congFlipOrdering nGTm =~= SLT ltToSuccLeq n m nLTm = leqNeqToSuccLeq n m (ltToLeq n m nLTm) (ltToNeq n m nLTm) cmpZero sn = leqToLT sZero (sSucc sn) $ leqStep (sSucc sZero) (sSucc sn) sn $ start (sSucc sZero %:+ sn) === sSucc (sZero %:+ sn) `because` plusSuccL sZero sn === sSucc sn `because` succCong (plusZeroL sn) leqToGT a b sbLEQa = start (sCompare a b) === sFlipOrdering (sCompare b a) `because` sym (flipCompare b a) === sFlipOrdering SLT `because` congFlipOrdering (leqToLT b a sbLEQa) =~= SGT cmpZero' n = case zeroOrSucc n of { IsZero -> Left $ eqlCmpEQ sZero n Refl IsSucc n' -> Right $ cmpZero n' } zeroNoLT n eql = case cmpZero' n of { Left cmp0nEQ -> eliminate $ start SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare n sZero) `because` congFlipOrdering (sym eql) === sCompare sZero n `because` flipCompare n sZero === SEQ `because` cmp0nEQ Right cmp0nLT -> eliminate $ start SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare n sZero) `because` congFlipOrdering (sym eql) === sCompare sZero n `because` flipCompare n sZero === SLT `because` cmp0nLT } ltRightPredSucc a b aLTb = case zeroOrSucc b of { IsZero -> absurd $ zeroNoLT a aLTb IsSucc b' -> sym $ start (sSucc (sPred b)) =~= sSucc (sPred (sSucc b')) === sSucc b' `because` succCong (predSucc b') =~= b } cmpSucc n m = case sCompare n m of { SEQ -> let nEQm = eqToRefl n m Refl in sym $ eqlCmpEQ (sSucc n) (sSucc m) $ succCong nEQm SLT -> case leqWitness (sSucc n) m $ ltToSuccLeq n m Refl of { DiffNat _ k -> sym $ succLeqToLT (sSucc n) (sSucc m) $ leqStep (sSucc (sSucc n)) (sSucc m) k $ start (sSucc (sSucc n) %:+ k) === sSucc (sSucc n %:+ k) `because` plusSuccL (sSucc n) k =~= sSucc m } SGT -> case leqWitness (sSucc m) n $ ltToSuccLeq m n (sym $ flipCompare n m) of { DiffNat _ k -> let pf = (succLeqToLT (sSucc m) (sSucc n) $ leqStep (sSucc (sSucc m)) (sSucc n) k $ start (sSucc (sSucc m) %:+ k) === sSucc (sSucc m %:+ k) `because` plusSuccL (sSucc m) k =~= sSucc n) in start (sCompare n m) =~= SGT =~= sFlipOrdering SLT === sFlipOrdering (sCompare (sSucc m) (sSucc n)) `because` congFlipOrdering (sym pf) === sCompare (sSucc n) (sSucc m) `because` flipCompare (sSucc m) (sSucc n) } } ltSucc = proofLTSucc . induction base step where base :: LTSucc (Zero nat) base = LTSucc $ cmpZero (sZero :: Sing (Zero nat)) step :: Sing (n :: nat) -> LTSucc n -> LTSucc (Succ n) step n (LTSucc ih) = LTSucc $ start (sCompare (sSucc n) (sSucc (sSucc n))) === sCompare n (sSucc n) `because` sym (cmpSucc n (sSucc n)) === SLT `because` ih cmpSuccStepR = proofCmpSuccStepR . induction base step where base :: CmpSuccStepR (Zero nat) base = CmpSuccStepR $ \ m _ -> cmpZero m step :: Sing (n :: nat) -> CmpSuccStepR n -> CmpSuccStepR (Succ n) step n (CmpSuccStepR ih) = CmpSuccStepR $ \ m snltm -> case zeroOrSucc m of { IsZero -> absurd $ zeroNoLT (sSucc n) snltm IsSucc m' -> let nLTm' = trans (cmpSucc n m') snltm in start (sCompare (sSucc n) (sSucc m)) =~= sCompare (sSucc n) (sSucc (sSucc m')) === sCompare n (sSucc m') `because` sym (cmpSucc n (sSucc m')) === SLT `because` ih m' nLTm' } ltSuccLToLT n m snLTm = case zeroOrSucc m of { IsZero -> absurd $ zeroNoLT (sSucc n) snLTm IsSucc m' -> let nLTm = cmpSucc n m' `trans` snLTm in start (sCompare n (sSucc m')) === SLT `because` cmpSuccStepR n m' nLTm } leqToLT n m snLEQm = case leqToCmp (sSucc n) m snLEQm of { Left eql -> withRefl eql $ start (sCompare n m) =~= sCompare n (sSucc n) === SLT `because` ltSucc n Right nLTm -> ltSuccLToLT n m nLTm } leqZero sn = case zeroOrSucc sn of { IsZero -> leqRefl sn IsSucc pn -> ltToLeq sZero sn $ cmpZero pn } leqSucc n m nLEQm = case leqToCmp n m nLEQm of { Left eql -> withRefl eql $ leqRefl (sSucc n) Right nLTm -> ltToLeq (sSucc n) (sSucc m) $ sym (cmpSucc n m) `trans` nLTm } fromLeqView (LeqZero n) = leqZero n fromLeqView (LeqSucc n m nLEQm) = leqSucc n m nLEQm leqViewRefl = proofLeqViewRefl . induction base step where base :: LeqViewRefl (Zero nat) base = LeqViewRefl $ LeqZero sZero step :: Sing (n :: nat) -> LeqViewRefl n -> LeqViewRefl (Succ n) step n (LeqViewRefl nLEQn) = LeqViewRefl $ LeqSucc n n (fromLeqView nLEQn) viewLeq n m nLEQm = case (zeroOrSucc n, leqToCmp n m nLEQm) of { (IsZero, _) -> LeqZero m (_, Left Refl) -> leqViewRefl n (IsSucc n', Right nLTm) -> let sm'EQm = ltRightPredSucc n m nLTm m' = sPred m n'LTm' = cmpSucc n' m' `trans` compareCongR n (sym sm'EQm) `trans` nLTm in coerce (sym sm'EQm) $ LeqSucc n' m' $ ltToLeq n' m' n'LTm' } leqWitness = leqWitPf . induction base step where base :: LeqWitPf (Zero nat) base = LeqWitPf $ \ sm _ -> coerce (plusZeroL sm) $ DiffNat sZero sm step :: Sing (n :: nat) -> LeqWitPf n -> LeqWitPf (Succ n) step (n :: Sing n) (LeqWitPf ih) = LeqWitPf $ \ m snLEQm -> case viewLeq (sSucc n) m snLEQm of { LeqZero _ -> absurd $ succNonCyclic n Refl LeqSucc (_ :: Sing n') pm nLEQpm -> succDiffNat n pm $ ih pm $ coerceLeqL (succInj Refl :: n' :~: n) pm nLEQpm } leqStep = leqStepPf . induction base step where base :: LeqStepPf (Zero nat) base = LeqStepPf $ \ k _ _ -> leqZero k step :: Sing (n :: nat) -> LeqStepPf n -> LeqStepPf (Succ n) step n (LeqStepPf ih) = LeqStepPf $ \ k l snPlEqk -> let kEQspk = start k === sSucc n %:+ l `because` sym snPlEqk === sSucc (n %:+ l) `because` plusSuccL n l pk = n %:+ l in coerceLeqR (sSucc n) (sym kEQspk) $ leqSucc n pk $ ih pk l Refl leqNeqToSuccLeq n m nLEQm nNEQm = case leqWitness n m nLEQm of { DiffNat _ k -> case zeroOrSucc k of { IsZero -> absurd $ nNEQm $ sym $ plusZeroR n IsSucc k' -> leqStep (sSucc n) m k' $ start (sSucc n %:+ k') === sSucc (n %:+ k') `because` plusSuccL n k' === n %:+ sSucc k' `because` sym (plusSuccR n k') =~= m } } leqRefl sn = leqStep sn sn sZero (plusZeroR sn) leqSuccStepR n m nLEQm = case leqWitness n m nLEQm of { DiffNat _ k -> leqStep n (sSucc m) (sSucc k) $ start (n %:+ sSucc k) === sSucc (n %:+ k) `because` plusSuccR n k =~= sSucc m } leqSuccStepL n m snLEQm = leqTrans n (sSucc n) m (leqSuccStepR n n $ leqRefl n) snLEQm leqReflexive n _ Refl = leqRefl n leqTrans n m k nLEm mLEk = case leqWitness n m nLEm of { DiffNat _ mMn -> case leqWitness m k mLEk of { DiffNat _ kMn -> leqStep n k (mMn %:+ kMn) (sym $ plusAssoc n mMn kMn) } } leqAntisymm n m nLEm mLEn = case (leqWitness n m nLEm, leqWitness m n mLEn) of { (DiffNat _ mMn, DiffNat _ nMm) -> let pEQ0 = plusEqCancelL n (mMn %:+ nMm) sZero $ start (n %:+ (mMn %:+ nMm)) === (n %:+ mMn) %:+ nMm `because` sym (plusAssoc n mMn nMm) =~= m %:+ nMm =~= n === n %:+ sZero `because` sym (plusZeroR n) nMmEQ0 = plusEqZeroL mMn nMm pEQ0 in sym $ start m =~= n %:+ mMn === n %:+ sZero `because` plusCongR n nMmEQ0 === n `because` plusZeroR n } plusMonotone n m l k nLEm lLEk = case (leqWitness n m nLEm, leqWitness l k lLEk) of { (DiffNat _ mMINn, DiffNat _ kMINl) -> let r = mMINn %:+ kMINl in leqStep (n %:+ l) (m %:+ k) r $ start (n %:+ l %:+ r) === n %:+ (l %:+ r) `because` plusAssoc n l r =~= n %:+ (l %:+ (mMINn %:+ kMINl)) === n %:+ (l %:+ (kMINl %:+ mMINn)) `because` plusCongR n (plusCongR l (plusComm mMINn kMINl)) === n %:+ ((l %:+ kMINl) %:+ mMINn) `because` plusCongR n (sym $ plusAssoc l kMINl mMINn) =~= n %:+ (k %:+ mMINn) === n %:+ (mMINn %:+ k) `because` plusCongR n (plusComm k mMINn) === n %:+ mMINn %:+ k `because` sym (plusAssoc n mMINn k) =~= m %:+ k } leqZeroElim n nLE0 = case viewLeq n sZero nLE0 of { LeqZero _ -> Refl LeqSucc _ pZ _ -> absurd $ succNonCyclic pZ Refl } plusMonotoneL n m l leq = plusMonotone n m l l leq (leqRefl l) plusMonotoneR n m l leq = plusMonotone n n m l (leqRefl n) leq plusLeqL n m = leqStep n (n %:+ m) m Refl plusLeqR n m = leqStep m (n %:+ m) n $ plusComm m n plusCancelLeqR n m l nlLEQml = case leqWitness (n %:+ l) (m %:+ l) nlLEQml of { DiffNat _ k -> let pf = plusEqCancelR (n %:+ k) m l $ start ((n %:+ k) %:+ l) === n %:+ (k %:+ l) `because` plusAssoc n k l === n %:+ (l %:+ k) `because` plusCongR n (plusComm k l) === n %:+ l %:+ k `because` sym (plusAssoc n l k) =~= m %:+ l in leqStep n m k pf } plusCancelLeqL n m l nmLEQnl = plusCancelLeqR m l n $ coerceLeqL (plusComm n m) (l %:+ n) $ coerceLeqR (n %:+ m) (plusComm n l) nmLEQnl succLeqZeroAbsurd n leq = succNonCyclic n (leqZeroElim (sSucc n) leq) succLeqZeroAbsurd' n = case sSucc n %:<= sZero of { STrue -> absurd $ succLeqZeroAbsurd n Witness SFalse -> Refl } succLeqAbsurd n snLEQn = eliminate $ start SLT === sCompare n n `because` sym (succLeqToLT n n snLEQn) === SEQ `because` eqlCmpEQ n n Refl succLeqAbsurd' n = case sSucc n %:<= n of { STrue -> absurd $ succLeqAbsurd n Witness SFalse -> Refl } notLeqToLeq n m = case sCompare n m of { SLT -> eliminate $ ltToLeq n m Refl SEQ -> eliminate $ leqReflexive n m $ eqToRefl n m Refl SGT -> gtToLeq n m Refl } leqSucc' n m = case n %:<= m of { STrue -> withWitness (leqSucc n m Witness) Refl SFalse -> case sSucc n %:<= sSucc m of { SFalse -> Refl STrue -> case viewLeq (sSucc n) (sSucc m) Witness of { LeqZero _ -> absurd $ succNonCyclic n Refl LeqSucc n' m' Witness -> eliminate $ start STrue =~= (n' %:<= m') === (n %:<= m) `because` sLeqCong (succInj' n' n Refl) (succInj' m' m Refl) =~= SFalse } } } leqToMin n m nLEQm = leqAntisymm (sMin n m) n (minLeqL n m) (minLargest n n m (leqRefl n) nLEQm) geqToMin n m mLEQn = leqAntisymm (sMin n m) m (minLeqR n m) (minLargest m n m mLEQn (leqRefl m)) minComm n m = case n %:<= m of { STrue -> start (sMin n m) === n `because` leqToMin n m Witness === sMin m n `because` sym (geqToMin m n Witness) SFalse -> start (sMin n m) === m `because` geqToMin n m (notLeqToLeq n m) === sMin m n `because` sym (leqToMin m n $ notLeqToLeq n m) } minLeqL n m = case n %:<= m of { STrue -> leqReflexive (sMin n m) n $ leqToMin n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans (sMin n m) m n (leqReflexive (sMin n m) m (geqToMin n m mLEQn)) $ mLEQn } minLeqR n m = leqTrans (sMin n m) (sMin m n) m (leqReflexive (sMin n m) (sMin m n) $ minComm n m) (minLeqL m n) minLargest l n m lLEQn lLEQm = withSingI l $ withSingI n $ withSingI m $ withSingI (sMin n m) $ case n %:<= m of { STrue -> leqTrans l n (sMin n m) lLEQn $ leqReflexive sing sing $ sym $ leqToMin n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans l m (sMin n m) lLEQm $ leqReflexive sing sing $ sym $ geqToMin n m mLEQn } leqToMax n m nLEQm = leqAntisymm (sMax n m) m (maxLeast m n m nLEQm (leqRefl m)) (maxLeqR n m) geqToMax n m mLEQn = leqAntisymm (sMax n m) n (maxLeast n n m (leqRefl n) mLEQn) (maxLeqL n m) maxComm n m = case n %:<= m of { STrue -> start (sMax n m) === m `because` leqToMax n m Witness === sMax m n `because` sym (geqToMax m n Witness) SFalse -> start (sMax n m) === n `because` geqToMax n m (notLeqToLeq n m) === sMax m n `because` sym (leqToMax m n $ notLeqToLeq n m) } maxLeqR n m = case n %:<= m of { STrue -> leqReflexive m (sMax n m) $ sym $ leqToMax n m Witness SFalse -> let mLEQn = notLeqToLeq n m in leqTrans m n (sMax n m) mLEQn (leqReflexive n (sMax n m) (sym $ geqToMax n m mLEQn)) } maxLeqL n m = leqTrans n (sMax m n) (sMax n m) (maxLeqR m n) (leqReflexive (sMax m n) (sMax n m) $ maxComm m n) maxLeast l n m lLEQn lLEQm = withSingI l $ withSingI n $ withSingI m $ withSingI (sMax n m) $ case n %:<= m of { STrue -> leqTrans (sMax n m) m l (leqReflexive sing sing $ leqToMax n m Witness) lLEQm SFalse -> let mLEQn = notLeqToLeq n m in leqTrans (sMax n m) n l (leqReflexive sing sing $ geqToMax n m mLEQn) lLEQn } lneqToLT n m nLNEm = succLeqToLT n m $ coerce (lneqSuccLeq n m) nLNEm ltToLneq n m nLTm = coerce (sym $ lneqSuccLeq n m) $ ltToSuccLeq n m nLTm lneqZero n = ltToLneq sZero (sSucc n) $ cmpZero n lneqSucc n = ltToLneq n (sSucc n) $ ltSucc n succLneqSucc n m = start (n %:< m) === (sSucc n %:<= m) `because` lneqSuccLeq n m === (sSucc (sSucc n) %:<= sSucc m) `because` leqSucc' (sSucc n) m === (sSucc n %:< sSucc m) `because` sym (lneqSuccLeq (sSucc n) (sSucc m)) lneqRightPredSucc n m nLNEQm = ltRightPredSucc n m $ lneqToLT n m nLNEQm lneqSuccStepL n m snLNEQm = coerce (sym $ lneqSuccLeq n m) $ leqSuccStepL (sSucc n) m $ coerce (lneqSuccLeq (sSucc n) m) snLNEQm lneqSuccStepR n m nLNEQm = coerce (sym $ lneqSuccLeq n (sSucc m)) $ leqSuccStepR (sSucc n) m $ coerce (lneqSuccLeq n m) nLNEQm plusStrictMonotone n m l k nLNm lLNk = coerce (sym $ lneqSuccLeq (n %:+ l) (m %:+ k)) $ flip coerceLeqL (m %:+ k) (plusSuccL n l) $ plusMonotone (sSucc n) m l k (coerce (lneqSuccLeq n m) nLNm) (leqTrans l (sSucc l) k (leqSuccStepR l l (leqRefl l)) $ coerce (lneqSuccLeq l k) lLNk) maxZeroL n = leqToMax sZero n (leqZero n) maxZeroR n = geqToMax n sZero (leqZero n) minZeroL n = leqToMin sZero n (leqZero n) minZeroR n = geqToMin n sZero (leqZero n) minusSucc n m mLEQn = case leqWitness m n mLEQn of { DiffNat _ k -> start (sSucc n %:- m) =~= sSucc (m %:+ k) %:- m === (m %:+ sSucc k) %:- m `because` minusCongL (sym $ plusSuccR m k) m === (sSucc k %:+ m) %:- m `because` minusCongL (plusComm m (sSucc k)) m === sSucc k `because` plusMinus (sSucc k) m === sSucc (k %:+ m %:- m) `because` succCong (sym $ plusMinus k m) === sSucc (m %:+ k %:- m) `because` succCong (minusCongL (plusComm k m) m) =~= sSucc (n %:- m) } lneqZeroAbsurd n leq = succLeqZeroAbsurd n (coerce (lneqSuccLeq n sZero) leq) minusPlus n m mLEQn = case leqWitness m n mLEQn of { DiffNat _ k -> start (n %:- m %:+ m) =~= m %:+ k %:- m %:+ m === k %:+ m %:- m %:+ m `because` plusCongL (minusCongL (plusComm m k) m) m === k %:+ m `because` plusCongL (plusMinus k m) m === m %:+ k `because` plusComm k m =~= n }
+ Data.Type.Natural.Class.Order: class (SOrd nat, IsPeano nat) => PeanoOrder nat
- Data.Type.Natural.Class.Order: cmpSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare n m :~: LT -> Compare n (Succ m) :~: LT
+ Data.Type.Natural.Class.Order: cmpSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare n m :~: 'LT -> Compare n (Succ m) :~: 'LT
- Data.Type.Natural.Class.Order: cmpZero :: PeanoOrder nat => Sing a -> Compare (Zero nat) (Succ a) :~: LT
+ Data.Type.Natural.Class.Order: cmpZero :: PeanoOrder nat => Sing a -> Compare (Zero nat) (Succ a) :~: 'LT
- Data.Type.Natural.Class.Order: cmpZero' :: PeanoOrder nat => Sing a -> Either (Compare (Zero nat) a :~: EQ) (Compare (Zero nat) a :~: LT)
+ Data.Type.Natural.Class.Order: cmpZero' :: PeanoOrder nat => Sing a -> Either (Compare (Zero nat) a :~: 'EQ) (Compare (Zero nat) a :~: 'LT)
- Data.Type.Natural.Class.Order: coerceLeqL :: forall (n :: nat) m l. IsPeano nat => n :~: m -> Sing l -> IsTrue (n :<= l) -> IsTrue (m :<= l)
+ Data.Type.Natural.Class.Order: coerceLeqL :: forall (n :: nat) m l. IsPeano nat => n :~: m -> Sing l -> IsTrue (n <= l) -> IsTrue (m <= l)
- Data.Type.Natural.Class.Order: coerceLeqR :: forall (n :: nat) m l. IsPeano nat => Sing l -> n :~: m -> IsTrue (l :<= n) -> IsTrue (l :<= m)
+ Data.Type.Natural.Class.Order: coerceLeqR :: forall (n :: nat) m l. IsPeano nat => Sing l -> n :~: m -> IsTrue (l <= n) -> IsTrue (l <= m)
- Data.Type.Natural.Class.Order: eqToRefl :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: EQ -> a :~: b
+ Data.Type.Natural.Class.Order: eqToRefl :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'EQ -> a :~: b
- Data.Type.Natural.Class.Order: eqlCmpEQ :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> a :~: b -> Compare a b :~: EQ
+ Data.Type.Natural.Class.Order: eqlCmpEQ :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> a :~: b -> Compare a b :~: 'EQ
- Data.Type.Natural.Class.Order: fromLeqView :: PeanoOrder nat => LeqView (n :: nat) m -> IsTrue (n :<= m)
+ Data.Type.Natural.Class.Order: fromLeqView :: PeanoOrder nat => LeqView (n :: nat) m -> IsTrue (n <= m)
- Data.Type.Natural.Class.Order: geqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Max n m :~: n
+ Data.Type.Natural.Class.Order: geqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Max n m :~: n
- Data.Type.Natural.Class.Order: geqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Min n m :~: m
+ Data.Type.Natural.Class.Order: geqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Min n m :~: m
- Data.Type.Natural.Class.Order: gtToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: GT -> IsTrue (b :<= a)
+ Data.Type.Natural.Class.Order: gtToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'GT -> IsTrue (b <= a)
- Data.Type.Natural.Class.Order: leqAntisymm :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (m :<= n) -> n :~: m
+ Data.Type.Natural.Class.Order: leqAntisymm :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (m <= n) -> n :~: m
- Data.Type.Natural.Class.Order: leqNeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a :<= b) -> (a :~: b -> Void) -> Compare a b :~: LT
+ Data.Type.Natural.Class.Order: leqNeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> (a :~: b -> Void) -> Compare a b :~: 'LT
- Data.Type.Natural.Class.Order: leqNeqToSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> (n :~: m -> Void) -> IsTrue (Succ n :<= m)
+ Data.Type.Natural.Class.Order: leqNeqToSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> (n :~: m -> Void) -> IsTrue (Succ n <= m)
- Data.Type.Natural.Class.Order: leqRefl :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n :<= n)
+ Data.Type.Natural.Class.Order: leqRefl :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n <= n)
- Data.Type.Natural.Class.Order: leqReflexive :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n :<= m)
+ Data.Type.Natural.Class.Order: leqReflexive :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n <= m)
- Data.Type.Natural.Class.Order: leqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :<= m) :~: (m :>= n)
+ Data.Type.Natural.Class.Order: leqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n <= m) :~: (m >= n)
- Data.Type.Natural.Class.Order: leqStep :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> (n :+ l) :~: m -> IsTrue (n :<= m)
+ Data.Type.Natural.Class.Order: leqStep :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> (n + l) :~: m -> IsTrue (n <= m)
- Data.Type.Natural.Class.Order: leqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (Succ n :<= Succ m)
+ Data.Type.Natural.Class.Order: leqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (Succ n <= Succ m)
- Data.Type.Natural.Class.Order: leqSucc' :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :<= m) :~: (Succ n :<= Succ m)
+ Data.Type.Natural.Class.Order: leqSucc' :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n <= m) :~: (Succ n <= Succ m)
- Data.Type.Natural.Class.Order: leqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n :<= m) -> IsTrue (n :<= m)
+ Data.Type.Natural.Class.Order: leqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n <= m) -> IsTrue (n <= m)
- Data.Type.Natural.Class.Order: leqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (n :<= Succ m)
+ Data.Type.Natural.Class.Order: leqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (n <= Succ m)
- Data.Type.Natural.Class.Order: leqToCmp :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a :<= b) -> Either (a :~: b) (Compare a b :~: LT)
+ Data.Type.Natural.Class.Order: leqToCmp :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> Either (a :~: b) (Compare a b :~: 'LT)
- Data.Type.Natural.Class.Order: leqToGT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ b :<= a) -> Compare a b :~: GT
+ Data.Type.Natural.Class.Order: leqToGT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ b <= a) -> Compare a b :~: 'GT
- Data.Type.Natural.Class.Order: leqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ a :<= b) -> Compare a b :~: LT
+ Data.Type.Natural.Class.Order: leqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (Succ a <= b) -> Compare a b :~: 'LT
- Data.Type.Natural.Class.Order: leqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Max n m :~: m
+ Data.Type.Natural.Class.Order: leqToMax :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Max n m :~: m
- Data.Type.Natural.Class.Order: leqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Min n m :~: n
+ Data.Type.Natural.Class.Order: leqToMin :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Min n m :~: n
- Data.Type.Natural.Class.Order: leqTrans :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n :<= m) -> IsTrue (m :<= l) -> IsTrue (n :<= l)
+ Data.Type.Natural.Class.Order: leqTrans :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n <= m) -> IsTrue (m <= l) -> IsTrue (n <= l)
- Data.Type.Natural.Class.Order: leqWitness :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> DiffNat n m
+ Data.Type.Natural.Class.Order: leqWitness :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> DiffNat n m
- Data.Type.Natural.Class.Order: leqZero :: PeanoOrder nat => Sing n -> IsTrue (Zero nat :<= n)
+ Data.Type.Natural.Class.Order: leqZero :: PeanoOrder nat => Sing n -> IsTrue (Zero nat <= n)
- Data.Type.Natural.Class.Order: leqZeroElim :: PeanoOrder nat => Sing n -> IsTrue (n :<= Zero nat) -> n :~: Zero nat
+ Data.Type.Natural.Class.Order: leqZeroElim :: PeanoOrder nat => Sing n -> IsTrue (n <= Zero nat) -> n :~: Zero nat
- Data.Type.Natural.Class.Order: lneqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :< m) :~: (m :> n)
+ Data.Type.Natural.Class.Order: lneqReversed :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n < m) :~: (m > n)
- Data.Type.Natural.Class.Order: lneqRightPredSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m) -> m :~: Succ (Pred m)
+ Data.Type.Natural.Class.Order: lneqRightPredSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> m :~: Succ (Pred m)
- Data.Type.Natural.Class.Order: lneqSucc :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n :< Succ n)
+ Data.Type.Natural.Class.Order: lneqSucc :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (n < Succ n)
- Data.Type.Natural.Class.Order: lneqSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n :< m) :~: (Succ n :<= m)
+ Data.Type.Natural.Class.Order: lneqSuccLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> (n < m) :~: (Succ n <= m)
- Data.Type.Natural.Class.Order: lneqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n :< m) -> IsTrue (n :< m)
+ Data.Type.Natural.Class.Order: lneqSuccStepL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Succ n < m) -> IsTrue (n < m)
- Data.Type.Natural.Class.Order: lneqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :< m) -> IsTrue (n :< Succ m)
+ Data.Type.Natural.Class.Order: lneqSuccStepR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n < m) -> IsTrue (n < Succ m)
- Data.Type.Natural.Class.Order: lneqToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m) -> Compare n m :~: LT
+ Data.Type.Natural.Class.Order: lneqToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m) -> Compare n m :~: 'LT
- Data.Type.Natural.Class.Order: lneqZero :: PeanoOrder nat => Sing (a :: nat) -> IsTrue (Zero nat :< Succ a)
+ Data.Type.Natural.Class.Order: lneqZero :: PeanoOrder nat => Sing (a :: nat) -> IsTrue (Zero nat < Succ a)
- Data.Type.Natural.Class.Order: lneqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (n :< Zero nat) -> Void
+ Data.Type.Natural.Class.Order: lneqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (n < Zero nat) -> Void
- Data.Type.Natural.Class.Order: ltRightPredSucc :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> b :~: Succ (Pred b)
+ Data.Type.Natural.Class.Order: ltRightPredSucc :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> b :~: Succ (Pred b)
- Data.Type.Natural.Class.Order: ltSucc :: PeanoOrder nat => Sing (a :: nat) -> Compare a (Succ a) :~: LT
+ Data.Type.Natural.Class.Order: ltSucc :: PeanoOrder nat => Sing (a :: nat) -> Compare a (Succ a) :~: 'LT
- Data.Type.Natural.Class.Order: ltSuccLToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare (Succ n) m :~: LT -> Compare n m :~: LT
+ Data.Type.Natural.Class.Order: ltSuccLToLT :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Compare (Succ n) m :~: 'LT -> Compare n m :~: 'LT
- Data.Type.Natural.Class.Order: ltToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> IsTrue (a :<= b)
+ Data.Type.Natural.Class.Order: ltToLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> IsTrue (a <= b)
- Data.Type.Natural.Class.Order: ltToLneq :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> Compare n m :~: LT -> IsTrue (n :< m)
+ Data.Type.Natural.Class.Order: ltToLneq :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> Compare n m :~: 'LT -> IsTrue (n < m)
- Data.Type.Natural.Class.Order: ltToNeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> a :~: b -> Void
+ Data.Type.Natural.Class.Order: ltToNeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> a :~: b -> Void
- Data.Type.Natural.Class.Order: ltToSuccLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: LT -> IsTrue (Succ a :<= b)
+ Data.Type.Natural.Class.Order: ltToSuccLeq :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT -> IsTrue (Succ a <= b)
- Data.Type.Natural.Class.Order: maxLeast :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (n :<= l) -> IsTrue (m :<= l) -> IsTrue (Max n m :<= l)
+ Data.Type.Natural.Class.Order: maxLeast :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (n <= l) -> IsTrue (m <= l) -> IsTrue (Max n m <= l)
- Data.Type.Natural.Class.Order: maxLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= Max n m)
+ Data.Type.Natural.Class.Order: maxLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= Max n m)
- Data.Type.Natural.Class.Order: maxLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= Max n m)
+ Data.Type.Natural.Class.Order: maxLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= Max n m)
- Data.Type.Natural.Class.Order: minLargest :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (l :<= n) -> IsTrue (l :<= m) -> IsTrue (l :<= Min n m)
+ Data.Type.Natural.Class.Order: minLargest :: PeanoOrder nat => Sing (l :: nat) -> Sing n -> Sing m -> IsTrue (l <= n) -> IsTrue (l <= m) -> IsTrue (l <= Min n m)
- Data.Type.Natural.Class.Order: minLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= n)
+ Data.Type.Natural.Class.Order: minLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= n)
- Data.Type.Natural.Class.Order: minLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= m)
+ Data.Type.Natural.Class.Order: minLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= m)
- Data.Type.Natural.Class.Order: minPlusTruncMinus :: (PeanoOrder nat) => Sing (n :: nat) -> Sing (m :: nat) -> (Min n m :+ (n :-. m)) :~: n
+ Data.Type.Natural.Class.Order: minPlusTruncMinus :: (PeanoOrder nat) => Sing (n :: nat) -> Sing (m :: nat) -> (Min n m + (n -. m)) :~: n
- Data.Type.Natural.Class.Order: minusPlus :: forall (n :: nat) m. (PeanoOrder nat, PeanoOrder nat) => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> ((n :- m) :+ m) :~: n
+ Data.Type.Natural.Class.Order: minusPlus :: forall (n :: nat) m. (PeanoOrder nat, PeanoOrder nat) => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> ((n - m) + m) :~: n
- Data.Type.Natural.Class.Order: minusSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> (Succ n :- m) :~: Succ (n :- m)
+ Data.Type.Natural.Class.Order: minusSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> (Succ n - m) :~: Succ (n - m)
- Data.Type.Natural.Class.Order: notLeqToLeq :: (PeanoOrder nat, (n :<= m) ~ False) => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n)
+ Data.Type.Natural.Class.Order: notLeqToLeq :: (PeanoOrder nat, ((n <= m) ~ 'False)) => Sing (n :: nat) -> Sing m -> IsTrue (m <= n)
- Data.Type.Natural.Class.Order: plusCancelLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n :+ m) :<= (n :+ l)) -> IsTrue (m :<= l)
+ Data.Type.Natural.Class.Order: plusCancelLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + m) <= (n + l)) -> IsTrue (m <= l)
- Data.Type.Natural.Class.Order: plusCancelLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n :+ l) :<= (m :+ l)) -> IsTrue (n :<= m)
+ Data.Type.Natural.Class.Order: plusCancelLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> IsTrue ((n + l) <= (m + l)) -> IsTrue (n <= m)
- Data.Type.Natural.Class.Order: plusLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= (n :+ m))
+ Data.Type.Natural.Class.Order: plusLeqL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= (n + m))
- Data.Type.Natural.Class.Order: plusLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= (n :+ m))
+ Data.Type.Natural.Class.Order: plusLeqR :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= (n + m))
- Data.Type.Natural.Class.Order: plusMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n :<= m) -> IsTrue (l :<= k) -> IsTrue ((n :+ l) :<= (m :+ k))
+ Data.Type.Natural.Class.Order: plusMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n <= m) -> IsTrue (l <= k) -> IsTrue ((n + l) <= (m + k))
- Data.Type.Natural.Class.Order: plusMonotoneL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n :<= m) -> IsTrue ((n :+ l) :<= (m :+ l))
+ Data.Type.Natural.Class.Order: plusMonotoneL :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n <= m) -> IsTrue ((n + l) <= (m + l))
- Data.Type.Natural.Class.Order: plusMonotoneR :: PeanoOrder nat => Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m :<= l) -> IsTrue ((n :+ m) :<= (n :+ l))
+ Data.Type.Natural.Class.Order: plusMonotoneR :: PeanoOrder nat => Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m <= l) -> IsTrue ((n + m) <= (n + l))
- Data.Type.Natural.Class.Order: plusStrictMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n :< m) -> IsTrue (l :< k) -> IsTrue ((n :+ l) :< (m :+ k))
+ Data.Type.Natural.Class.Order: plusStrictMonotone :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing l -> Sing k -> IsTrue (n < m) -> IsTrue (l < k) -> IsTrue ((n + l) < (m + k))
- Data.Type.Natural.Class.Order: sFlipOrdering :: forall (t_aTvV :: Ordering). Sing t_aTvV -> Sing (Apply FlipOrderingSym0 t_aTvV :: Ordering)
+ Data.Type.Natural.Class.Order: sFlipOrdering :: forall (t_aQLG :: Ordering). Sing t_aQLG -> Sing (Apply FlipOrderingSym0 t_aQLG :: Ordering)
- Data.Type.Natural.Class.Order: sLeqCong :: a :~: b -> c :~: d -> (a :<= c) :~: (b :<= d)
+ Data.Type.Natural.Class.Order: sLeqCong :: a :~: b -> c :~: d -> (a <= c) :~: (b <= d)
- Data.Type.Natural.Class.Order: sLeqCongL :: a :~: b -> Sing c -> (a :<= c) :~: (b :<= c)
+ Data.Type.Natural.Class.Order: sLeqCongL :: a :~: b -> Sing c -> (a <= c) :~: (b <= c)
- Data.Type.Natural.Class.Order: sLeqCongR :: Sing a -> b :~: c -> (a :<= b) :~: (a :<= c)
+ Data.Type.Natural.Class.Order: sLeqCongR :: Sing a -> b :~: c -> (a <= b) :~: (a <= c)
- Data.Type.Natural.Class.Order: succLeqAbsurd :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (S n :<= n) -> Void
+ Data.Type.Natural.Class.Order: succLeqAbsurd :: PeanoOrder nat => Sing (n :: nat) -> IsTrue (S n <= n) -> Void
- Data.Type.Natural.Class.Order: succLeqAbsurd' :: PeanoOrder nat => Sing (n :: nat) -> (S n :<= n) :~: False
+ Data.Type.Natural.Class.Order: succLeqAbsurd' :: PeanoOrder nat => Sing (n :: nat) -> (S n <= n) :~: 'False
- Data.Type.Natural.Class.Order: succLeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (S a :<= b) -> Compare a b :~: LT
+ Data.Type.Natural.Class.Order: succLeqToLT :: PeanoOrder nat => Sing (a :: nat) -> Sing b -> IsTrue (S a <= b) -> Compare a b :~: 'LT
- Data.Type.Natural.Class.Order: succLeqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (S n :<= Zero nat) -> Void
+ Data.Type.Natural.Class.Order: succLeqZeroAbsurd :: PeanoOrder nat => Sing n -> IsTrue (S n <= Zero nat) -> Void
- Data.Type.Natural.Class.Order: succLeqZeroAbsurd' :: PeanoOrder nat => Sing n -> (S n :<= Zero nat) :~: False
+ Data.Type.Natural.Class.Order: succLeqZeroAbsurd' :: PeanoOrder nat => Sing n -> (S n <= Zero nat) :~: 'False
- Data.Type.Natural.Class.Order: succLneqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> (n :< m) :~: (Succ n :< Succ m)
+ Data.Type.Natural.Class.Order: succLneqSucc :: PeanoOrder nat => Sing (n :: nat) -> Sing (m :: nat) -> (n < m) :~: (Succ n < Succ m)
- Data.Type.Natural.Class.Order: truncMinusLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue ((n :-. m) :<= n)
+ Data.Type.Natural.Class.Order: truncMinusLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue ((n -. m) <= n)
- Data.Type.Natural.Class.Order: type (:-.) n m = Subt n m (m :<= n)
+ Data.Type.Natural.Class.Order: type (*@#@$$$) a_al82 b_al83 = (:*$$$) a_al82 b_al83
- Data.Type.Natural.Class.Order: viewLeq :: forall n m. PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> LeqView n m
+ Data.Type.Natural.Class.Order: viewLeq :: forall n m. PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> LeqView n m
- Data.Type.Natural.Class.Order: zeroNoLT :: PeanoOrder nat => Sing a -> Compare a (Zero nat) :~: LT -> Void
+ Data.Type.Natural.Class.Order: zeroNoLT :: PeanoOrder nat => Sing a -> Compare a (Zero nat) :~: 'LT -> Void
- Data.Type.Ordinal: (@+) :: forall n m. (PeanoOrder nat, SingI (n :: nat), SingI m) => Ordinal n -> Ordinal m -> Ordinal (n :+ m)
+ Data.Type.Ordinal: (@+) :: forall n m. (PeanoOrder nat, SingI (n :: nat), SingI m) => Ordinal n -> Ordinal m -> Ordinal (n + m)
- Data.Type.Ordinal: [OLt] :: (IsPeano nat, (n :< m) ~ True) => Sing (n :: nat) -> Ordinal m
+ Data.Type.Ordinal: [OLt] :: (IsPeano nat, (n < m) ~ 'True) => Sing (n :: nat) -> Ordinal m
- Data.Type.Ordinal: class (PeanoOrder nat, Monomorphicable (Sing :: nat -> *), Integral (MonomorphicRep (Sing :: nat -> *)), Show (MonomorphicRep (Sing :: nat -> *))) => HasOrdinal nat
+ Data.Type.Ordinal: class (PeanoOrder nat, SingKind nat) => HasOrdinal nat
- Data.Type.Ordinal: inclusion :: ((n :<= m) ~ True) => Ordinal n -> Ordinal m
+ Data.Type.Ordinal: inclusion :: ((n <= m) ~ 'True) => Ordinal n -> Ordinal m
- Data.Type.Ordinal: inclusion' :: (n :<= m) ~ True => Sing m -> Ordinal n -> Ordinal m
+ Data.Type.Ordinal: inclusion' :: (n <= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m
- Data.Type.Ordinal: ordToInt :: (HasOrdinal nat, int ~ MonomorphicRep (Sing :: nat -> *)) => Ordinal (n :: nat) -> int
+ Data.Type.Ordinal: ordToInt :: (HasOrdinal nat) => Ordinal (n :: nat) -> Int
- Data.Type.Ordinal: sNatToOrd :: (PeanoOrder nat, SingI (n :: nat), (m :< n) ~ True) => Sing m -> Ordinal n
+ Data.Type.Ordinal: sNatToOrd :: (PeanoOrder nat, SingI (n :: nat), (m < n) ~ 'True) => Sing m -> Ordinal n
- Data.Type.Ordinal: sNatToOrd' :: (PeanoOrder nat, (m :< n) ~ True) => Sing (n :: nat) -> Sing m -> Ordinal n
+ Data.Type.Ordinal: sNatToOrd' :: (PeanoOrder nat, (m < n) ~ 'True) => Sing (n :: nat) -> Sing m -> Ordinal n
- Data.Type.Ordinal: unsafeFromInt :: forall (n :: nat). (HasOrdinal nat, SingI (n :: nat)) => MonomorphicRep (Sing :: nat -> *) -> Ordinal n
+ Data.Type.Ordinal: unsafeFromInt :: forall (n :: nat). (HasOrdinal nat, SingI (n :: nat)) => Int -> Ordinal n
- Data.Type.Ordinal.Builtin: inclusion :: (n :<= m) ~ True => Ordinal n -> Ordinal m
+ Data.Type.Ordinal.Builtin: inclusion :: (n <= m) ~ 'True => Ordinal n -> Ordinal m
- Data.Type.Ordinal.Builtin: inclusion' :: (n :<= m) ~ True => Sing m -> Ordinal n -> Ordinal m
+ Data.Type.Ordinal.Builtin: inclusion' :: (n <= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m
- Data.Type.Ordinal.Builtin: ordToInt :: Ordinal n -> Integer
+ Data.Type.Ordinal.Builtin: ordToInt :: Ordinal n -> Int
- Data.Type.Ordinal.Builtin: sNatToOrd :: (KnownNat n, (m :< n) ~ True) => Sing m -> Ordinal n
+ Data.Type.Ordinal.Builtin: sNatToOrd :: (KnownNat n, (m < n) ~ 'True) => Sing m -> Ordinal n
- Data.Type.Ordinal.Builtin: sNatToOrd' :: (m :< n) ~ True => Sing n -> Sing m -> Ordinal n
+ Data.Type.Ordinal.Builtin: sNatToOrd' :: (m < n) ~ 'True => Sing n -> Sing m -> Ordinal n
- Data.Type.Ordinal.Builtin: unsafeFromInt :: KnownNat n => MonomorphicRep (Sing :: Nat -> Type) -> Ordinal n
+ Data.Type.Ordinal.Builtin: unsafeFromInt :: KnownNat n => Int -> Ordinal n
- Data.Type.Ordinal.Peano: (@+) :: (SingI n, SingI m) => Ordinal n -> Ordinal m -> Ordinal (n :+ m)
+ Data.Type.Ordinal.Peano: (@+) :: (SingI n, SingI m) => Ordinal n -> Ordinal m -> Ordinal (n + m)
- Data.Type.Ordinal.Peano: absurdOrd :: Ordinal Z -> a
+ Data.Type.Ordinal.Peano: absurdOrd :: Ordinal 'Z -> a
- Data.Type.Ordinal.Peano: inclusion :: (n :<= m) ~ True => Ordinal n -> Ordinal m
+ Data.Type.Ordinal.Peano: inclusion :: (n <= m) ~ 'True => Ordinal n -> Ordinal m
- Data.Type.Ordinal.Peano: inclusion' :: (n :<= m) ~ True => Sing m -> Ordinal n -> Ordinal m
+ Data.Type.Ordinal.Peano: inclusion' :: (n <= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m
- Data.Type.Ordinal.Peano: ordToInt :: Ordinal n -> Integer
+ Data.Type.Ordinal.Peano: ordToInt :: Ordinal n -> Int
- Data.Type.Ordinal.Peano: sNatToOrd :: (SingI n, (m :< n) ~ True) => Sing m -> Ordinal n
+ Data.Type.Ordinal.Peano: sNatToOrd :: (SingI n, (m < n) ~ 'True) => Sing m -> Ordinal n
- Data.Type.Ordinal.Peano: sNatToOrd' :: (m :< n) ~ True => Sing n -> Sing m -> Ordinal n
+ Data.Type.Ordinal.Peano: sNatToOrd' :: (m < n) ~ 'True => Sing n -> Sing m -> Ordinal n
- Data.Type.Ordinal.Peano: unsafeFromInt :: SingI n => MonomorphicRep (Sing :: Nat -> Type) -> Ordinal n
+ Data.Type.Ordinal.Peano: unsafeFromInt :: SingI n => Int -> Ordinal n
- Data.Type.Ordinal.Peano: vacuousOrd :: Functor f => f (Ordinal Z) -> f a
+ Data.Type.Ordinal.Peano: vacuousOrd :: Functor f => f (Ordinal 'Z) -> f a

Files

Data/Type/Natural.hs view
@@ -16,16 +16,16 @@                           min, Min, sMin, max, Max, sMax,                           MinSym0, MinSym1, MinSym2,                           MaxSym0, MaxSym1, MaxSym2,-                          (:+:), (:+),-                          (:+$), (:+$$), (:+$$$),-                          (%+), (%:+), (:*), (:*:),-                          (:*$), (:*$$), (:*$$$),-                          (%:*), (%*), (:-:), (:-),-                          (:**:), (:**), (%:**), (%**),-                          (:-$), (:-$$), (:-$$$),-                          (%:-), (%-),+                          type (+),+                          type (+@#@$), type (+@#@$$), type (+@#@$$$),+                          (%+), type (*),+                          type (*@#@$), type (*@#@$$), type (*@#@$$$),+                          (%*), type (-),+                          type (**), (%**),+                          type (-@#@$), type (-@#@$$), type (-@#@$$$),+                          (%-),                            -- ** Type-level predicate & judgements-                          Leq(..), (:<=), LeqInstance,+                          Leq(..), type (<=), LeqInstance,                           boolToPropLeq, boolToClassLeq, propToClassLeq,                           propToBoolLeq,                           -- * Conversion functions@@ -61,17 +61,17 @@                           sN15, sN16, sN17, sN18, sN19, sN20                          )        where-import Data.Type.Natural.Class hiding (One, Zero, sOne, sZero)-import Data.Type.Natural.Core-import Data.Type.Natural.Definitions hiding ((:<=))+import Data.Type.Natural.Singleton.Compat+ import Data.Singletons-import Data.Singletons.Prelude.Ord import Data.Singletons.Decide-import Data.Type.Monomorphic-import Proof.Equational-import Proof.Propositional hiding (Not)+import Data.Type.Natural.Class       hiding (One, Zero, sOne, sZero)+import Data.Type.Natural.Core+import Data.Type.Natural.Definitions hiding (type (<=)) import Data.Void import Language.Haskell.TH.Quote+import Proof.Equational+import Proof.Propositional           hiding (Not)  -------------------------------------------------- -- * Conversion functions.@@ -94,14 +94,6 @@ sNatToInt SZ     = 0 sNatToInt (SS n) = sNatToInt n + 1 -instance Monomorphicable (Sing :: Nat -> *) where-  type MonomorphicRep (Sing :: Nat -> *) = Integer-  demote  (Monomorphic sn) = sNatToInt sn-  promote n-      | n < 0     = error "negative integer!"-      | n == 0    = Monomorphic SZ-      | otherwise = withPolymorhic (n - 1) $ \sn -> Monomorphic $ SS sn- -------------------------------------------------- -- * Properties --------------------------------------------------@@ -109,24 +101,24 @@ -- | Since 0.5.0.0 instance IsPeano Nat where   {-# SPECIALISE instance IsPeano Nat #-}-  induction base _step SZ = base+  induction base _step SZ    = base   induction base step (SS n) = step n (induction base step n)    plusMinus n SZ =-    start (n %:+ SZ %:- SZ)-      === (n %:- SZ)        `because` minusCongL (plusZeroR n) SZ +    start (n %+ SZ %- SZ)+      === (n %- SZ)        `because` minusCongL (plusZeroR n) SZ       =~= n   plusMinus n (SS m) =-    start (n %:+ SS m %:- SS m)-      === SS (n %:+ m) %:- SS m `because` minusCongL (plusSuccR n m) (SS m)-      =~= (n %:+ m) %:- m+    start (n %+ SS m %- SS m)+      === SS (n %+ m) %- SS m `because` minusCongL (plusSuccR n m) (SS m)+      =~= (n %+ m) %- m       === n                     `because` plusMinus n m    succInj Refl = Refl   succOneCong = Refl   succNonCyclic _ a = case a of {} -  plusZeroL _   = Refl  +  plusZeroL _   = Refl   plusSuccL _ _ = Refl    multZeroL _   = Refl@@ -137,55 +129,57 @@ snEqZAbsurd :: SingI n => 'S n :~: 'Z -> a snEqZAbsurd = absurd . succNonCyclic sing -plusInjectiveL :: SNat n -> SNat m -> SNat l -> n :+ m :~: n :+ l -> m :~: l+plusInjectiveL :: SNat n -> SNat m -> SNat l -> n + m :~: n + l -> m :~: l plusInjectiveL SZ     _ _ Refl = Refl plusInjectiveL (SS n) m l eq   = plusInjectiveL n m l $ succInj eq -plusInjectiveR :: SNat n -> SNat m -> SNat l -> n :+ l :~: m :+ l -> n :~: m+plusInjectiveR :: SNat n -> SNat m -> SNat l -> n + l :~: m + l -> n :~: m plusInjectiveR n m l eq = plusInjectiveL l n m $-  start (l %:+ n)-    === n %:+ l   `because` plusComm l n-    === m %:+ l   `because` eq-    === l %:+ m   `because` plusComm m l+  start (l %+ n)+    === n %+ l   `because` plusComm l n+    === m %+ l   `because` eq+    === l %+ m   `because` plusComm m l -reflToSEqual :: SNat n -> SNat m -> n :~: m -> IsTrue (n :== m)+reflToSEqual :: SNat n -> SNat m -> n :~: m -> IsTrue (n == m) reflToSEqual SZ     _      Refl = Witness reflToSEqual (SS n) (SS m) Refl = reflToSEqual n m Refl-reflToSEqual (SS _) SZ refl = case refl of {}+reflToSEqual (SS _) SZ refl     = case refl of {} -sequalToRefl :: SNat n -> SNat m -> IsTrue (n :== m) -> n :~: m+sequalToRefl :: SNat n -> SNat m -> IsTrue (n == m) -> n :~: m sequalToRefl SZ     SZ     Witness = Refl sequalToRefl SZ     (SS _) witness = case witness of {} sequalToRefl (SS n) (SS m) Witness = succCong $ sequalToRefl n m Witness sequalToRefl (SS _) SZ     witness = case witness of {} -snequalToNoRefl :: SNat n -> SNat m -> IsTrue (Not (n :== m)) -> n :~: m -> Void-snequalToNoRefl SZ     _ Witness = \case  {}-snequalToNoRefl (SS _) _ Witness = \case  {}+snequalToNoRefl :: SNat n -> SNat m -> IsTrue (Not (n == m)) -> n :~: m -> Void+snequalToNoRefl SZ     _      Witness = \case  {}+snequalToNoRefl (SS _) SZ     Witness = \case {}+snequalToNoRefl (SS n) (SS m) Witness = \case+  Refl -> snequalToNoRefl n m Witness  Refl -sequalSym :: SNat n -> SNat m -> (n :== m) :~: (m :== n)+sequalSym :: SNat n -> SNat m -> (n == m) :~: (m == n) sequalSym SZ SZ         = Refl sequalSym SZ (SS _)     = Refl sequalSym (SS _) SZ     = Refl sequalSym (SS n) (SS m) = sequalSym n m -sleqFlip :: SNat n -> SNat m -> (n :~: m -> Void) -> (m :<= n) :~: Not (n :<= m)+sleqFlip :: SNat n -> SNat m -> (n :~: m -> Void) -> (m <= n) :~: Not (n <= m) sleqFlip SZ     SZ     neq = absurd $ neq Refl sleqFlip SZ     (SS _) _   = Refl sleqFlip (SS _) SZ     _   = Refl sleqFlip (SS n) (SS m) neq = sleqFlip n m (neq . succCong) -sLeqReflexive :: SNat n -> SNat m -> IsTrue (n :== m) -> IsTrue (n :<= m)+sLeqReflexive :: SNat n -> SNat m -> IsTrue (n == m) -> IsTrue (n <= m) sLeqReflexive SZ     _      Witness = Witness sLeqReflexive (SS n) (SS m) Witness = sLeqReflexive n m Witness-sLeqReflexive (SS _) SZ  witness = case witness of {}+sLeqReflexive (SS _) SZ  witness    = case witness of {} -nonSLeqToLT :: (n :<= m) ~ 'False => SNat n -> SNat m -> Compare m n :~: 'LT+nonSLeqToLT :: (n <= m) ~ 'False => SNat n -> SNat m -> Compare m n :~: 'LT nonSLeqToLT n m = withRefl (sequalSym n m) $-  case m %:== n of+  case m %== n of     STrue -> case sLeqReflexive n m Witness of {}     SFalse ->-      case m %:<= n of+      case m %<= n of         STrue  -> Refl         SFalse -> case sleqFlip n m $ snequalToNoRefl n m Witness of {} @@ -198,46 +192,46 @@   viewLeq (SS _) SZ     a       = case a of {}    ltToLeq n m Refl =-    case n %:== m of-      SFalse -> case n %:<= m of+    case n %== m of+      SFalse -> case n %<= m of         STrue -> Witness   eqlCmpEQ n m Refl =-    case n %:== m of+    case n %== m of       STrue  -> Refl       SFalse -> absurd $ snequalToNoRefl n m Witness Refl    eqToRefl n m Refl =-    case n %:== m of-      STrue -> sequalToRefl n m Witness-      SFalse -> case n %:<= m of {}+    case n %== m of+      STrue  -> sequalToRefl n m Witness+      SFalse -> case n %<= m of {}    leqToCmp n m Witness =-    case n %:== m of+    case n %== m of       STrue  -> Left $ sequalToRefl n m Witness       SFalse -> Right Refl    cmpZero _ = Refl    flipCompare n m =-    case n %:== m of+    case n %== m of       STrue -> withRefl (sequalSym n m) Refl       SFalse -> withRefl (sequalSym n m) $-        case n %:<= m of+        case n %<= m of           STrue -> withRefl (sleqFlip n m (snequalToNoRefl n m Witness)) $-            case m %:<= n of+            case m %<= n of               SFalse -> Refl           SFalse -> withRefl (sleqFlip n m (snequalToNoRefl n m Witness)) $-            case m %:<= n of+            case m %<= n of               STrue -> Refl -  minLeqL SZ SZ     = Witness-  minLeqL SZ (SS _) = Witness-  minLeqL (SS _) SZ = Witness+  minLeqL SZ SZ         = Witness+  minLeqL SZ (SS _)     = Witness+  minLeqL (SS _) SZ     = Witness   minLeqL (SS n) (SS m) = minLeqL n m -  minLeqR SZ SZ     = Witness-  minLeqR SZ (SS _) = Witness-  minLeqR (SS _) SZ = Witness+  minLeqR SZ SZ         = Witness+  minLeqR SZ (SS _)     = Witness+  minLeqR (SS _) SZ     = Witness   minLeqR (SS n) (SS m) = minLeqR n m    minLargest SZ     _      _  _ _       = Witness@@ -271,13 +265,13 @@   lneqReversed _ _ = Refl   lneqSuccLeq _ _ = Refl -plusMinusEqL :: SNat n -> SNat m -> ((n :+: m) :-: m) :~: n+plusMinusEqL :: SNat n -> SNat m -> ((n + m) - m) :~: n plusMinusEqL = plusMinus -plusNeutralR :: SNat n -> SNat m -> n :+ m :~: n -> m :~: 'Z+plusNeutralR :: SNat n -> SNat m -> n + m :~: n -> m :~: 'Z plusNeutralR n m npmn = plusEqCancelL n m SZ (npmn `trans` sym (plusZeroR n)) -plusNeutralL :: SNat n -> SNat m -> n :+ m :~: m -> n :~: 'Z+plusNeutralL :: SNat n -> SNat m -> n + m :~: m -> n :~: 'Z plusNeutralL n m npmm = plusNeutralR m n (plusComm m n `trans` npmm)  --------------------------------------------------@@ -286,7 +280,7 @@  -- | Quotesi-quoter for 'SNat'. This can be used for an expression. -----  For example: @[snat|12|] '%:+' [snat| 5 |]@.+--  For example: @[snat|12|] '%+' [snat| 5 |]@. snat :: QuasiQuoter snat = mkSNatQQ [t| Nat |] 
Data/Type/Natural/Builtin.hs view
@@ -25,28 +25,28 @@          IsPeano(..),          inductionNat,          -- * QuasiQuotes-         snat+         snat,+         -- * Re-exports+         module Data.Type.Natural.Singleton.Compat        )        where+import Data.Type.Natural.Singleton.Compat import Data.Type.Natural.Class  import           Data.Singletons.Decide       (SDecide (..)) import           Data.Singletons.Decide       (Decision (..))-import           Data.Singletons.Prelude      (PNum (..), SNum (..), Sing (..))+import           Data.Singletons.Prelude      (Sing (..), SingKind(..)) import           Data.Singletons.Prelude      (SingI (..))-import           Data.Singletons.Prelude      (SingKind (..), SomeSing (..)) import           Data.Singletons.Prelude.Enum (PEnum (..), SEnum (..)) import           Data.Singletons.Prelude.Ord  (POrd (..), SOrd (..)) import           Data.Singletons.TH           (sCases) import           Data.Singletons.TypeLits     (withKnownNat) import           Data.Type.Equality           ((:~:) (..))-import           Data.Type.Monomorphic        (Monomorphic (..))-import           Data.Type.Monomorphic        (Monomorphicable (..)) import           Data.Type.Natural            (Nat (S, Z), Sing (SS, SZ)) import qualified Data.Type.Natural            as PN import           Data.Void                    (absurd) import           Data.Void                    (Void)-import           GHC.TypeLits                 (type (+), type (<=), type (<=?))+import           GHC.TypeLits                 (type (<=?)) import qualified GHC.TypeLits                 as TL import           Language.Haskell.TH.Quote    (QuasiQuoter) import           Proof.Equational             (coerce, withRefl)@@ -77,8 +77,15 @@ sFromPeano SZ      = sing sFromPeano (SS sn) = sSucc (sFromPeano sn) -toPeanoInjective :: ToPeano n :~: ToPeano m -> n :~: m-toPeanoInjective Refl = Refl+toPeanoInjective :: forall n m. (TL.KnownNat n, TL.KnownNat m)+                 => ToPeano n :~: ToPeano m -> n :~: m+toPeanoInjective tPnEqtPm =+  let sn = sing :: Sing n+      sm = sing :: Sing m+  in start sn+       === sFromPeano (sToPeano sn) `because` sym (fromToPeano sn)+       === sFromPeano (sToPeano sm) `because` congFromPeano tPnEqtPm+       === sm                       `because` fromToPeano sm  -- trustMe :: a :~: b -- trustMe = unsafeCoerce (Refl :: () :~: ())@@ -141,31 +148,31 @@ fromPeanoSuccCong :: Sing n -> FromPeano ('S n) :~: Succ (FromPeano n) fromPeanoSuccCong _sn = Refl -fromPeanoPlusCong :: Sing n -> Sing m -> FromPeano (n :+ m) :~: FromPeano n :+ FromPeano m+fromPeanoPlusCong :: Sing n -> Sing m -> FromPeano (n PN.+ m) :~: FromPeano n TL.+ FromPeano m fromPeanoPlusCong SZ _ = Refl fromPeanoPlusCong (SS sn) sm =-  start (sFromPeano (SS sn %:+ sm))-    =~= sFromPeano (SS (sn %:+ sm))-    === sSucc (sFromPeano (sn %:+ sm))           `because` fromPeanoSuccCong (sn %:+ sm)-    === sSucc (sFromPeano sn  %:+ sFromPeano sm) `because` congSucc (fromPeanoPlusCong sn sm)-    =~= sSucc (sFromPeano sn) %:+ sFromPeano sm-    =~= sFromPeano (SS sn)    %:+ sFromPeano sm+  start (sFromPeano (SS sn %+ sm))+    =~= sFromPeano (SS (sn %+ sm))+    === sSucc (sFromPeano (sn %+ sm))           `because` fromPeanoSuccCong (sn %+ sm)+    === sSucc (sFromPeano sn  %+ sFromPeano sm) `because` congSucc (fromPeanoPlusCong sn sm)+    =~= sSucc (sFromPeano sn) %+ sFromPeano sm+    =~= sFromPeano (SS sn)    %+ sFromPeano sm -toPeanoPlusCong :: Sing n -> Sing m -> ToPeano (n + m) :~: ToPeano n :+ ToPeano m+toPeanoPlusCong :: Sing n -> Sing m -> ToPeano (n TL.+ m) :~: ToPeano n PN.+ ToPeano m toPeanoPlusCong sn sm =   case viewNat sn of     IsZero -> Refl     IsSucc pn ->-      start (sToPeano (sSucc pn %:+ sm))-        =~= sToPeano (sSucc (pn %:+ sm))-        === SS (sToPeano (pn %:+ sm))-            `because` toPeanoSuccCong (pn %:+ sm)-        === SS (sToPeano pn %:+ sToPeano sm)+      start (sToPeano (sSucc pn %+ sm))+        =~= sToPeano (sSucc (pn %+ sm))+        === SS (sToPeano (pn %+ sm))+            `because` toPeanoSuccCong (pn %+ sm)+        === SS (sToPeano pn %+ sToPeano sm)             `because` succCong (toPeanoPlusCong pn sm)-        =~= SS (sToPeano pn) %:+ sToPeano sm-        === (sToPeano (sSucc pn) %:+ sToPeano sm)+        =~= SS (sToPeano pn) %+ sToPeano sm+        === (sToPeano (sSucc pn) %+ sToPeano sm)             `because` plusCongL (sym (toPeanoSuccCong pn)) (sToPeano sm)-        =~= sToPeano sn %:+ sToPeano sm+        =~= sToPeano sn %+ sToPeano sm  fromPeanoZeroCong :: FromPeano 'Z :~: 0 fromPeanoZeroCong = Refl@@ -179,60 +186,60 @@ toPeanoOneCong :: ToPeano 1 :~: PN.One toPeanoOneCong = Refl -natPlusCongR :: Sing r -> n :~: m -> n + r :~: m + r+natPlusCongR :: Sing r -> n :~: m -> n TL.+ r :~: m TL.+ r natPlusCongR _ Refl = Refl -fromPeanoMultCong :: Sing n -> Sing m -> FromPeano (n PN.:* m) :~: FromPeano n :* FromPeano m+fromPeanoMultCong :: Sing n -> Sing m -> FromPeano (n PN.* m) :~: FromPeano n TL.* FromPeano m fromPeanoMultCong SZ _ = Refl fromPeanoMultCong (SS psn) sm =-  start (sFromPeano (SS psn %:* sm))-    =~= sFromPeano (psn %:* sm %:+ sm)-    === sFromPeano (psn %:* sm) %:+ sFromPeano sm-        `because` fromPeanoPlusCong (psn %:* sm) sm-    === sFromPeano psn %:* sFromPeano sm %:+ sFromPeano sm+  start (sFromPeano (SS psn %* sm))+    =~= sFromPeano (psn %* sm %+ sm)+    === sFromPeano (psn %* sm) %+ sFromPeano sm+        `because` fromPeanoPlusCong (psn %* sm) sm+    === sFromPeano psn %* sFromPeano sm %+ sFromPeano sm         `because` natPlusCongR (sFromPeano sm) (fromPeanoMultCong psn sm)-    =~= sSucc (sFromPeano psn) %:* sFromPeano sm-    =~= sFromPeano (SS psn)    %:* sFromPeano sm+    =~= sSucc (sFromPeano psn) %* sFromPeano sm+    =~= sFromPeano (SS psn)    %* sFromPeano sm  -toPeanoMultCong :: Sing n -> Sing m -> ToPeano (n PN.:* m) :~: ToPeano n PN.:* ToPeano m+toPeanoMultCong :: Sing n -> Sing m -> ToPeano (n TL.* m) :~: ToPeano n PN.* ToPeano m toPeanoMultCong sn sm =   case viewNat sn of     IsZero -> Refl     IsSucc psn ->-      start (sToPeano (sSucc psn %:* sm))-        =~= sToPeano (psn %:* sm %:+ sm)-        === sToPeano (psn %:* sm) %:+ sToPeano sm-            `because` toPeanoPlusCong (psn %:* sm) sm-        === sToPeano psn %:* sToPeano sm %:+ sToPeano sm+      start (sToPeano (sSucc psn %* sm))+        =~= sToPeano (psn %* sm %+ sm)+        === sToPeano (psn %* sm) %+ sToPeano sm+            `because` toPeanoPlusCong (psn %* sm) sm+        === sToPeano psn %* sToPeano sm %+ sToPeano sm             `because` plusCongL (toPeanoMultCong psn sm) (sToPeano sm)-        =~= SS (sToPeano psn) %:* sToPeano sm-        === sToPeano (sSucc psn) %:* sToPeano sm+        =~= SS (sToPeano psn) %* sToPeano sm+        === sToPeano (sSucc psn) %* sToPeano sm             `because` multCongL (sym (toPeanoSuccCong psn)) (sToPeano sm) -infix 4 %:<=?-(%:<=?) :: Sing (n :: TL.Nat) -> Sing m -> Sing (n <=? m)-n %:<=? m = case sCompare n m of+infix 4 %<=?+(%<=?) :: Sing (n :: TL.Nat) -> Sing m -> Sing (n <=? m)+n %<=? m = case sCompare n m of   SLT -> STrue   SEQ -> STrue   SGT -> SFalse -natLeqSuccEq :: Sing n -> Sing m -> ((n + 1) <=? (m + 1)) :~: (n <=? m)+natLeqSuccEq :: Sing n -> Sing m -> ((n TL.+ 1) <=? (m TL.+ 1)) :~: (n <=? m) natLeqSuccEq _ _ = Refl  leqqCong :: n :~: m -> l :~: z -> (n <=? l) :~: (m <=? z) leqqCong Refl Refl = Refl -leqCong :: n :~: m -> l :~: z -> (n :<= l) :~: (m :<= z)+leqCong :: n :~: m -> l :~: z -> (n PN.<= l) :~: (m PN.<= z) leqCong Refl Refl = Refl -fromPeanoMonotone :: ((n :<= m) ~ 'True) => Sing n -> Sing m -> (FromPeano n <=? FromPeano m) :~: 'True+fromPeanoMonotone :: ((n PN.<= m) ~ 'True) => Sing n -> Sing m -> (FromPeano n <=? FromPeano m) :~: 'True fromPeanoMonotone SZ _ = Refl fromPeanoMonotone (SS n) (SS m) =-   start (sFromPeano (SS n) %:<=? sFromPeano (SS m))-     === (sSucc (sFromPeano n) %:<=? sSucc (sFromPeano m))+   start (sFromPeano (SS n) %<=? sFromPeano (SS m))+     === (sSucc (sFromPeano n) %<=? sSucc (sFromPeano m))       `because` leqqCong  (fromPeanoSuccCong n) (fromPeanoSuccCong m)-     === (sFromPeano n %:<=? sFromPeano m)+     === (sFromPeano n %<=? sFromPeano m)       `because` natLeqSuccEq (sFromPeano n) (sFromPeano m)      === STrue       `because` fromPeanoMonotone n m@@ -240,7 +247,7 @@ fromPeanoMonotone _ _ = bugInGHC #endif -natLeqZero :: (n <= 0) => Sing n -> n :~: 0+natLeqZero :: (n TL.<= 0) => Sing n -> n :~: 0 natLeqZero Zero = Refl natLeqZero _    = error "natLeqZero : bug in ghc" @@ -250,7 +257,7 @@ natSuccPred :: ((n :~: 0) -> Void) -> Succ (Pred n) :~: n natSuccPred _ = Refl -myLeqPred :: Sing n -> Sing m -> ('S n :<= 'S m) :~: (n :<= m)+myLeqPred :: Sing n -> Sing m -> ('S n PN.<= 'S m) :~: (n PN.<= m) myLeqPred SZ _          = Refl myLeqPred (SS _) (SS _) = Refl myLeqPred (SS _) SZ     = Refl@@ -258,8 +265,8 @@ toPeanoCong :: a :~: b -> ToPeano a :~: ToPeano b toPeanoCong Refl = Refl -toPeanoMonotone :: (n <= m)-                => Sing n -> Sing m -> ((ToPeano n) :<= (ToPeano m)) :~: 'True+toPeanoMonotone :: (n TL.<= m)+                => Sing n -> Sing m -> ((ToPeano n) PN.<= (ToPeano m)) :~: 'True toPeanoMonotone sn sm =   case sn %~ (sing :: Sing 0) of     Proved eql -> withRefl eql Refl@@ -268,18 +275,18 @@       Disproved mPos ->         let pn = sPred sn             pm = sPred sm-        in start (sToPeano sn %:<= sToPeano sm)-             === (sToPeano (sSucc pn) %:<= sToPeano (sSucc pm))+        in start (sToPeano sn %<= sToPeano sm)+             === (sToPeano (sSucc pn) %<= sToPeano (sSucc pm))                  `because` leqCong (toPeanoCong $ sym $ natSuccPred nPos)                                    (toPeanoCong $ sym $ natSuccPred mPos)-             === (SS (sToPeano pn) %:<= SS (sToPeano pm))+             === (SS (sToPeano pn) %<= SS (sToPeano pm))                  `because` leqCong (toPeanoSuccCong pn) (toPeanoSuccCong pm)-             === (sToPeano pn %:<= sToPeano pm)+             === (sToPeano pn %<= sToPeano pm)                  `because` myLeqPred (sToPeano pn) (sToPeano pm)              === STrue `because` toPeanoMonotone pn pm  -- | Induction scheme for built-in @'TL.Nat'@.-inductionNat :: forall p n. p 0 -> (forall m. p m -> p (m + 1)) -> Sing n -> p n+inductionNat :: forall p n. p 0 -> (forall m. p m -> p (m TL.+ 1)) -> Sing n -> p n inductionNat base step sn =   case viewNat sn of     IsZero    -> base@@ -288,6 +295,10 @@  instance IsPeano TL.Nat where   {-# SPECIALISE instance IsPeano TL.Nat #-}++  toNatural = fromIntegral . fromSing+  fromNatural = toSing . fromIntegral+   predSucc _ = Refl   plusMinus _ _ = Refl   succInj Refl = Refl@@ -397,29 +408,30 @@   lneqSuccLeq n m =     case sCompare n m of       SEQ ->-        start (n %:< m)+        start (n %< m)           =~= SFalse-          === (sSucc n %:<= n) `because` sym (succLeqAbsurd' n)-          === (sSucc n %:<= m) `because` sLeqCongR (sSucc n) (eqToRefl n m Refl)+          === (sSucc n %<= n) `because` sym (succLeqAbsurd' n)+          === (sSucc n %<= m) `because` sLeqCongR (sSucc n) (eqToRefl n m Refl)       SLT -> withWitness (ltToSuccLeq n m Refl) $-        start (n %:< m)+        start (n %< m)           =~= STrue-          =~= (sSucc n %:<= m)+          =~= (sSucc n %<= m)       SGT ->-        case sSucc n %:<= m of+        case sSucc n %<= m of           SFalse -> Refl           STrue  -> eliminate $ succLeqToLT n m Witness -instance Monomorphicable (Sing :: TL.Nat -> *) where-  type MonomorphicRep (Sing :: TL.Nat -> *) = Integer-  demote  (Monomorphic sn) = fromSing sn-  {-# INLINE demote #-}+-- instance Monomorphicable (Sing :: TL.Nat -> *) where+--   type MonomorphicRep (Sing :: TL.Nat -> *) = Integer+--   demote  (Monomorphic sn) = fromSing sn+--   {-# INLINE demote #-} -  promote n = case toSing n of SomeSing k -> Monomorphic k-  {-# INLINE promote #-}+--   promote n = case toSing n of SomeSing k -> Monomorphic k+--   {-# INLINE promote #-}  -- | Quotesi-quoter for singleton types for @'GHC.TypeLits.Nat'@. This can be used for an expression. -----  For example: @[snat|12|] '%:+' [snat| 5 |]@.+--  For example: @[snat|12|] '%+' [snat| 5 |]@. snat :: QuasiQuoter snat = mkSNatQQ [t| TL.Nat |]+
Data/Type/Natural/Class.hs view
@@ -9,8 +9,8 @@ import Data.Type.Natural.Class.Order  import Data.Singletons.Prelude   (FromInteger, Sing, sing)-import Language.Haskell.TH-import Language.Haskell.TH.Quote+import Language.Haskell.TH       (ExpQ, TypeQ, litT, numTyLit, sigT)+import Language.Haskell.TH.Quote (QuasiQuoter (..))  -- | Quasiquoter generateor for specific peano-types. --
Data/Type/Natural/Class/Arithmetic.hs view
@@ -1,22 +1,38 @@-{-# LANGUAGE DataKinds, EmptyCase, ExplicitForAll, FlexibleContexts        #-}+{-# LANGUAGE CPP, DataKinds, EmptyCase, ExplicitForAll, FlexibleContexts   #-} {-# LANGUAGE FlexibleInstances, GADTs, KindSignatures                      #-} {-# LANGUAGE MultiParamTypeClasses, PatternSynonyms, PolyKinds, RankNTypes #-} {-# LANGUAGE ScopedTypeVariables, TemplateHaskell, TypeFamilies            #-}-{-# LANGUAGE TypeInType, ViewPatterns                                      #-}+{-# LANGUAGE TypeInType, ViewPatterns , ExplicitNamespaces                 #-} module Data.Type.Natural.Class.Arithmetic        (Zero, One, S, sZero, sOne, ZeroOrSucc(..),         plusCong, plusCongR, plusCongL, succCong,         multCong, multCongL, multCongR,         minusCong, minusCongL, minusCongR,         IsPeano(..), pattern Zero, pattern Succ,+        module Data.Type.Natural.Singleton.Compat        ) where-import Data.Singletons.Decide-import Data.Singletons.Prelude-import Data.Singletons.Prelude.Enum-import Data.Type.Equality-import Data.Void-import Proof.Equational+import Data.Type.Natural.Singleton.Compat+  (type (/=), type (==), type (+), type (*), type (-)+  ,type (/=@#@$) ,type (/=@#@$$), type (/=@#@$$$)+  ,type (==@#@$) ,type (==@#@$$), type (==@#@$$$)+  ,type (+@#@$) ,type (+@#@$$), type (+@#@$$$)+  ,type (*@#@$) ,type (*@#@$$), type (*@#@$$$)+  ,type (-@#@$) ,type (-@#@$$), type (-@#@$$$)+  ,(%==), (%/=), (%+), (%*), (%-)+  , FromInteger, FromIntegerSym0, FromIntegerSym1+  ,SNum(..), PNum(..)+  ) +import Data.Functor.Const           (Const (..))+import Data.Singletons.Decide       (SDecide (..))+import Data.Singletons.Prelude      (Apply, SingI (..), SingKind (..),+                                     SomeSing (..), Sing)+import Data.Singletons.Prelude.Enum (Pred, SEnum (..), Succ, sPred, sSucc)+import Data.Type.Equality           ((:~:) (..))+import Data.Void                    (Void, absurd)+import Numeric.Natural              (Natural)+import Proof.Equational             (because, coerce, start, sym, trans, (===))+ type family Zero nat :: nat where   Zero nat = FromInteger 0 @@ -37,34 +53,34 @@ predCong :: n :~: m -> Pred n :~: Pred m predCong Refl = Refl -plusCong :: n :~: m -> n' :~: m' -> n :+ n' :~: m :+ m'+plusCong :: n :~: m -> n' :~: m' -> n + n' :~: m + m' plusCong Refl Refl = Refl -plusCongL :: n :~: m -> Sing k -> n :+ k :~: m :+ k+plusCongL :: n :~: m -> Sing k -> n + k :~: m + k plusCongL Refl _ = Refl -plusCongR :: Sing k -> n :~: m -> k :+ n :~: k :+ m+plusCongR :: Sing k -> n :~: m -> k + n :~: k + m plusCongR _ Refl = Refl  succCong :: n :~: m -> S n :~: S m succCong Refl = Refl -multCong :: n :~: m -> l :~: k -> n :* l :~: m :* k+multCong :: n :~: m -> l :~: k -> n * l :~: m * k multCong Refl Refl = Refl -multCongL :: n :~: m -> Sing k -> n :* k :~: m :* k+multCongL :: n :~: m -> Sing k -> n * k :~: m * k multCongL Refl _ = Refl -multCongR :: Sing k -> n :~: m -> k :* n :~: k :* m+multCongR :: Sing k -> n :~: m -> k * n :~: k * m multCongR _ Refl = Refl -minusCong :: n :~: m -> l :~: k -> n :- l :~: m :- k+minusCong :: n :~: m -> l :~: k -> n - l :~: m - k minusCong Refl Refl = Refl -minusCongL :: n :~: m -> Sing k -> n :- k :~: m :- k+minusCongL :: n :~: m -> Sing k -> n - k :~: m - k minusCongL Refl _ = Refl -minusCongR :: Sing k -> n :~: m -> k :- n :~: k :- m+minusCongR :: Sing k -> n :~: m -> k - n :~: k - m minusCongR _ Refl = Refl  data ZeroOrSucc (n :: nat) where@@ -80,42 +96,42 @@ newtype IdentityR op e (n :: nat) = IdentityR { idRProof :: Apply (op n) e :~: n } newtype IdentityL op e (n :: nat) = IdentityL { idLProof :: Apply (op e) n :~: n } -type PlusZeroR (n :: nat) = IdentityR (:+$$) (Zero nat) n+type PlusZeroR (n :: nat) = IdentityR (+@#@$$) (Zero nat) n newtype PlusSuccR (n :: nat) =-  PlusSuccR { plusSuccRProof :: forall m. Sing m -> n :+ S m :~: S (n :+ m) }+  PlusSuccR { plusSuccRProof :: forall m. Sing m -> n + S m :~: S (n + m) } -type PlusZeroL (n :: nat) = IdentityL (:+$$) (Zero nat) n+type PlusZeroL (n :: nat) = IdentityL (+@#@$$) (Zero nat) n newtype PlusSuccL (m :: nat) =-  PlusSuccL { plusSuccLProof :: forall n. Sing n -> S n :+ m :~: S (n :+ m) }+  PlusSuccL { plusSuccLProof :: forall n. Sing n -> S n + m :~: S (n + m) }  newtype Comm op n = Comm { commProof :: forall m. Sing m -> Apply (op n) m :~: Apply (op m) n } -type PlusComm = Comm (:+$$)+type PlusComm = Comm (+@#@$$) -newtype MultZeroL (n :: nat) =  MultZeroL { multZeroLProof :: Zero nat :* n :~: Zero nat }+newtype MultZeroL (n :: nat) =  MultZeroL { multZeroLProof :: Zero nat * n :~: Zero nat } newtype MultZeroR (n :: nat) =-  MultZeroR { multZeroRProof :: n :* Zero nat :~: Zero nat }+  MultZeroR { multZeroRProof :: n * Zero nat :~: Zero nat } -newtype MultSuccL (m :: nat) = MultSuccL { multSuccLProof :: forall n. Sing n -> S n :* m :~: n :* m :+ m }-newtype MultSuccR (n :: nat) = MultSuccR { multSuccRProof :: forall m. Sing m -> n :* S m :~: n :* m :+ n }+newtype MultSuccL (m :: nat) = MultSuccL { multSuccLProof :: forall n. Sing n -> S n * m :~: n * m + m }+newtype MultSuccR (n :: nat) = MultSuccR { multSuccRProof :: forall m. Sing m -> n * S m :~: n * m + n }  newtype PlusMultDistrib (n :: nat) =   PlusMultDistrib { plusMultDistribProof :: forall m l. Sing m -> Sing l-                                         -> (n :+ m) :* l :~: n :* l :+ m :* l+                                         -> (n + m) * l :~: (n * l) + (m * l)                   }  newtype PlusEqCancelL (n :: nat) =   PlusEqCancelL { plusEqCancelLProof :: forall m l . Sing m -> Sing l-                                                       -> n :+ m :~: n :+ l -> m :~: l }+                                                       -> n + m :~: n + l -> m :~: l } -newtype SuccPlusL (n :: nat) = SuccPlusL { proofSuccPlusL :: Succ n :~: One nat :+ n }+newtype SuccPlusL (n :: nat) = SuccPlusL { proofSuccPlusL :: Succ n :~: One nat + n } newtype MultEqCancelR n =   MultEqCancelR { proofMultEqCancelR :: forall m l. Sing m -> Sing l-                                        -> n :* Succ l :~: m :* Succ l+                                        -> n * Succ l :~: m * Succ l                                         -> n :~: m                 } -class (SDecide nat, SNum nat, SEnum nat)+class (SDecide nat, SNum nat, SEnum nat, SingKind nat, SingKind nat)     => IsPeano nat where   {-# MINIMAL succOneCong, succNonCyclic, predSucc, plusMinus,               succInj, ( (plusZeroL, plusSuccL) | (plusZeroR, plusZeroL))@@ -128,15 +144,15 @@   succInj' _ _  = succInj   succNonCyclic :: Sing n -> Succ n :~: Zero nat -> Void   induction     :: p (Zero nat) -> (forall n. Sing n -> p n -> p (S n)) -> Sing k -> p k-  plusMinus :: Sing (n :: nat) -> Sing m -> n :+ m :- m :~: n+  plusMinus :: Sing (n :: nat) -> Sing m -> n + m - m :~: n -  plusMinus' :: Sing (n :: nat) -> Sing m -> n :+ m :- n :~: m+  plusMinus' :: Sing (n :: nat) -> Sing m -> n + m - n :~: m   plusMinus'  n m =-    start (n %:+ m %:- n)-      === m %:+ n %:- n   `because` minusCongL (plusComm n m) n+    start (n %+ m %- n)+      === m %+ n %- n   `because` minusCongL (plusComm n m) n       === m               `because` plusMinus m n -  plusZeroL :: Sing n -> (Zero nat :+ n) :~: n+  plusZeroL :: Sing n -> (Zero nat + n) :~: n   plusZeroL sn = idLProof (induction base step sn)     where       base :: PlusZeroL (Zero nat)@@ -144,27 +160,27 @@        step :: Sing (n :: nat) -> PlusZeroL n -> PlusZeroL (S n)       step sk (IdentityL ih) = IdentityL $-        start (sZero %:+ sS sk)-          === sS (sZero %:+ sk) `because` plusSuccR sZero sk+        start (sZero %+ sS sk)+          === sS (sZero %+ sk) `because` plusSuccR sZero sk           === sS sk             `because` succCong ih -  plusSuccL :: Sing n -> Sing m -> S n :+ m :~: S (n :+ m :: nat)+  plusSuccL :: Sing n -> Sing m -> S n + m :~: S (n + m :: nat)   plusSuccL sn0 sm0 = plusSuccLProof (induction base step sm0) sn0     where       base :: PlusSuccL (Zero nat)       base = PlusSuccL $ \sn ->-        start (sS sn %:+ sZero)+        start (sS sn %+ sZero)           === sS sn             `because` plusZeroR (sS sn)-          === sS (sn %:+ sZero) `because` succCong (sym $ plusZeroR sn)+          === sS (sn %+ sZero) `because` succCong (sym $ plusZeroR sn)        step :: Sing (n :: nat) -> PlusSuccL n -> PlusSuccL (S n)       step sm (PlusSuccL ih) = PlusSuccL $ \sn ->-        start (sS sn %:+ sS sm)-        === sS (sS sn %:+ sm)   `because` plusSuccR (sS sn) sm-        === sS (sS (sn %:+ sm)) `because` succCong (ih sn)-        === sS (sn %:+ sS sm)   `because` succCong (sym $ plusSuccR sn sm)+        start (sS sn %+ sS sm)+        === sS (sS sn %+ sm)   `because` plusSuccR (sS sn) sm+        === sS (sS (sn %+ sm)) `because` succCong (ih sn)+        === sS (sn %+ sS sm)   `because` succCong (sym $ plusSuccR sn sm) -  plusZeroR :: Sing n -> (n :+ Zero nat) :~: n+  plusZeroR :: Sing n -> (n + Zero nat) :~: n   plusZeroR sn = idRProof (induction base step sn)     where       base :: PlusZeroR (Zero nat)@@ -172,64 +188,64 @@        step :: Sing (n :: nat) -> PlusZeroR n -> PlusZeroR (S n)       step sk (IdentityR ih) = IdentityR $-        start (sS sk %:+ sZero)-          === sS (sk %:+ sZero) `because` plusSuccL sk sZero+        start (sS sk %+ sZero)+          === sS (sk %+ sZero) `because` plusSuccL sk sZero           === sS sk             `because` succCong ih -  plusSuccR :: Sing n -> Sing m -> n :+ S m :~: S (n :+ m :: nat)+  plusSuccR :: Sing n -> Sing m -> n + S m :~: S (n + m :: nat)   plusSuccR sn0 = plusSuccRProof (induction base step sn0)     where       base :: PlusSuccR (Zero nat)       base = PlusSuccR $ \sk ->-        start (sZero %:+ sS sk)+        start (sZero %+ sS sk)           === sS sk             `because` plusZeroL (sS sk)-          === sS (sZero %:+ sk) `because` succCong (sym $ plusZeroL sk)+          === sS (sZero %+ sk) `because` succCong (sym $ plusZeroL sk)        step :: Sing (n :: nat) -> PlusSuccR n -> PlusSuccR (S n)       step sn (PlusSuccR ih) = PlusSuccR $ \sk ->-        start (sS sn %:+ sS sk)-        === sS (sn %:+ sS sk)    `because` plusSuccL sn (sS sk)-        === sS (sS (sn %:+ sk))  `because` succCong (ih sk)-        === sS (sS sn %:+ sk)    `because` succCong (sym $ plusSuccL sn sk)+        start (sS sn %+ sS sk)+        === sS (sn %+ sS sk)    `because` plusSuccL sn (sS sk)+        === sS (sS (sn %+ sk))  `because` succCong (ih sk)+        === sS (sS sn %+ sk)    `because` succCong (sym $ plusSuccL sn sk) -  plusComm  :: Sing n -> Sing m -> n :+ m :~: (m :: nat) :+ n+  plusComm  :: Sing n -> Sing m -> n + m :~: (m :: nat) + n   plusComm sn0 = commProof (induction base step sn0)     where       base :: PlusComm (Zero nat)       base = Comm $ \sk ->-        start (sZero %:+ sk)+        start (sZero %+ sk)           === sk             `because` plusZeroL sk-          === (sk %:+ sZero) `because` sym (plusZeroR sk)+          === (sk %+ sZero) `because` sym (plusZeroR sk)        step :: Sing (n :: nat) -> PlusComm n -> PlusComm (S n)       step sn (Comm ih) = Comm $ \sk ->-        start (sS sn %:+ sk)-          === sS (sn %:+ sk) `because` plusSuccL sn sk-          === sS (sk %:+ sn) `because` succCong (ih sk)-          === sk %:+ sS sn   `because` sym (plusSuccR sk sn)+        start (sS sn %+ sk)+          === sS (sn %+ sk) `because` plusSuccL sn sk+          === sS (sk %+ sn) `because` succCong (ih sk)+          === sk %+ sS sn   `because` sym (plusSuccR sk sn)    plusAssoc :: forall n m l. Sing (n :: nat) -> Sing m -> Sing l-            -> (n :+ m) :+ l :~: n :+ (m :+ l)+            -> (n + m) + l :~: n + (m + l)   plusAssoc sn m l = assocProof (induction base step sn) m l     where-      base :: Assoc (:+$$) (Zero nat)+      base :: Assoc (+@#@$$) (Zero nat)       base = Assoc $ \ sk sl ->-        start ((sZero %:+ sk) %:+ sl)-          === sk %:+ sl+        start ((sZero %+ sk) %+ sl)+          === sk %+ sl               `because` plusCongL (plusZeroL sk) sl-          === (sZero %:+ (sk %:+ sl))-              `because` sym (plusZeroL (sk %:+ sl))+          === (sZero %+ (sk %+ sl))+              `because` sym (plusZeroL (sk %+ sl)) -      step :: forall k . Sing (k :: nat) -> Assoc (:+$$) k -> Assoc (:+$$) (S k)+      step :: forall k . Sing (k :: nat) -> Assoc (+@#@$$) k -> Assoc (+@#@$$) (S k)       step sk (Assoc ih) = Assoc $ \ sl su ->-        start ((sS sk %:+ sl) %:+ su)-        ===   (sS (sk %:+ sl) %:+ su) `because` plusCongL (plusSuccL sk sl) su-        ===   sS (sk %:+ sl %:+ su)   `because` plusSuccL (sk %:+ sl) su-        ===   sS (sk %:+ (sl %:+ su)) `because` succCong (ih sl su)-        ===   sS sk %:+ (sl %:+ su)   `because` sym (plusSuccL sk (sl %:+ su))+        start ((sS sk %+ sl) %+ su)+        ===   (sS (sk %+ sl) %+ su) `because` plusCongL (plusSuccL sk sl) su+        ===   sS (sk %+ sl %+ su)   `because` plusSuccL (sk %+ sl) su+        ===   sS (sk %+ (sl %+ su)) `because` succCong (ih sl su)+        ===   sS sk %+ (sl %+ su)   `because` sym (plusSuccL sk (sl %+ su))  -  multZeroL :: Sing n -> Zero nat :* n :~: Zero nat+  multZeroL :: Sing n -> Zero nat * n :~: Zero nat   multZeroL sn0 = multZeroLProof $ induction base step sn0     where       base :: MultZeroL (Zero nat)@@ -237,41 +253,41 @@        step :: Sing (k :: nat) -> MultZeroL k ->  MultZeroL (S k)       step sk (MultZeroL ih) = MultZeroL $-        start (sZero %:* sS sk)-        === sZero %:* sk %:+ sZero  `because` multSuccR sZero sk-        === sZero %:* sk            `because` plusZeroR (sZero %:* sk)+        start (sZero %* sS sk)+        === sZero %* sk %+ sZero  `because` multSuccR sZero sk+        === sZero %* sk            `because` plusZeroR (sZero %* sk)         === sZero                   `because` ih -  multSuccL :: Sing (n :: nat) -> Sing m -> S n :* m :~: n :* m :+ m+  multSuccL :: Sing (n :: nat) -> Sing m -> S n * m :~: n * m + m   multSuccL sn0 sm0 = multSuccLProof (induction base step sm0) sn0     where       base :: MultSuccL (Zero nat)       base = MultSuccL $ \sk ->-        start (sS sk %:* sZero)+        start (sS sk %* sZero)           === sZero                  `because` multZeroR (sS sk)-          === sk %:* sZero           `because` sym (multZeroR sk)-          === sk %:* sZero %:+ sZero `because` sym (plusZeroR (sk %:* sZero))+          === sk %* sZero           `because` sym (multZeroR sk)+          === sk %* sZero %+ sZero `because` sym (plusZeroR (sk %* sZero))        step :: Sing (m :: nat) -> MultSuccL m -> MultSuccL (S m)       step sm (MultSuccL ih) = MultSuccL $ \sk ->-        start (sS sk %:* sS sm)-          === sS sk %:* sm       %:+ sS sk+        start (sS sk %* sS sm)+          === sS sk %* sm       %+ sS sk               `because` multSuccR (sS sk) sm-          === (sk %:* sm %:+ sm) %:+ sS sk+          === (sk %* sm %+ sm) %+ sS sk               `because` plusCongL (ih sk) (sS sk)-          === sS ((sk %:* sm %:+ sm) %:+ sk)-              `because` plusSuccR (sk %:* sm %:+ sm) sk-          === sS (sk %:* sm %:+ (sm %:+ sk))-              `because` succCong (plusAssoc (sk %:* sm) sm sk)-          === sS (sk %:* sm %:+ (sk %:+ sm))-              `because` succCong (plusCongR (sk %:* sm) (plusComm sm sk))-          === sS ((sk %:* sm %:+ sk) %:+ sm)-              `because` succCong (sym $ plusAssoc (sk %:* sm) sk sm)-          === sS ((sk %:* sS sm) %:+ sm)+          === sS ((sk %* sm %+ sm) %+ sk)+              `because` plusSuccR (sk %* sm %+ sm) sk+          === sS (sk %* sm %+ (sm %+ sk))+              `because` succCong (plusAssoc (sk %* sm) sm sk)+          === sS (sk %* sm %+ (sk %+ sm))+              `because` succCong (plusCongR (sk %* sm) (plusComm sm sk))+          === sS ((sk %* sm %+ sk) %+ sm)+              `because` succCong (sym $ plusAssoc (sk %* sm) sk sm)+          === sS ((sk %* sS sm) %+ sm)               `because` succCong (plusCongL (sym $ multSuccR sk sm) sm)-          === sk %:* sS sm %:+ sS sm `because` sym (plusSuccR (sk %:* sS sm) sm)+          === sk %* sS sm %+ sS sm `because` sym (plusSuccR (sk %* sS sm) sm) -  multZeroR :: Sing n -> n :* Zero nat :~: Zero nat+  multZeroR :: Sing n -> n * Zero nat :~: Zero nat   multZeroR sn0 = multZeroRProof $ induction base step sn0     where       base :: MultZeroR (Zero nat)@@ -279,180 +295,180 @@        step :: Sing (k :: nat) -> MultZeroR k ->  MultZeroR (S k)       step sk (MultZeroR ih) = MultZeroR $-        start (sS sk %:* sZero)-        === sk %:* sZero %:+ sZero  `because` multSuccL sk sZero-        === sk %:* sZero            `because` plusZeroR (sk %:* sZero)+        start (sS sk %* sZero)+        === sk %* sZero %+ sZero  `because` multSuccL sk sZero+        === sk %* sZero            `because` plusZeroR (sk %* sZero)         === sZero                   `because` ih -  multSuccR :: Sing n -> Sing m -> n :* S m :~: n :* m :+ (n :: nat)+  multSuccR :: Sing n -> Sing m -> n * S m :~: n * m + (n :: nat)   multSuccR sn0 = multSuccRProof $ induction base step sn0     where       base :: MultSuccR (Zero nat)       base = MultSuccR $ \sk ->-        start (sZero %:* sS sk)+        start (sZero %* sS sk)           === sZero               `because` multZeroL (sS sk)-          === sZero %:* sk+          === sZero %* sk               `because` sym (multZeroL sk)-          === sZero %:* sk %:+ sZero-              `because` sym (plusZeroR (sZero %:* sk))+          === sZero %* sk %+ sZero+              `because` sym (plusZeroR (sZero %* sk))         step :: Sing (n :: nat) -> MultSuccR n -> MultSuccR (S n)       step sn (MultSuccR ih) = MultSuccR $ \sk ->-        start (sS sn %:* sS sk)-          === sn %:* sS sk %:+ sS sk+        start (sS sn %* sS sk)+          === sn %* sS sk %+ sS sk               `because` multSuccL sn (sS sk)-          === sS (sn %:* sS sk %:+ sk)-              `because` plusSuccR (sn %:* sS sk) sk-          === sS (sn %:* sk %:+ sn %:+ sk)+          === sS (sn %* sS sk %+ sk)+              `because` plusSuccR (sn %* sS sk) sk+          === sS (sn %* sk %+ sn %+ sk)               `because` succCong (plusCongL (ih sk) sk)-          === sS (sn %:* sk %:+ (sn %:+ sk))-              `because` succCong (plusAssoc (sn %:* sk) sn sk)-          === sS (sn %:* sk %:+ (sk %:+ sn))-              `because` succCong (plusCongR (sn %:* sk) (plusComm sn sk))-          === sS (sn %:* sk %:+ sk %:+ sn)-              `because` succCong (sym $ plusAssoc (sn %:* sk) sk sn)-          === sS (sS sn %:* sk %:+ sn)+          === sS (sn %* sk %+ (sn %+ sk))+              `because` succCong (plusAssoc (sn %* sk) sn sk)+          === sS (sn %* sk %+ (sk %+ sn))+              `because` succCong (plusCongR (sn %* sk) (plusComm sn sk))+          === sS (sn %* sk %+ sk %+ sn)+              `because` succCong (sym $ plusAssoc (sn %* sk) sk sn)+          === sS (sS sn %* sk %+ sn)               `because` succCong (plusCongL (sym $ multSuccL sn sk) sn)-          === sS sn %:* sk %:+ sS sn-              `because` sym (plusSuccR (sS sn %:* sk) sn)+          === sS sn %* sk %+ sS sn+              `because` sym (plusSuccR (sS sn %* sk) sn)  -  multComm  :: Sing (n :: nat) -> Sing m -> n :* m :~: m :* n+  multComm  :: Sing (n :: nat) -> Sing m -> n * m :~: m * n   multComm sn0 = commProof (induction base step sn0)     where-      base :: Comm (:*$$) (Zero nat)+      base :: Comm (*@#@$$) (Zero nat)       base = Comm $ \sk ->-        start (sZero %:* sk)+        start (sZero %* sk)           === sZero           `because` multZeroL sk-          === sk %:* sZero    `because` sym (multZeroR sk)+          === sk %* sZero    `because` sym (multZeroR sk) -      step :: Sing (n :: nat) -> Comm (:*$$) n -> Comm (:*$$) (S n)+      step :: Sing (n :: nat) -> Comm (*@#@$$) n -> Comm (*@#@$$) (S n)       step sn (Comm ih) = Comm $ \sk ->-        start (sS sn %:* sk)-          === sn %:* sk %:+ sk `because` multSuccL sn sk-          === sk %:* sn %:+ sk `because` plusCongL (ih sk) sk-          === sk %:* sS sn     `because` sym (multSuccR sk sn)+        start (sS sn %* sk)+          === sn %* sk %+ sk `because` multSuccL sn sk+          === sk %* sn %+ sk `because` plusCongL (ih sk) sk+          === sk %* sS sn     `because` sym (multSuccR sk sn) -  multOneR :: Sing n -> n :* One nat :~: n+  multOneR :: Sing n -> n * One nat :~: n   multOneR sn =-    start (sn %:* sOne)-      === sn %:* sS sZero      `because` multCongR sn (sym $ succOneCong)-      === sn %:* sZero %:+ sn  `because` multSuccR sn sZero-      === sZero %:+ sn         `because` plusCongL (multZeroR sn) sn+    start (sn %* sOne)+      === sn %* sS sZero      `because` multCongR sn (sym $ succOneCong)+      === sn %* sZero %+ sn  `because` multSuccR sn sZero+      === sZero %+ sn         `because` plusCongL (multZeroR sn) sn       === sn                   `because` plusZeroL sn -  multOneL :: Sing n -> One nat :* n :~: n+  multOneL :: Sing n -> One nat * n :~: n   multOneL sn =-    start (sOne %:* sn)-      === sn %:* sOne   `because` multComm sOne sn+    start (sOne %* sn)+      === sn %* sOne   `because` multComm sOne sn       === sn            `because` multOneR sn    plusMultDistrib :: Sing (n :: nat) -> Sing m -> Sing l-                -> (n :+ m) :* l :~: n :* l :+ m :* l+                -> (n + m) * l :~: (n * l) + (m * l)   plusMultDistrib sn0 = plusMultDistribProof $ induction base step sn0     where       base :: PlusMultDistrib (Zero nat)       base = PlusMultDistrib $ \sk sl ->-        start ((sZero %:+ sk) %:* sl)-          === (sk %:* sl)+        start ((sZero %+ sk) %* sl)+          === (sk %* sl)               `because` multCongL (plusZeroL sk) sl-          === sZero %:+ (sk %:* sl)-              `because` sym (plusZeroL (sk %:* sl))-          === sZero %:* sl %:+ sk %:* sl-              `because` plusCongL (sym $ multZeroL sl) (sk %:* sl)+          === sZero %+ (sk %* sl)+              `because` sym (plusZeroL (sk %* sl))+          === sZero %* sl %+ sk %* sl+              `because` plusCongL (sym $ multZeroL sl) (sk %* sl)        step :: Sing (n :: nat) -> PlusMultDistrib n -> PlusMultDistrib (S n)       step sn (PlusMultDistrib ih) = PlusMultDistrib $ \sk sl ->-        start ((sS sn %:+ sk) %:* sl)-          === (sS (sn %:+ sk) %:* sl)           `because` multCongL (plusSuccL sn sk) sl-          === (sn %:+ sk) %:* sl %:+ sl         `because` multSuccL (sn %:+ sk) sl-          === (sn %:* sl %:+ sk %:* sl) %:+ sl  `because` plusCongL (ih sk sl) sl-          === sn %:* sl %:+ (sk %:* sl %:+ sl)  `because` plusAssoc (sn %:* sl) (sk %:* sl) sl-          === sn %:* sl %:+ (sl %:+ sk %:* sl)  `because` plusCongR (sn %:* sl) (plusComm (sk %:* sl) sl)-          === (sn %:* sl %:+ sl) %:+ sk %:* sl  `because` sym (plusAssoc (sn %:* sl) sl (sk %:* sl))-          === (sS sn %:* sl) %:+ sk %:* sl      `because` plusCongL (sym $ multSuccL sn sl) (sk %:* sl)+        start ((sS sn %+ sk) %* sl)+          === (sS (sn %+ sk) %* sl)           `because` multCongL (plusSuccL sn sk) sl+          === (sn %+ sk) %* sl %+ sl         `because` multSuccL (sn %+ sk) sl+          === ((sn %* sl) %+ (sk %* sl)) %+ sl  `because` plusCongL (ih sk sl) sl+          === sn %* sl %+ (sk %* sl %+ sl)  `because` plusAssoc (sn %* sl) (sk %* sl) sl+          === sn %* sl %+ (sl %+ (sk %* sl))  `because` plusCongR (sn %* sl) (plusComm (sk %* sl) sl)+          === (sn %* sl %+ sl) %+ (sk %* sl)  `because` sym (plusAssoc (sn %* sl) sl (sk %* sl))+          === (sS sn %* sl) %+ (sk %* sl)     `because` plusCongL (sym $ multSuccL sn sl) (sk %* sl)    multPlusDistrib :: Sing (n :: nat) -> Sing m -> Sing l-                -> n :* (m :+ l) :~: n :* m :+ n :* l+                -> n * (m + l) :~: (n * m) + (n * l)   multPlusDistrib n m l =-    start (n %:* (m %:+ l))-      === (m %:+ l) %:* n     `because` multComm n (m %:+ l)-      === m %:* n %:+ l %:* n `because` plusMultDistrib m l n-      === n %:* m %:+ n %:* l `because` plusCong (multComm m n) (multComm l n)+    start (n %* (m %+ l))+      === (m %+ l) %* n     `because` multComm n (m %+ l)+      === m %* n %+ l %* n `because` plusMultDistrib m l n+      === n %* m %+ n %* l `because` plusCong (multComm m n) (multComm l n) -  minusNilpotent :: Sing n -> n :- n :~: Zero nat+  minusNilpotent :: Sing n -> n - n :~: Zero nat   minusNilpotent n =-    start (n %:- n)-      === (sZero %:+ n) %:- n  `because` minusCongL (sym $ plusZeroL n) n+    start (n %- n)+      === (sZero %+ n) %- n  `because` minusCongL (sym $ plusZeroL n) n       === sZero                `because` plusMinus sZero n    multAssoc :: Sing (n :: nat) -> Sing m -> Sing l-            -> (n :* m) :* l :~: n :* (m :* l)+            -> (n * m) * l :~: n * (m * l)   multAssoc sn0 = assocProof $ induction base step sn0     where-      base :: Assoc (:*$$) (Zero nat)+      base :: Assoc (*@#@$$) (Zero nat)       base = Assoc $ \ m l ->-        start (sZero %:* m %:* l)-          === sZero %:* l  `because` multCongL (multZeroL m) l+        start (sZero %* m %* l)+          === sZero %* l  `because` multCongL (multZeroL m) l           === sZero        `because` multZeroL l-          === sZero %:*  (m %:* l) `because` sym (multZeroL (m %:* l))+          === sZero %*  (m %* l) `because` sym (multZeroL (m %* l)) -      step :: Sing (n :: nat) -> Assoc (:*$$) n -> Assoc (:*$$) (S n)+      step :: Sing (n :: nat) -> Assoc (*@#@$$) n -> Assoc (*@#@$$) (S n)       step n _ = Assoc $ \ m l ->-        start (sS n %:* m %:* l)-          === (n %:* m %:+ m) %:* l        `because` multCongL (multSuccL n m) l-          === n %:* m %:* l %:+ m %:* l    `because` plusMultDistrib (n %:* m) m l-          === n %:* (m %:* l) %:+ m %:* l  `because` plusCongL (multAssoc n m l) (m %:* l)-          === sS n %:* (m %:* l)           `because` sym (multSuccL n (m %:* l))+        start (sS n %* m %* l)+          === (n %* m %+ m) %* l        `because` multCongL (multSuccL n m) l+          === n %* m %* l %+ m %* l    `because` plusMultDistrib (n %* m) m l+          === n %* (m %* l) %+ m %* l  `because` plusCongL (multAssoc n m l) (m %* l)+          === sS n %* (m %* l)           `because` sym (multSuccL n (m %* l)) -  plusEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> n :+ m :~: n :+ l -> m :~: l+  plusEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> n + m :~: n + l -> m :~: l   plusEqCancelL = plusEqCancelLProof . induction base step     where       base :: PlusEqCancelL (Zero nat)       base = PlusEqCancelL $ \l m nlnm ->-        start l === sZero %:+ l `because` sym (plusZeroL l)-                === sZero %:+ m `because` nlnm+        start l === sZero %+ l `because` sym (plusZeroL l)+                === sZero %+ m `because` nlnm                 === m           `because` plusZeroL m        step :: Sing (n :: nat) -> PlusEqCancelL n -> PlusEqCancelL (Succ n)       step n (PlusEqCancelL ih) = PlusEqCancelL $ \l m snlsnm ->         succInj $ ih (sS l) (sS m) $-          start (n %:+ sS l)-            ===  sS (n %:+ l)  `because` plusSuccR n l-            ===  sS n %:+ l    `because` sym (plusSuccL n l)-            ===  sS n %:+ m    `because` snlsnm-            ===  sS (n %:+ m)  `because` plusSuccL n m-            ===  n %:+ sS m    `because` sym (plusSuccR n m)+          start (n %+ sS l)+            ===  sS (n %+ l)  `because` plusSuccR n l+            ===  sS n %+ l    `because` sym (plusSuccL n l)+            ===  sS n %+ m    `because` snlsnm+            ===  sS (n %+ m)  `because` plusSuccL n m+            ===  n %+ sS m    `because` sym (plusSuccR n m) -  plusEqCancelR :: forall n m l . Sing (n :: nat) -> Sing m -> Sing l -> n :+ l :~: m :+ l -> n :~: m+  plusEqCancelR :: forall n m l . Sing (n :: nat) -> Sing m -> Sing l -> n + l :~: m + l -> n :~: m   plusEqCancelR n m l nlml = plusEqCancelL l n m $-    start (l %:+ n)-      === (n %:+ l) `because` plusComm l n-      === (m %:+ l) `because` nlml-      === (l %:+ m) `because` plusComm m l+    start (l %+ n)+      === (n %+ l) `because` plusComm l n+      === (m %+ l) `because` nlml+      === (l %+ m) `because` plusComm m l -  succAndPlusOneL :: Sing n -> Succ n :~: One nat :+ n+  succAndPlusOneL :: Sing n -> Succ n :~: One nat + n   succAndPlusOneL = proofSuccPlusL . induction base step     where       base :: SuccPlusL (Zero nat)       base = SuccPlusL $              start (sSucc sZero)                === sOne           `because` succOneCong-               === sOne %:+ sZero `because` sym (plusZeroR sOne)+               === sOne %+ sZero `because` sym (plusZeroR sOne)        step :: Sing (n :: nat) -> SuccPlusL n -> SuccPlusL (Succ n)       step sn (SuccPlusL ih) = SuccPlusL $         start (sSucc (sSucc sn))-          === sSucc (sOne %:+ sn) `because` succCong ih-          === sOne %:+ sSucc sn   `because` sym (plusSuccR sOne sn)+          === sSucc (sOne %+ sn) `because` succCong ih+          === sOne %+ sSucc sn   `because` sym (plusSuccR sOne sn) -  succAndPlusOneR :: Sing n -> Succ n :~: n :+ One nat+  succAndPlusOneR :: Sing n -> Succ n :~: n + One nat   succAndPlusOneR n =     start (sSucc n)-      === sOne %:+ n `because` succAndPlusOneL n-      === n %:+ sOne `because` plusComm sOne n+      === sOne %+ n `because` succAndPlusOneL n+      === n %+ sOne `because` plusComm sOne n    predSucc :: Sing n -> Pred (Succ n) :~: (n :: nat) @@ -462,13 +478,13 @@       base = IsZero       step sn _ = IsSucc sn -  plusEqZeroL :: Sing n -> Sing m -> n :+ m :~: Zero nat -> n :~: Zero nat+  plusEqZeroL :: Sing n -> Sing m -> n + m :~: Zero nat -> n :~: Zero nat   plusEqZeroL n m Refl =     case zeroOrSucc n of-      IsZero -> Refl-      IsSucc pn -> absurd $ succNonCyclic (pn %:+ m) (sym $ plusSuccL pn m)+      IsZero    -> Refl+      IsSucc pn -> absurd $ succNonCyclic (pn %+ m) (sym $ plusSuccL pn m) -  plusEqZeroR :: Sing n -> Sing m -> n :+ m :~: Zero nat -> m :~: Zero nat+  plusEqZeroR :: Sing n -> Sing m -> n + m :~: Zero nat -> m :~: Zero nat   plusEqZeroR n m = plusEqZeroL m n . trans (plusComm m n)    predUnique :: Sing (n :: nat) -> Sing m -> Succ n :~: m -> n :~: Pred m@@ -476,66 +492,75 @@     start n === (sPred (sSucc n)) `because` sym (predSucc n)             === sPred m           `because` predCong snEm -  multEqSuccElimL :: Sing (n :: nat) -> Sing m -> Sing l -> n :* m :~: Succ l -> n :~: Succ (Pred n)+  multEqSuccElimL :: Sing (n :: nat) -> Sing m -> Sing l -> n * m :~: Succ l -> n :~: Succ (Pred n)   multEqSuccElimL n m l nmEsl =     case zeroOrSucc n of       IsZero -> absurd $ succNonCyclic l $ sym $-                start sZero === sZero %:* m `because` sym (multZeroL m)+                start sZero === sZero %* m `because` sym (multZeroL m)                             === sSucc l     `because` nmEsl       IsSucc pn -> succCong (predUnique pn n Refl) -  multEqSuccElimR :: Sing (n :: nat) -> Sing m -> Sing l -> n :* m :~: Succ l -> m :~: Succ (Pred m)+  multEqSuccElimR :: Sing (n :: nat) -> Sing m -> Sing l -> n * m :~: Succ l -> m :~: Succ (Pred m)   multEqSuccElimR n m l nmEsl =     multEqSuccElimL m n l (multComm m n `trans` nmEsl) -  minusZero :: Sing n -> n :- Zero nat :~: n+  minusZero :: Sing n -> n - Zero nat :~: n   minusZero n =-    start (n %:- sZero)-      === (n %:+ sZero) %:- sZero+    start (n %- sZero)+      === (n %+ sZero) %- sZero              `because` minusCongL (sym $ plusZeroR n) sZero       === n  `because` plusMinus n sZero -  multEqCancelR :: Sing (n :: nat) -> Sing m -> Sing l -> n :* Succ l :~: m :* Succ l -> n :~: m+  multEqCancelR :: Sing (n :: nat) -> Sing m -> Sing l -> n * Succ l :~: m * Succ l -> n :~: m   multEqCancelR = proofMultEqCancelR . induction base step     where       base :: MultEqCancelR (Zero nat)       base = MultEqCancelR $ \m l zslmsl ->-        sym $ plusEqZeroR (m %:* l) m $ sym $ start sZero-          === sZero %:* l            `because` sym (multZeroL l)-          === sZero %:* l %:+ sZero  `because` sym (plusZeroR (sZero %:* l))-          === sZero %:* sSucc l      `because` sym (multSuccR sZero l)-          === m     %:* sSucc l      `because` zslmsl-          === m %:* l %:+ m          `because` multSuccR m l+        sym $ plusEqZeroR (m %* l) m $ sym $ start sZero+          === sZero %* l            `because` sym (multZeroL l)+          === sZero %* l %+ sZero  `because` sym (plusZeroR (sZero %* l))+          === sZero %* sSucc l      `because` sym (multSuccR sZero l)+          === m     %* sSucc l      `because` zslmsl+          === m %* l %+ m          `because` multSuccR m l        step :: Sing (n :: nat) -> MultEqCancelR n -> MultEqCancelR (Succ n)       step n (MultEqCancelR ih) = MultEqCancelR $ \m l snmssnl ->         let m' = sPred m-            pf = start (m %:* sSucc l)-                   === sSucc n %:* sSucc l         `because` sym snmssnl-                   === n %:* sSucc l %:+ sSucc l   `because` multSuccL n (sSucc l)-                   === sSucc (n %:* sSucc l %:+ l) `because` plusSuccR (n %:* sSucc l) l-            sm'Em = multEqSuccElimL m (sSucc l) (n %:* sSucc l %:+ l) pf-            pf' = ih m' l $ plusEqCancelR (n %:* sSucc l) (m' %:* sSucc l) (sSucc l) $-                  start (n %:* sSucc l %:+ sSucc l)-                    === sSucc (n %:* sSucc l %:+ l)  `because` plusSuccR (n %:* sSucc l) l-                    === m %:* sSucc l                `because` sym pf-                    === sSucc m' %:* sSucc l         `because` multCongL sm'Em (sSucc l)-                    === (m' %:* sSucc l %:+ sSucc l) `because` multSuccL m' (sSucc l)+            pf = start (m %* sSucc l)+                   === sSucc n %* sSucc l         `because` sym snmssnl+                   === n %* sSucc l %+ sSucc l   `because` multSuccL n (sSucc l)+                   === sSucc (n %* sSucc l %+ l) `because` plusSuccR (n %* sSucc l) l+            sm'Em = multEqSuccElimL m (sSucc l) (n %* sSucc l %+ l) pf+            pf' = ih m' l $ plusEqCancelR (n %* sSucc l) (m' %* sSucc l) (sSucc l) $+                  start (n %* sSucc l %+ sSucc l)+                    === sSucc (n %* sSucc l %+ l)  `because` plusSuccR (n %* sSucc l) l+                    === m %* sSucc l                `because` sym pf+                    === sSucc m' %* sSucc l         `because` multCongL sm'Em (sSucc l)+                    === (m' %* sSucc l %+ sSucc l) `because` multSuccL m' (sSucc l)         in succCong pf' `trans` sym sm'Em    succPred :: Sing n -> (n :~: Zero nat -> Void) -> Succ (Pred n) :~: n   succPred n nonZero =     case zeroOrSucc n of-      IsZero -> absurd $ nonZero Refl+      IsZero    -> absurd $ nonZero Refl       IsSucc n' -> sym $ succCong $ predUnique n' n Refl -  multEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> Succ n :* m :~: Succ n :* l -> m :~: l+  multEqCancelL :: Sing (n :: nat) -> Sing m -> Sing l -> Succ n * m :~: Succ n * l -> m :~: l   multEqCancelL n m l snmEsnl =     multEqCancelR m l n $     multComm m (sSucc n) `trans` snmEsnl `trans` multComm (sSucc n) l    sPred' :: proxy n -> Sing (Succ n) -> Sing (n :: nat)   sPred' pxy sn = coerce (succInj $ succCong $ predSucc (sPred' pxy sn)) (sPred sn)++  toNatural :: Sing (n :: nat) -> Natural+  toNatural = getConst . induction (Const 0) (\_ (Const k) -> (Const k + 1))++  fromNatural :: Natural -> SomeSing nat+  fromNatural 0 = SomeSing sZero+  fromNatural n =+    case fromNatural (n - 1) of+      SomeSing sn -> SomeSing (Succ sn)  pattern Zero :: forall nat (n :: nat). IsPeano nat => n ~ Zero nat => Sing n pattern Zero <- (zeroOrSucc -> IsZero) where
Data/Type/Natural/Class/Order.hs view
@@ -1,44 +1,59 @@-{-# LANGUAGE DataKinds, EmptyCase, ExplicitForAll, FlexibleContexts         #-}-{-# LANGUAGE FlexibleInstances, GADTs, KindSignatures                       #-}+{-# LANGUAGE DataKinds, EmptyCase, ExplicitForAll, ExplicitNamespaces       #-}+{-# LANGUAGE FlexibleContexts, FlexibleInstances, GADTs, KindSignatures     #-} {-# LANGUAGE MultiParamTypeClasses, PatternSynonyms, PolyKinds, RankNTypes  #-} {-# LANGUAGE ScopedTypeVariables, TemplateHaskell, TypeFamilies, TypeInType #-} module Data.Type.Natural.Class.Order        (PeanoOrder(..), DiffNat(..), LeqView(..),         FlipOrdering, sFlipOrdering, coerceLeqL, coerceLeqR,         sLeqCongL, sLeqCongR, sLeqCong,-        (:-.), (%:-.), minPlusTruncMinus, truncMinusLeq+        type (-.), (%-.), minPlusTruncMinus, truncMinusLeq,+        module Data.Type.Natural.Singleton.Compat        ) where import Data.Type.Natural.Class.Arithmetic+import Data.Type.Natural.Singleton.Compat (type (<), type (<=), type (<=@#@$),+                                           type (<=@#@$$), type (<=@#@$$$),+                                           type (<@#@$), type (<@#@$$),+                                           type (<@#@$$$), type (>), type (>=),+                                           type (>=@#@$), type (>=@#@$$),+                                           type (>=@#@$$$), type (>@#@$),+                                           type (>@#@$$), type (>@#@$$$),+                                           type Min, type Max, type Compare,+                                           type MinSym0, type MinSym1, type MinSym2,+                                           type MaxSym0, type MaxSym1, type MaxSym2,+                                           type CompareSym0, type CompareSym1, type CompareSym2,+                                           Sing (SLT, SEQ, SGT), SOrd(..), POrd(..),+                                           LTSym0, GTSym0, EQSym0,+                                           (%<), (%<=), (%>), (%>=)) -import Data.Singletons.Decide-import Data.Singletons.Prelude-import Data.Singletons.Prelude.Enum-import Data.Singletons.TH-import Data.Type.Equality-import Data.Void-import Proof.Equational-import Proof.Propositional+import Data.Singletons.Prelude      (Sing (SFalse, STrue), sing, withSingI)+import Data.Singletons.Prelude.Enum (Pred, SEnum (..), Succ)+import Data.Singletons.TH           (singletonsOnly)+import Data.Type.Equality           ((:~:) (..))+import Data.Void                    (Void, absurd)+import Proof.Equational             (because, coerce, start, sym, trans,+                                     withRefl, (===), (=~=))+import Proof.Propositional          (IsTrue (..), eliminate, withWitness)  data LeqView (n :: nat) (m :: nat) where   LeqZero :: Sing n -> LeqView (Zero nat) n-  LeqSucc :: Sing n -> Sing m -> IsTrue (n :<= m) -> LeqView (Succ n) (Succ m)+  LeqSucc :: Sing n -> Sing m -> IsTrue (n <= m) -> LeqView (Succ n) (Succ m)  data DiffNat n m where-  DiffNat :: Sing n -> Sing m -> DiffNat n (n :+ m)+  DiffNat :: Sing n -> Sing m -> DiffNat n (n + m) -newtype LeqWitPf n = LeqWitPf { leqWitPf :: forall m. Sing m -> IsTrue (n :<= m) -> DiffNat n m }-newtype LeqStepPf n = LeqStepPf { leqStepPf :: forall m l. Sing m -> Sing l -> n :+ l :~: m -> IsTrue (n :<= m) }+newtype LeqWitPf n = LeqWitPf { leqWitPf :: forall m. Sing m -> IsTrue (n <= m) -> DiffNat n m }+newtype LeqStepPf n = LeqStepPf { leqStepPf :: forall m l. Sing m -> Sing l -> n + l :~: m -> IsTrue (n <= m) }  succDiffNat :: IsPeano nat             => Sing n -> Sing m -> DiffNat (n :: nat) m -> DiffNat (Succ n) (Succ m) succDiffNat _ _ (DiffNat n m) = coerce (plusSuccL n m) $ DiffNat (sSucc n) m  coerceLeqL :: forall (n :: nat) m l . IsPeano nat => n :~: m -> Sing l-           -> IsTrue (n :<= l) -> IsTrue (m :<= l)+           -> IsTrue (n <= l) -> IsTrue (m <= l) coerceLeqL Refl _ Witness = Witness  coerceLeqR :: forall (n :: nat) m l . IsPeano nat =>  Sing l -> n :~: m-           -> IsTrue (l :<= n) -> IsTrue (l :<= m)+           -> IsTrue (l <= n) -> IsTrue (l <= m) coerceLeqR _ Refl Witness = Witness  singletonsOnly [d|@@ -54,13 +69,13 @@ compareCongR :: Sing (a :: k) -> b :~: c -> Compare a b :~: Compare a c compareCongR _ Refl = Refl -sLeqCong :: a :~: b -> c :~: d -> (a :<= c) :~: (b :<= d)+sLeqCong :: a :~: b -> c :~: d -> (a <= c) :~: (b <= d) sLeqCong Refl Refl = Refl -sLeqCongL :: a :~: b -> Sing c -> (a :<= c) :~: (b :<= c)+sLeqCongL :: a :~: b -> Sing c -> (a <= c) :~: (b <= c) sLeqCongL Refl _ = Refl -sLeqCongR :: Sing a -> b :~: c -> (a :<= b) :~: (a :<= c)+sLeqCongR :: Sing a -> b :~: c -> (a <= b) :~: (a <= c) sLeqCongR _ Refl = Refl  newtype LTSucc n = LTSucc { proofLTSucc :: Compare n (Succ n) :~: 'LT }@@ -83,7 +98,7 @@               (leqToMin, geqToMin | minLeqL, minLeqR, minLargest),               (leqToMax, geqToMax | maxLeqL, maxLeqR, maxLeast) #-} -  leqToCmp :: Sing (a :: nat) -> Sing b -> IsTrue (a :<= b)+  leqToCmp :: Sing (a :: nat) -> Sing b -> IsTrue (a <= b)            -> Either (a :~: b) (Compare a b :~: 'LT)   eqlCmpEQ :: Sing (a :: nat) -> Sing b -> a :~: b -> Compare a b :~: 'EQ   eqToRefl :: Sing (a :: nat) -> Sing b -> Compare a b :~: 'EQ -> a :~: b@@ -98,49 +113,49 @@       === sCompare a b `because` sym aLTb       === SEQ          `because` eqlCmpEQ a b aEQb -  leqNeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (a :<= b) -> (a :~: b -> Void) -> Compare a b :~: 'LT+  leqNeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (a <= b) -> (a :~: b -> Void) -> Compare a b :~: 'LT   leqNeqToLT a b aLEQb aNEQb = either (absurd . aNEQb) id $ leqToCmp a b aLEQb  -  succLeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (S a :<= b) -> Compare a b :~: 'LT+  succLeqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (S a <= b) -> Compare a b :~: 'LT   succLeqToLT a b saLEQb =     case leqWitness (sSucc a) b saLEQb of       DiffNat _ k -> let aLEQb = leqStep a b (sSucc k) $-                                 start (a %:+ sSucc k)-                                   === sSucc (a %:+ k) `because` plusSuccR a k-                                   === sSucc a %:+ k   `because` sym (plusSuccL a k)+                                 start (a %+ sSucc k)+                                   === sSucc (a %+ k) `because` plusSuccR a k+                                   === sSucc a %+ k   `because` sym (plusSuccL a k)                                    =~= b                          aNEQb aeqb = succNonCyclic k $ plusEqCancelL a (sSucc k) sZero $-                                     start (a %:+ sSucc k)-                                      === sSucc (a %:+ k) `because` plusSuccR a k-                                      === (sSucc a) %:+ k `because` sym (plusSuccL a k)+                                     start (a %+ sSucc k)+                                      === sSucc (a %+ k) `because` plusSuccR a k+                                      === sSucc a %+ k `because` sym (plusSuccL a k)                                       =~= b                                       === a               `because` sym aeqb-                                      === a %:+ sZero     `because` sym (plusZeroR a)+                                      === a %+ sZero     `because` sym (plusZeroR a)                      in leqNeqToLT a b aLEQb aNEQb    ltToLeq :: Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT-          -> IsTrue (a :<= b)+          -> IsTrue (a <= b)    gtToLeq :: Sing (a :: nat) -> Sing b -> Compare a b :~: 'GT-          -> IsTrue (b :<= a)+          -> IsTrue (b <= a)   gtToLeq n m nGTm = ltToLeq m n $     start (sCompare m n) === sFlipOrdering (sCompare n m) `because` sym (flipCompare n m)                          === sFlipOrdering SGT            `because` congFlipOrdering nGTm                          =~= SLT    ltToSuccLeq :: Sing (a :: nat) -> Sing b -> Compare a b :~: 'LT-              -> IsTrue (Succ a :<= b)+              -> IsTrue (Succ a <= b)   ltToSuccLeq n m nLTm =      leqNeqToSuccLeq n m (ltToLeq n m nLTm) (ltToNeq n m nLTm)    cmpZero :: Sing a -> Compare (Zero nat) (Succ a) :~: 'LT   cmpZero sn = leqToLT sZero (sSucc sn) $ leqStep (sSucc sZero) (sSucc sn) sn $-               start (sSucc sZero %:+ sn)-                 === sSucc (sZero %:+ sn) `because` plusSuccL sZero sn+               start (sSucc sZero %+ sn)+                 === sSucc (sZero %+ sn) `because` plusSuccL sZero sn                  === sSucc sn             `because` succCong (plusZeroL sn) -  leqToGT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ b :<= a)+  leqToGT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ b <= a)               -> Compare a b :~: 'GT   leqToGT a b sbLEQa =     start (sCompare a b)@@ -189,15 +204,15 @@                DiffNat _ k ->                  sym $ succLeqToLT (sSucc n) (sSucc m) $                  leqStep (sSucc (sSucc n)) (sSucc m) k $-                 start (sSucc (sSucc n) %:+ k)-                   === sSucc (sSucc n %:+ k)    `because` plusSuccL (sSucc n) k+                 start (sSucc (sSucc n) %+ k)+                   === sSucc (sSucc n %+ k)    `because` plusSuccL (sSucc n) k                    =~= sSucc m       SGT -> case leqWitness (sSucc m) n $ ltToSuccLeq m n (sym $ flipCompare n m) of                DiffNat _ k ->                  let pf = (succLeqToLT (sSucc m) (sSucc n) $                           leqStep (sSucc (sSucc m)) (sSucc n) k $-                          start (sSucc (sSucc m) %:+ k)-                            === sSucc (sSucc m %:+ k)    `because` plusSuccL (sSucc m) k+                          start (sSucc (sSucc m) %+ k)+                            === sSucc (sSucc m %+ k)    `because` plusSuccL (sSucc m) k                             =~= sSucc n)                  in start (sCompare n m)                       =~= SGT@@ -245,7 +260,7 @@         in start (sCompare n (sSucc m'))              === SLT `because` cmpSuccStepR n m' nLTm -  leqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ a :<= b)+  leqToLT :: Sing (a :: nat) -> Sing b -> IsTrue (Succ a <= b)            -> Compare a b :~: 'LT   leqToLT n m snLEQm =     case leqToCmp (sSucc n) m snLEQm of@@ -255,20 +270,20 @@           === SLT `because` ltSucc n       Right nLTm -> ltSuccLToLT n m nLTm -  leqZero :: Sing n -> IsTrue (Zero nat :<= n)+  leqZero :: Sing n -> IsTrue (Zero nat <= n)   leqZero sn =     case zeroOrSucc sn of-      IsZero   -> leqRefl sn+      IsZero    -> leqRefl sn       IsSucc pn -> ltToLeq sZero sn $ cmpZero pn -  leqSucc :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (Succ n :<= Succ m)+  leqSucc :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (Succ n <= Succ m)   leqSucc n m nLEQm =     case leqToCmp n m nLEQm of       Left  eql  -> withRefl eql $ leqRefl (sSucc n)       Right nLTm -> ltToLeq (sSucc n) (sSucc m) $ sym (cmpSucc n m) `trans` nLTm -  fromLeqView :: LeqView (n :: nat) m -> IsTrue (n :<= m)-  fromLeqView (LeqZero n) = leqZero n+  fromLeqView :: LeqView (n :: nat) m -> IsTrue (n <= m)+  fromLeqView (LeqZero n)         = leqZero n   fromLeqView (LeqSucc n m nLEQm) = leqSucc n m nLEQm    leqViewRefl :: Sing (n :: nat) -> LeqView n n@@ -280,7 +295,7 @@       step n (LeqViewRefl nLEQn) =         LeqViewRefl $ LeqSucc n n (fromLeqView nLEQn) -  viewLeq :: forall n m . Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> LeqView n m+  viewLeq :: forall n m . Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> LeqView n m   viewLeq n m nLEQm =     case (zeroOrSucc n, leqToCmp n m nLEQm) of       (IsZero, _)    -> LeqZero m@@ -291,7 +306,7 @@              n'LTm' = cmpSucc n' m' `trans` compareCongR n (sym sm'EQm) `trans` nLTm          in coerce (sym sm'EQm) $ LeqSucc n' m' $ ltToLeq n' m' n'LTm' -  leqWitness :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> DiffNat n m+  leqWitness :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> DiffNat n m   leqWitness = leqWitPf . induction base step     where       base :: LeqWitPf (Zero nat)@@ -304,7 +319,7 @@           LeqSucc (_ :: Sing n') pm nLEQpm ->             succDiffNat n pm $ ih pm $ coerceLeqL (succInj Refl :: n' :~: n) pm nLEQpm -  leqStep :: Sing (n :: nat) -> Sing m -> Sing l -> n :+ l :~: m -> IsTrue (n :<= m)+  leqStep :: Sing (n :: nat) -> Sing m -> Sing l -> n + l :~: m -> IsTrue (n <= m)   leqStep = leqStepPf . induction base step     where       base :: LeqStepPf (Zero nat)@@ -314,165 +329,165 @@       step n (LeqStepPf ih) =         LeqStepPf $ \k l snPlEqk ->         let kEQspk = start k-                       === sSucc n %:+ l   `because` sym snPlEqk-                       === sSucc (n %:+ l) `because` plusSuccL n l-            pk = n %:+ l+                       === sSucc n %+ l   `because` sym snPlEqk+                       === sSucc (n %+ l) `because` plusSuccL n l+            pk = n %+ l         in coerceLeqR (sSucc n) (sym kEQspk) $ leqSucc n pk $ ih pk l Refl -  leqNeqToSuccLeq :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> (n :~: m -> Void) -> IsTrue (Succ n :<= m)+  leqNeqToSuccLeq :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> (n :~: m -> Void) -> IsTrue (Succ n <= m)   leqNeqToSuccLeq n m nLEQm nNEQm =     case leqWitness n m nLEQm of       DiffNat _ k ->         case zeroOrSucc k of           IsZero -> absurd $ nNEQm $ sym $ plusZeroR n           IsSucc k' -> leqStep (sSucc n) m k' $-            start (sSucc n %:+ k')-              === sSucc (n %:+ k') `because` plusSuccL n k'-              === n %:+ sSucc k'   `because` sym (plusSuccR n k')+            start (sSucc n %+ k')+              === sSucc (n %+ k') `because` plusSuccL n k'+              === n %+ sSucc k'   `because` sym (plusSuccR n k')               =~= m -  leqRefl :: Sing (n :: nat) -> IsTrue (n :<= n)+  leqRefl :: Sing (n :: nat) -> IsTrue (n <= n)   leqRefl sn = leqStep sn sn sZero (plusZeroR sn) -  leqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (n :<= Succ m)+  leqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (n <= Succ m)   leqSuccStepR n m nLEQm =     case leqWitness n m nLEQm of       DiffNat _ k -> leqStep n (sSucc m) (sSucc k) $-        start (n %:+ sSucc k) === sSucc (n %:+ k) `because` plusSuccR n k =~= sSucc m+        start (n %+ sSucc k) === sSucc (n %+ k) `because` plusSuccR n k =~= sSucc m -  leqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n :<= m) -> IsTrue (n :<= m)+  leqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n <= m) -> IsTrue (n <= m)   leqSuccStepL n m snLEQm =      leqTrans n (sSucc n) m (leqSuccStepR n n $ leqRefl n) snLEQm -  leqReflexive :: Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n :<= m)+  leqReflexive :: Sing (n :: nat) -> Sing m -> n :~: m -> IsTrue (n <= m)   leqReflexive n _ Refl = leqRefl n -  leqTrans :: Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n :<= m) -> IsTrue (m :<= l) -> IsTrue (n :<= l)+  leqTrans :: Sing (n :: nat) -> Sing m -> Sing l -> IsTrue (n <= m) -> IsTrue (m <= l) -> IsTrue (n <= l)   leqTrans n m k nLEm mLEk =     case leqWitness n m nLEm of       DiffNat _ mMn -> case leqWitness m k mLEk of-        DiffNat _ kMn -> leqStep n k (mMn %:+ kMn) (sym $ plusAssoc n mMn kMn)+        DiffNat _ kMn -> leqStep n k (mMn %+ kMn) (sym $ plusAssoc n mMn kMn) -  leqAntisymm :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> IsTrue (m :<= n) -> n :~: m+  leqAntisymm :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> IsTrue (m <= n) -> n :~: m   leqAntisymm n m nLEm mLEn =     case (leqWitness n m nLEm, leqWitness m n mLEn) of       (DiffNat _ mMn, DiffNat _ nMm) ->-        let pEQ0 = plusEqCancelL n (mMn %:+ nMm) sZero $-                   start (n %:+ (mMn %:+ nMm))-                     === (n %:+ mMn) %:+ nMm+        let pEQ0 = plusEqCancelL n (mMn %+ nMm) sZero $+                   start (n %+ (mMn %+ nMm))+                     === (n %+ mMn) %+ nMm                          `because` sym (plusAssoc n mMn nMm)-                     =~= m %:+ nMm+                     =~= m %+ nMm                      =~= n-                     === n %:+ sZero+                     === n %+ sZero                          `because` sym (plusZeroR n)             nMmEQ0 = plusEqZeroL mMn nMm pEQ0          in sym $ start m-             =~= n %:+ mMn-             === n %:+ sZero  `because` plusCongR n nMmEQ0+             =~= n %+ mMn+             === n %+ sZero  `because` plusCongR n nMmEQ0              === n            `because` plusZeroR n    plusMonotone :: Sing (n :: nat) -> Sing m -> Sing l -> Sing k-               -> IsTrue (n :<= m) -> IsTrue (l :<= k)-               -> IsTrue (n :+ l :<= m :+ k)+               -> IsTrue (n <= m) -> IsTrue (l <= k)+               -> IsTrue ((n + l) <= (m + k))   plusMonotone n m l k nLEm lLEk =     case (leqWitness n m nLEm, leqWitness l k lLEk) of       (DiffNat _ mMINn, DiffNat _ kMINl) ->-        let r = mMINn %:+ kMINl-        in leqStep (n %:+ l) (m %:+ k) r $-           start (n %:+ l %:+ r)-             === n %:+ (l %:+ r)+        let r = mMINn %+ kMINl+        in leqStep (n %+ l) (m %+ k) r $+           start (n %+ l %+ r)+             === n %+ (l %+ r)                  `because` plusAssoc n l r-             =~= n %:+ (l %:+ (mMINn %:+ kMINl))-             === n %:+ (l %:+ (kMINl %:+ mMINn))+             =~= n %+ (l %+ (mMINn %+ kMINl))+             === n %+ (l %+ (kMINl %+ mMINn))                  `because` plusCongR n (plusCongR l (plusComm mMINn kMINl))-             === n %:+ ((l %:+ kMINl) %:+ mMINn)+             === n %+ ((l %+ kMINl) %+ mMINn)                  `because` plusCongR n (sym $ plusAssoc l kMINl mMINn)-             =~= n %:+ (k %:+ mMINn)-             === n %:+ (mMINn %:+ k)+             =~= n %+ (k %+ mMINn)+             === n %+ (mMINn %+ k)                  `because` plusCongR n (plusComm k mMINn)-             === n %:+ mMINn %:+ k+             === n %+ mMINn %+ k                  `because` sym (plusAssoc n mMINn k)-             =~= m %:+ k+             =~= m %+ k -  leqZeroElim :: Sing n -> IsTrue (n :<= Zero nat) -> n :~: Zero nat+  leqZeroElim :: Sing n -> IsTrue (n <= Zero nat) -> n :~: Zero nat   leqZeroElim n nLE0 =     case viewLeq n sZero nLE0 of-      LeqZero _ -> Refl+      LeqZero _      -> Refl       LeqSucc _ pZ _ -> absurd $ succNonCyclic pZ Refl -  plusMonotoneL :: Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n :<= m)-           -> IsTrue (n :+ l :<= m :+ l)+  plusMonotoneL :: Sing (n :: nat) -> Sing m -> Sing (l :: nat) -> IsTrue (n <= m)+           -> IsTrue ((n + l) <= (m + l))   plusMonotoneL n m l leq = plusMonotone n m l l leq (leqRefl l) -  plusMonotoneR :: Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m :<= l)-           -> IsTrue (n :+ m :<= n :+ l)+  plusMonotoneR :: Sing n -> Sing m -> Sing (l :: nat) -> IsTrue (m <= l)+           -> IsTrue ((n + m) <= (n + l))   plusMonotoneR n m l leq = plusMonotone n n m l (leqRefl n) leq -  plusLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= n :+ m)-  plusLeqL n m = leqStep n (n %:+ m) m Refl+  plusLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n <= (n + m))+  plusLeqL n m = leqStep n (n %+ m) m Refl -  plusLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m :<= n :+ m)-  plusLeqR n m = leqStep m (n %:+ m) n $ plusComm m n+  plusLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m <= (n + m))+  plusLeqR n m = leqStep m (n %+ m) n $ plusComm m n    plusCancelLeqR :: Sing (n :: nat) -> Sing m -> Sing l-                 -> IsTrue (n :+ l :<= m :+ l)-                 -> IsTrue (n :<= m)+                 -> IsTrue ((n + l) <= (m + l))+                 -> IsTrue (n <= m)   plusCancelLeqR n m l nlLEQml =-    case leqWitness (n %:+ l) (m %:+ l) nlLEQml of+    case leqWitness (n %+ l) (m %+ l) nlLEQml of       DiffNat _ k ->-        let pf = plusEqCancelR (n %:+ k) m l $-                 start ((n %:+ k) %:+ l)-                   === n %:+ (k %:+ l) `because` plusAssoc n k l-                   === n %:+ (l %:+ k) `because` plusCongR n (plusComm k l)-                   === n %:+ l %:+ k   `because` sym (plusAssoc n l k)-                   =~= m %:+ l+        let pf = plusEqCancelR (n %+ k) m l $+                 start ((n %+ k) %+ l)+                   === n %+ (k %+ l) `because` plusAssoc n k l+                   === n %+ (l %+ k) `because` plusCongR n (plusComm k l)+                   === n %+ l %+ k   `because` sym (plusAssoc n l k)+                   =~= m %+ l         in leqStep n m k pf    plusCancelLeqL :: Sing (n :: nat) -> Sing m -> Sing l-                 -> IsTrue (n :+ m :<= n :+ l)-                 -> IsTrue (m :<= l)+                 -> IsTrue ((n + m) <= (n + l))+                 -> IsTrue (m <= l)   plusCancelLeqL n m l nmLEQnl =     plusCancelLeqR m l n $-    coerceLeqL (plusComm n m) (l %:+ n) $-    coerceLeqR (n %:+ m) (plusComm n l) nmLEQnl+    coerceLeqL (plusComm n m) (l %+ n) $+    coerceLeqR (n %+ m) (plusComm n l) nmLEQnl -  succLeqZeroAbsurd :: Sing n -> IsTrue (S n :<= Zero nat) -> Void+  succLeqZeroAbsurd :: Sing n -> IsTrue (S n <= Zero nat) -> Void   succLeqZeroAbsurd n leq =     succNonCyclic n (leqZeroElim (sSucc n) leq) -  succLeqZeroAbsurd' :: Sing n -> (S n :<= Zero nat) :~: 'False+  succLeqZeroAbsurd' :: Sing n -> (S n <= Zero nat) :~: 'False   succLeqZeroAbsurd' n =-    case sSucc n %:<= sZero of+    case sSucc n %<= sZero of       STrue  -> absurd $ succLeqZeroAbsurd n Witness       SFalse -> Refl -  succLeqAbsurd :: Sing (n :: nat) -> IsTrue (S n :<= n) -> Void+  succLeqAbsurd :: Sing (n :: nat) -> IsTrue (S n <= n) -> Void   succLeqAbsurd n snLEQn =     eliminate $       start SLT         === sCompare n n `because` sym (succLeqToLT n n snLEQn)         === SEQ          `because` eqlCmpEQ n n Refl -  succLeqAbsurd' :: Sing (n :: nat) -> (S n :<= n) :~: 'False+  succLeqAbsurd' :: Sing (n :: nat) -> (S n <= n) :~: 'False   succLeqAbsurd' n =-    case sSucc n %:<= n of-      STrue -> absurd $ succLeqAbsurd n Witness+    case sSucc n %<= n of+      STrue  -> absurd $ succLeqAbsurd n Witness       SFalse -> Refl -  notLeqToLeq :: ((n :<= m) ~ 'False) => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n)+  notLeqToLeq :: ((n <= m) ~ 'False) => Sing (n :: nat) -> Sing m -> IsTrue (m <= n)   notLeqToLeq n m =     case sCompare n m of       SLT -> eliminate $ ltToLeq n m Refl       SEQ -> eliminate $ leqReflexive n m $ eqToRefl n m Refl       SGT -> gtToLeq n m Refl -  leqSucc' :: Sing (n :: nat) -> Sing m -> (n :<= m) :~: (Succ n :<= Succ m)+  leqSucc' :: Sing (n :: nat) -> Sing m -> (n <= m) :~: (Succ n <= Succ m)   leqSucc' n m =-    case n %:<= m of+    case n %<= m of       STrue -> withWitness (leqSucc n m Witness) Refl       SFalse ->-        case sSucc n %:<= sSucc m of+        case sSucc n %<= sSucc m of           SFalse -> Refl           STrue  ->             case viewLeq (sSucc n) (sSucc m) Witness of@@ -480,48 +495,48 @@               LeqSucc n' m' Witness ->                 eliminate $                 start STrue-                  =~= (n' %:<= m')-                  === (n  %:<= m)   `because` sLeqCong (succInj' n' n Refl) (succInj' m' m Refl)+                  =~= (n' %<= m')+                  === (n  %<= m)   `because` sLeqCong (succInj' n' n Refl) (succInj' m' m Refl)                   =~= SFalse -  leqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Min n m :~: n+  leqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Min n m :~: n   leqToMin n m nLEQm =      leqAntisymm (sMin n m) n (minLeqL n m)                  (minLargest n n m (leqRefl n) nLEQm) -  geqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Min n m :~: m+  geqToMin :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Min n m :~: m   geqToMin n m mLEQn =      leqAntisymm (sMin n m) m (minLeqR n m)                  (minLargest m n m mLEQn (leqRefl m))    minComm :: Sing (n :: nat) -> Sing m -> Min n m :~: Min m n   minComm n m =-    case n %:<= m of+    case n %<= m of       STrue -> start (sMin n m) === n        `because` leqToMin n m Witness                                 === sMin m n `because` sym (geqToMin m n Witness)       SFalse -> start (sMin n m) === m        `because` geqToMin n m (notLeqToLeq n m)                                  === sMin m n `because` sym (leqToMin m n $ notLeqToLeq n m) -  minLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= n)+  minLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= n)   minLeqL n m =-    case n %:<= m of+    case n %<= m of       STrue  -> leqReflexive (sMin n m) n $ leqToMin n m Witness       SFalse -> let mLEQn = notLeqToLeq n m                 in leqTrans (sMin n m) m n                      (leqReflexive (sMin n m) m (geqToMin n m mLEQn)) $                      mLEQn -  minLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m :<= m)+  minLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (Min n m <= m)   minLeqR n m = leqTrans (sMin n m) (sMin m n) m                   (leqReflexive (sMin n m) (sMin m n) $ minComm n m)                   (minLeqL m n)    minLargest :: Sing (l :: nat) ->  Sing n -> Sing m-             -> IsTrue (l :<= n) -> IsTrue (l :<= m)-             -> IsTrue (l :<= Min n m)+             -> IsTrue (l <= n) -> IsTrue (l <= m)+             -> IsTrue (l <= Min n m)   minLargest l n m lLEQn lLEQm =     withSingI l $ withSingI n $ withSingI m $ withSingI (sMin n m) $-    case n %:<= m of+    case n %<= m of       STrue -> leqTrans l n (sMin n m) lLEQn $                leqReflexive sing sing  $ sym $ leqToMin n m Witness       SFalse ->@@ -529,41 +544,41 @@         in leqTrans l m (sMin n m) lLEQm $            leqReflexive sing sing  $ sym $ geqToMin n m mLEQn -  leqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= m) -> Max n m :~: m+  leqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (n <= m) -> Max n m :~: m   leqToMax n m nLEQm =      leqAntisymm (sMax n m) m (maxLeast m n m nLEQm (leqRefl m)) (maxLeqR n m) -  geqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Max n m :~: n+  geqToMax :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Max n m :~: n   geqToMax n m mLEQn =      leqAntisymm (sMax n m) n (maxLeast n n m (leqRefl n) mLEQn) (maxLeqL n m)    maxComm :: Sing (n :: nat) -> Sing m -> Max n m :~: Max m n   maxComm n m =-    case n %:<= m of+    case n %<= m of       STrue -> start (sMax n m) === m        `because` leqToMax n m Witness                                 === sMax m n `because` sym (geqToMax m n Witness)       SFalse -> start (sMax n m) === n        `because` geqToMax n m (notLeqToLeq n m)                                  === sMax m n `because` sym (leqToMax m n $ notLeqToLeq n m) -  maxLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m :<= Max n m)+  maxLeqR :: Sing (n :: nat) -> Sing m -> IsTrue (m <= Max n m)   maxLeqR n m =-    case n %:<= m of+    case n %<= m of       STrue  -> leqReflexive m (sMax n m) $ sym $ leqToMax n m Witness       SFalse -> let mLEQn = notLeqToLeq n m                 in leqTrans m n (sMax n m) mLEQn                      (leqReflexive n (sMax n m) (sym $ geqToMax n m mLEQn)) -  maxLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n :<= Max n m)+  maxLeqL :: Sing (n :: nat) -> Sing m -> IsTrue (n <= Max n m)   maxLeqL n m = leqTrans n (sMax m n) (sMax n m)                   (maxLeqR m n)                   (leqReflexive (sMax m n) (sMax n m) $ maxComm m n)    maxLeast :: Sing (l :: nat) ->  Sing n -> Sing m-             -> IsTrue (n :<= l) -> IsTrue (m :<= l)-             -> IsTrue (Max n m :<= l)+             -> IsTrue (n <= l) -> IsTrue (m <= l)+             -> IsTrue (Max n m <= l)   maxLeast l n m lLEQn lLEQm =     withSingI l $ withSingI n $ withSingI m $ withSingI (sMax n m) $-    case n %:<= m of+    case n %<= m of       STrue -> leqTrans (sMax n m) m l                (leqReflexive sing sing  $ leqToMax n m Witness)                lLEQm@@ -573,56 +588,56 @@            (leqReflexive sing sing  $ geqToMax n m mLEQn)            lLEQn -  leqReversed  :: Sing (n :: nat) -> Sing m -> (n :<= m) :~: (m :>= n)-  lneqSuccLeq  :: Sing (n :: nat) -> Sing m -> (n :< m)  :~: (Succ n :<= m)-  lneqReversed :: Sing (n :: nat) -> Sing m -> (n :< m)  :~: (m :> n)+  leqReversed  :: Sing (n :: nat) -> Sing m -> (n <= m) :~: (m >= n)+  lneqSuccLeq  :: Sing (n :: nat) -> Sing m -> (n < m)  :~: (Succ n <= m)+  lneqReversed :: Sing (n :: nat) -> Sing m -> (n < m)  :~: (m > n) -  lneqToLT :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m)+  lneqToLT :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m)            -> Compare n m :~: 'LT   lneqToLT n m nLNEm =     succLeqToLT n m $ coerce (lneqSuccLeq n m) nLNEm    ltToLneq :: Sing (n :: nat) -> Sing (m :: nat) -> Compare n m :~: 'LT-           -> IsTrue (n :< m)+           -> IsTrue (n < m)   ltToLneq n m nLTm =     coerce (sym $ lneqSuccLeq n m) $ ltToSuccLeq n m nLTm -  lneqZero :: Sing (a :: nat) -> IsTrue (Zero nat :< Succ a)+  lneqZero :: Sing (a :: nat) -> IsTrue (Zero nat < Succ a)   lneqZero n = ltToLneq sZero (sSucc n) $ cmpZero n -  lneqSucc :: Sing (n :: nat) -> IsTrue (n :< Succ n)+  lneqSucc :: Sing (n :: nat) -> IsTrue (n < Succ n)   lneqSucc n = ltToLneq n (sSucc n) $ ltSucc n    succLneqSucc :: Sing (n :: nat) -> Sing (m :: nat)-               -> (n :< m) :~: (Succ n :< Succ m)+               -> (n < m) :~: (Succ n < Succ m)   succLneqSucc n m =-    start (n %:< m)-      === (sSucc n %:<= m)               `because` lneqSuccLeq n m-      === (sSucc (sSucc n) %:<= sSucc m) `because` leqSucc' (sSucc n) m-      === (sSucc n %:< sSucc m)          `because` sym (lneqSuccLeq (sSucc n) (sSucc m))+    start (n %< m)+      === (sSucc n %<= m)               `because` lneqSuccLeq n m+      === (sSucc (sSucc n) %<= sSucc m) `because` leqSucc' (sSucc n) m+      === (sSucc n %< sSucc m)          `because` sym (lneqSuccLeq (sSucc n) (sSucc m)) -  lneqRightPredSucc :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n :< m)+  lneqRightPredSucc :: Sing (n :: nat) -> Sing (m :: nat) -> IsTrue (n < m)                     -> m :~: Succ (Pred m)   lneqRightPredSucc n m nLNEQm = ltRightPredSucc n m $ lneqToLT n m nLNEQm -  lneqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n :< m) -> IsTrue (n :< m)+  lneqSuccStepL :: Sing (n :: nat) -> Sing m -> IsTrue (Succ n < m) -> IsTrue (n < m)   lneqSuccStepL n m snLNEQm =     coerce (sym $ lneqSuccLeq n m) $     leqSuccStepL (sSucc n) m $     coerce (lneqSuccLeq (sSucc n) m) snLNEQm -  lneqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n :< m) -> IsTrue (n :< Succ m)+  lneqSuccStepR :: Sing (n :: nat) -> Sing m -> IsTrue (n < m) -> IsTrue (n < Succ m)   lneqSuccStepR n m nLNEQm =     coerce (sym $ lneqSuccLeq n (sSucc m)) $     leqSuccStepR (sSucc n) m $     coerce (lneqSuccLeq n m) nLNEQm    plusStrictMonotone :: Sing (n :: nat) -> Sing m -> Sing l -> Sing k-                     -> IsTrue (n :< m) -> IsTrue (l :< k)-                     -> IsTrue (n :+ l :< m :+ k)+                     -> IsTrue (n < m) -> IsTrue (l < k)+                     -> IsTrue ((n + l) < (m + k))   plusStrictMonotone n m l k nLNm lLNk =-    coerce (sym $ lneqSuccLeq (n %:+ l) (m %:+ k)) $-      flip coerceLeqL (m %:+ k) (plusSuccL n l) $+    coerce (sym $ lneqSuccLeq (n %+ l) (m %+ k)) $+      flip coerceLeqL (m %+ k) (plusSuccL n l) $       plusMonotone (sSucc n) m l k         (coerce (lneqSuccLeq n m) nLNm)         (leqTrans l (sSucc l) k (leqSuccStepR l l (leqRefl l)) $@@ -640,67 +655,67 @@   minZeroR  :: Sing n -> Min n (Zero nat) :~: Zero nat   minZeroR n = geqToMin n sZero (leqZero n) -  minusSucc :: Sing (n :: nat) -> Sing m -> IsTrue (m :<= n) -> Succ n :- m :~: Succ (n :- m)+  minusSucc :: Sing (n :: nat) -> Sing m -> IsTrue (m <= n) -> Succ n - m :~: Succ (n - m)   minusSucc n m mLEQn =     case leqWitness m n mLEQn of       DiffNat _ k ->-        start (sSucc n %:- m)-          =~= sSucc (m %:+ k) %:- m-          === (m %:+ sSucc k) %:- m  `because` minusCongL (sym $ plusSuccR m k) m-          === (sSucc k %:+ m) %:- m  `because` minusCongL (plusComm m (sSucc k)) m+        start (sSucc n %- m)+          =~= sSucc (m %+ k) %- m+          === (m %+ sSucc k) %- m  `because` minusCongL (sym $ plusSuccR m k) m+          === (sSucc k %+ m) %- m  `because` minusCongL (plusComm m (sSucc k)) m           === sSucc k                `because` plusMinus (sSucc k) m-          === sSucc (k %:+ m %:- m)  `because` succCong (sym $ plusMinus k m)-          === sSucc (m %:+ k %:- m)  `because` succCong (minusCongL (plusComm k m) m)-          =~= sSucc (n %:- m)+          === sSucc (k %+ m %- m)  `because` succCong (sym $ plusMinus k m)+          === sSucc (m %+ k %- m)  `because` succCong (minusCongL (plusComm k m) m)+          =~= sSucc (n %- m) -  lneqZeroAbsurd :: Sing n -> IsTrue (n :< Zero nat) -> Void+  lneqZeroAbsurd :: Sing n -> IsTrue (n < Zero nat) -> Void   lneqZeroAbsurd n leq =     succLeqZeroAbsurd n (coerce (lneqSuccLeq n sZero) leq) -  minusPlus :: forall (n :: nat) m .PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m :<= n)-            -> n :- m :+ m :~: n+  minusPlus :: forall (n :: nat) m .PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (m <= n)+            -> n - m + m :~: n   minusPlus n m mLEQn =     case leqWitness m n mLEQn of       DiffNat _ k ->-        start (n %:- m %:+ m)-          =~= m %:+ k %:- m %:+ m-          === k %:+ m %:- m %:+ m  `because` plusCongL (minusCongL (plusComm m k) m) m-          === k %:+ m              `because` plusCongL (plusMinus k m) m-          === m %:+ k              `because` plusComm  k m+        start (n %- m %+ m)+          =~= m %+ k %- m %+ m+          === k %+ m %- m %+ m  `because` plusCongL (minusCongL (plusComm m k) m) m+          === k %+ m              `because` plusCongL (plusMinus k m) m+          === m %+ k              `because` plusComm  k m           =~= n  -- | Natural subtraction, truncated to zero if m > n.-type n :-. m = Subt n m (m :<= n)+type n -. m = Subt n m (m <= n) type family Subt (n :: nat) (m :: nat) (b :: Bool) :: nat where-  Subt n          m 'True  = n :- m+  Subt n          m 'True  = n - m   Subt (n :: nat) m 'False = Zero nat-infixl 6 :-.+infixl 6 -. -(%:-.) :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (n :-. m)-n %:-. m =-  case m %:<= n of-    STrue -> n %:- m+(%-.) :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> Sing (n -. m)+n %-. m =+  case m %<= n of+    STrue  -> n %- m     SFalse -> sZero  minPlusTruncMinus :: (PeanoOrder nat) => Sing (n :: nat) -> Sing (m :: nat)-                  -> Min n m :+ (n :-. m) :~: n+                  -> Min n m + (n -. m) :~: n minPlusTruncMinus n m =-  case m %:<= n of+  case m %<= n of     STrue ->-      start (sMin n m %:+ (n %:-. m))-        === m %:+ (n %:-. m) `because` plusCongL (geqToMin n m Witness) (n %:-. m)-        =~= m %:+ (n %:- m)-        === (n %:- m) %:+ m  `because` plusComm m (n %:- m)+      start (sMin n m %+ (n %-. m))+        === m %+ (n %-. m) `because` plusCongL (geqToMin n m Witness) (n %-. m)+        =~= m %+ (n %- m)+        === (n %- m) %+ m  `because` plusComm m (n %- m)         === n                `because` minusPlus n m Witness     SFalse ->-      start (sMin n m %:+ (n %:-. m))-        =~= sMin n m %:+ sZero+      start (sMin n m %+ (n %-. m))+        =~= sMin n m %+ sZero         === sMin n m  `because` plusZeroR (sMin n m)         === n         `because` leqToMin n m (notLeqToLeq m n) -truncMinusLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue (n :-. m :<= n)+truncMinusLeq :: PeanoOrder nat => Sing (n :: nat) -> Sing m -> IsTrue ((n -. m) <= n) truncMinusLeq n m =-  case m %:<= n of-    STrue  -> leqStep (n %:-. m) n m $ minusPlus n m Witness+  case m %<= n of+    STrue  -> leqStep (n %-. m) n m $ minusPlus n m Witness     SFalse -> leqZero n 
− Data/Type/Natural/Compat.hs
@@ -1,8 +0,0 @@-{-# LANGUAGE CPP #-}-module Data.Type.Natural.Compat (bugInGHC) where-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 800-import Data.Singletons.Prelude (bugInGHC)-#else-bugInGHC :: a-bugInGHC = error "GHC case-analysis error!"-#endif
Data/Type/Natural/Core.hs view
@@ -1,19 +1,15 @@ {-# LANGUAGE CPP, DataKinds, FlexibleContexts, FlexibleInstances, GADTs #-} {-# LANGUAGE KindSignatures, MultiParamTypeClasses, NoImplicitPrelude   #-} {-# LANGUAGE PolyKinds, RankNTypes, ScopedTypeVariables                 #-}-{-# LANGUAGE StandaloneDeriving, TemplateHaskell, TypeFamilies          #-}-{-# LANGUAGE TypeOperators, UndecidableInstances                        #-}+{-# LANGUAGE StandaloneDeriving, TypeFamilies, TypeOperators            #-}+{-# LANGUAGE UndecidableInstances                                       #-} module Data.Type.Natural.Core where-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 800-import Data.Type.Natural.Compat-#endif+import Data.Type.Natural.Definitions -import Data.Constraint               hiding ((:-))-import Data.Promotion.Prelude.Ord    ((:<=))-import Data.Type.Natural.Definitions hiding ((:<=))-import Prelude                       (Bool (..), Eq (..), Show (..), ($))-import Proof.Propositional           (IsTrue)-import Unsafe.Coerce+import Data.Constraint     (Dict (..))+import Prelude             (Bool (..), Eq (..), Show (..), ($))+import Proof.Propositional (IsTrue)+import Unsafe.Coerce       (unsafeCoerce)  -------------------------------------------------- -- ** Type-level predicate & judgements.@@ -23,17 +19,11 @@   ZeroLeq     :: SNat m -> Leq Zero m   SuccLeqSucc :: Leq n m -> Leq ('S n) ('S m) -type LeqTrueInstance a b = IsTrue (a :<= b)--(%-) :: (m :<= n) ~ 'True => SNat n -> SNat m -> SNat (n :-: m)-n   %- SZ    = n-SS n %- SS m = n %- m-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 800-_    %- _    = bugInGHC-#endif+type LeqTrueInstance a b = IsTrue (a <= b) -infixl 6 %-+#if !MIN_VERSION_singletons(2,4,0) deriving instance Show (SNat n)+#endif deriving instance Eq (SNat n)  data (a :: Nat) :<: (b :: Nat) where@@ -49,7 +39,7 @@ propToBoolLeq _ = unsafeCoerce (Dict :: Dict ()) {-# INLINE propToBoolLeq #-} -boolToClassLeq :: (n :<= m) ~ 'True => SNat n -> SNat m -> LeqInstance n m+boolToClassLeq :: (n <= m) ~ 'True => SNat n -> SNat m -> LeqInstance n m boolToClassLeq _ = unsafeCoerce (Dict :: Dict ()) {-# INLINE boolToClassLeq #-} @@ -63,7 +53,7 @@ propToBoolLeq (ZeroLeq _) = Dict propToBoolLeq (SuccLeqSucc leq) = case propToBoolLeq leq of Dict -> Dict -boolToClassLeq :: (n :<<= m) ~ True => SNat n -> SNat m -> LeqInstance n m+boolToClassLeq :: (n <<= m) ~ True => SNat n -> SNat m -> LeqInstance n m boolToClassLeq SZ     _      = Dict boolToClassLeq (SS n) (SS m) = case boolToClassLeq n m of Dict -> Dict boolToClassLeq _ _ = bugInGHC@@ -73,19 +63,17 @@ propToClassLeq (SuccLeqSucc leq) = case propToClassLeq leq of Dict -> Dict -} -type LeqInstance n m = IsTrue (n :<= m)+type LeqInstance n m = IsTrue (n <= m) -boolToPropLeq :: (n :<= m) ~ 'True => SNat n -> SNat m -> Leq n m+boolToPropLeq :: (n <= m) ~ 'True => SNat n -> SNat m -> Leq n m boolToPropLeq SZ     m      = ZeroLeq m boolToPropLeq (SS n) (SS m) = SuccLeqSucc $ boolToPropLeq n m-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 800-boolToPropLeq _      _     = bugInGHC-#endif  leqRhs :: Leq n m -> SNat m-leqRhs (ZeroLeq m) = m+leqRhs (ZeroLeq m)       = m leqRhs (SuccLeqSucc leq) = SS $ leqRhs leq  leqLhs :: Leq n m -> SNat n-leqLhs (ZeroLeq _) = SZ+leqLhs (ZeroLeq _)       = SZ leqLhs (SuccLeqSucc leq) = SS $ leqLhs leq+
Data/Type/Natural/Definitions.hs view
@@ -1,17 +1,20 @@-{-# LANGUAGE CPP, DataKinds, DeriveDataTypeable, FlexibleContexts     #-}-{-# LANGUAGE FlexibleInstances, GADTs, InstanceSigs, KindSignatures   #-}-{-# LANGUAGE MultiParamTypeClasses, PolyKinds, RankNTypes             #-}-{-# LANGUAGE ScopedTypeVariables, StandaloneDeriving, TemplateHaskell #-}-{-# LANGUAGE TypeFamilies, TypeOperators, UndecidableInstances        #-}+{-# LANGUAGE CPP, DataKinds, DeriveDataTypeable, EmptyCase                 #-}+{-# LANGUAGE FlexibleContexts, FlexibleInstances, GADTs, InstanceSigs      #-}+{-# LANGUAGE KindSignatures, MultiParamTypeClasses, PolyKinds, RankNTypes  #-}+{-# LANGUAGE ScopedTypeVariables, StandaloneDeriving, TemplateHaskell      #-}+{-# LANGUAGE TypeFamilies, TypeInType, TypeOperators, UndecidableInstances #-} module Data.Type.Natural.Definitions        (module Data.Type.Natural.Definitions,-        module Data.Singletons.Prelude+        module Data.Singletons.Prelude,+        module Data.Type.Natural.Singleton.Compat        ) where+import Data.Type.Natural.Singleton.Compat+ import Data.Promotion.Prelude.Enum import Data.Singletons.Prelude import Data.Singletons.Prelude.Enum-import Data.Singletons.TH           (singletons)-import Data.Typeable                (Typeable)+import Data.Singletons.TH+import Data.Typeable  -------------------------------------------------- -- * Natural numbers and its singleton type@@ -48,6 +51,7 @@      max (S n) Z     = S n      max (S n) (S m) = S (max n m)  |]+ singletons [d|   instance Num Nat where     Z   + n = n@@ -62,7 +66,7 @@      abs n = n -    signum Z = Z+    signum Z     = Z     signum (S _) = S Z      fromInteger n = if n == 0 then Z else S (fromInteger (n-1))@@ -70,46 +74,25 @@  singletons [d|   instance Enum Nat where-    succ n = S n-    pred Z = Z+    succ = S+    pred Z     = Z     pred (S n) = n     toEnum n = if n == 0 then Z else S (toEnum (n - 1))-    fromEnum Z = 0+    fromEnum Z     = 0     fromEnum (S n) = 1 + fromEnum n  |] -type n :-: m = n :- m-type n :+: m = n :+ m--infixl 6 :-:, :+:- singletons [d|  (**) :: Nat -> Nat -> Nat  _ ** Z = S Z  n ** S m = (n ** m) * n  |]----- | Addition for singleton numbers.-(%+) :: SNat n -> SNat m -> SNat (n :+: m)-(%+) = (%:+)-infixl 6 %+---- | Type-level multiplication.-type n :*: m = n :* m-infixl 7 :*:---- | Multiplication for singleton numbers.-(%*) :: SNat n -> SNat m -> SNat (n :*: m)-(%*) = (%:*)-infixl 7 %*---- | Type-level exponentiation.-type n :**: m = n :** m+#if !MIN_VERSION_singletons(2,4,0)+type (**) a b = a :** b --- | Exponentiation for singleton numbers.-(%**) :: SNat n -> SNat m -> SNat (n :**: m)+(%**) :: SNat n -> SNat m -> SNat (n ** m) (%**) = (%:**)+#endif  singletons [d|  zero, one, two, three, four, five, six, seven, eight, nine, ten :: Nat
+ Data/Type/Natural/Singleton/Compat.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE CPP, ExplicitNamespaces, TemplateHaskell, TypeInType #-}+-- | Compatibility layer for singletons+module Data.Type.Natural.Singleton.Compat+       (+       module Data.Singletons.Prelude.Eq,+       module Data.Singletons.Prelude.Num,+       module Data.Singletons.Prelude.Ord,+#if !MIN_VERSION_singletons(2,4,0)+       module Data.Type.Natural.Singleton.Compat+#endif+       )+       where++#if !MIN_VERSION_singletons(2,4,0)+import Data.Type.Natural.Singleton.Compat.TH+#endif++import Data.Singletons.Prelude.Eq+import Data.Singletons.Prelude.Num+import Data.Singletons.Prelude.Ord++#if !MIN_VERSION_singletons(2,4,0)+generateCompat Nothing ''SOrd "<"+generateCompat Nothing ''SOrd ">"+generateCompat Nothing ''SOrd "<="+generateCompat Nothing ''SOrd ">="++generateCompat Nothing ''SEq "/="+generateCompat Nothing ''SEq "=="++generateCompat Nothing ''SNum "+"+generateCompat Nothing ''SNum "-"+generateCompat Nothing ''SNum "*"+#endif+
+ Data/Type/Natural/Singleton/Compat/TH.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE TemplateHaskell #-}+module Data.Type.Natural.Singleton.Compat.TH where+import Control.Applicative ((<|>))+import Control.Monad       (forM, zipWithM)+import Data.Maybe          (fromMaybe)+import Data.Singletons+import Language.Haskell.TH++generateCompat :: Maybe Fixity -> Name -> String -> DecsQ+generateCompat mfix cls opname = do+  mfix' <- reifyFixity (mkName opname)+  Just oldOpName <- lookupTypeName  $ ":" ++ opname+  Just oldSingName <- lookupValueName $ "%:" ++ opname+  Just oldCur1Name <- lookupTypeName  $ ":" ++ opname ++ "$"+  Just oldCur2Name <- lookupTypeName  $ ":" ++ opname ++ "$$"+  Just oldCur3Name <- lookupTypeName  $ ":" ++ opname ++ "$$$"+  let newOpName = mkName opname+      newSingName = mkName $ "%" ++ opname+      newCur1Name = mkName $ opname ++ "@#@$"+      newCur2Name = mkName $ opname ++ "@#@$$"+      newCur3Name = mkName $ opname ++ "@#@$$$"+  cur12 <- zipWithM (\old new -> tySynD new [] (conT old))+           [oldCur1Name, oldCur2Name]+           [newCur1Name, newCur2Name]+  [a, b] <- mapM newName ["a", "b"]+  cur3 <- tySynD newCur3Name (map PlainTV [a,b])+          $ infixT (varT a) oldCur3Name (varT b)+  nat <- newName "nat"+  tysyn <- tySynD newOpName [PlainTV a, PlainTV b] $+           infixT (varT a) oldOpName (varT b)+  sig <- sigD newSingName $+         forallT [PlainTV nat, KindedTV a (VarT nat), KindedTV b (VarT nat)]+         (sequence [[t| $(conT cls) $(varT nat) |]])+         [t| Sing $(varT a) -> Sing $(varT b) -> Sing $(infixT (varT a) newOpName (varT b)) |]+  defn <- funD newSingName [clause [] (normalB $ varE oldSingName) [] ]+  fixes <- fmap (fromMaybe []) $ forM (mfix <|> mfix') $ \fixity ->+    return [InfixD fixity newOpName, InfixD  fixity newSingName]+  return (sig : defn : tysyn : cur12 ++ [cur3] ++ fixes)+
Data/Type/Ordinal.hs view
@@ -12,30 +12,36 @@          -- $quasiquotes          mkOrdinalQQ, odPN, odLit,          -- * Conversion from cardinals to ordinals.-         sNatToOrd', sNatToOrd, ordToInt, ordToSing,-         unsafeFromInt, inclusion, inclusion',+         sNatToOrd', sNatToOrd,+         ordToNatural, unsafeNaturalToOrd', unsafeNaturalToOrd,+         reallyUnsafeNaturalToOrd,+         naturalToOrd, naturalToOrd',+         ordToSing,  inclusion, inclusion',          -- * Ordinal arithmetics          (@+), enumOrdinal,          -- * Elimination rules for @'Ordinal' 'Z'@.-         absurdOrd, vacuousOrd+         absurdOrd, vacuousOrd,+         -- * Deprecated combinators+         ordToInt, unsafeFromInt, unsafeFromInt'        ) where-import           Data.Kind+import Data.Type.Natural.Singleton.Compat+ import           Data.List                    (genericDrop, genericTake)+import           Data.Maybe                   (fromMaybe) import           Data.Ord                     (comparing) import           Data.Singletons.Decide import           Data.Singletons.Prelude import           Data.Singletons.Prelude.Enum import           Data.Type.Equality-import           Data.Type.Monomorphic import qualified Data.Type.Natural            as PN import           Data.Type.Natural.Builtin    () import           Data.Type.Natural.Class import           Data.Typeable                (Typeable) import           Data.Void                    (absurd)-import           GHC.TypeLits                 (type (+)) import qualified GHC.TypeLits                 as TL import           Language.Haskell.TH          hiding (Type) import           Language.Haskell.TH.Quote+import           Numeric.Natural import           Proof.Equational import           Proof.Propositional import           Unsafe.Coerce@@ -48,9 +54,9 @@ -- --   Since 0.6.0.0 data Ordinal (n :: nat) where-  OLt :: (IsPeano nat, (n :< m) ~ 'True) => Sing (n :: nat) -> Ordinal m+  OLt :: (IsPeano nat, (n < m) ~ 'True) => Sing (n :: nat) -> Ordinal m -fromOLt :: forall nat n m. (PeanoOrder nat, (Succ n :< Succ m) ~ 'True, SingI m)+fromOLt :: forall nat n m. (PeanoOrder nat, (Succ n < Succ m) ~ 'True, SingI m)         => Sing (n :: nat) -> Ordinal m fromOLt  n =   withRefl (sym $ succLneqSucc n (sing :: Sing m)) $@@ -60,7 +66,7 @@ -- --   Since 0.6.0.0 pattern OZ :: forall nat (n :: nat). IsPeano nat-           => (Zero nat :< n) ~ 'True => Ordinal n+           => (Zero nat < n) ~ 'True => Ordinal n pattern OZ <- OLt Zero where   OZ = OLt sZero @@ -79,17 +85,11 @@ -- |  Class synonym for Peano numerals with ordinals. -- --  Since 0.5.0.0-class (PeanoOrder nat, Monomorphicable (Sing :: nat -> *),-       Integral (MonomorphicRep (Sing :: nat -> *)),-       Show (MonomorphicRep (Sing :: nat -> *))) => HasOrdinal nat-instance (PeanoOrder nat, Monomorphicable (Sing :: nat -> *),-       Integral (MonomorphicRep (Sing :: nat -> *)),-       Show (MonomorphicRep (Sing :: nat -> *))) => HasOrdinal nat+class (PeanoOrder nat, SingKind nat) => HasOrdinal nat+instance (PeanoOrder nat, SingKind nat) => HasOrdinal nat  instance (HasOrdinal nat, SingI (n :: nat))       => Num (Ordinal n) where-  {-# SPECIALISE instance SingI n => Num (Ordinal (n :: PN.Nat))  #-}-  {-# SPECIALISE instance SingI n => Num (Ordinal (n :: TL.Nat))  #-}   _ + _ = error "Finite ordinal is not closed under addition."   _ - _ = error "Ordinal subtraction is not defined"   negate OZ = OZ@@ -104,14 +104,10 @@ -- deriving instance Read (Ordinal n) => Read (Ordinal (Succ n)) instance (SingI n, HasOrdinal nat)         => Show (Ordinal (n :: nat)) where-  {-# SPECIALISE instance SingI n => Show (Ordinal (n :: PN.Nat))  #-}-  {-# SPECIALISE instance SingI n => Show (Ordinal (n :: TL.Nat))  #-}-  showsPrec d o = showChar '#' . showParen True (showsPrec d (ordToInt o) . showString " / " . showsPrec d (demote $ Monomorphic (sing :: Sing n)))+  showsPrec d o = showChar '#' . showParen True (showsPrec d (ordToInt o) . showString " / " . showsPrec d (toNatural (sing :: Sing n)))  instance (HasOrdinal nat)          => Eq (Ordinal (n :: nat)) where-  {-# SPECIALISE instance Eq (Ordinal (n :: PN.Nat))  #-}-  {-# SPECIALISE instance Eq (Ordinal (n :: TL.Nat))  #-}   o == o' = ordToInt o == ordToInt o'  instance (HasOrdinal nat) => Ord (Ordinal (n :: nat)) where@@ -167,35 +163,74 @@     sNatToOrd (sing :: Sing m)   {-# INLINE maxBound #-} +{-# DEPRECATED unsafeFromInt "Use unsafeNaturalToOrd instead" #-}+-- | Since 0.8.0.0 unsafeFromInt :: forall (n :: nat). (HasOrdinal nat, SingI (n :: nat))-              => MonomorphicRep (Sing :: nat -> *) -> Ordinal n-unsafeFromInt n =-    case promote (n :: MonomorphicRep (Sing :: nat -> *)) of-      Monomorphic sn ->-           case sn %:< (sing :: Sing n) of-             STrue -> sNatToOrd' (sing :: Sing n) sn-             SFalse -> error "Bound over!"+              => Int -> Ordinal n+unsafeFromInt = unsafeNaturalToOrd . fromIntegral +-- | Converts @'Natural'@s into @'Ordinal n'@.+--   If the given natural is greater or equal to @n@, raises exception.+--+--   Since 0.8.0.0+unsafeNaturalToOrd :: forall (n :: nat). (HasOrdinal nat, SingI (n :: nat))+                  => Natural -> Ordinal n+unsafeNaturalToOrd k =+    fromMaybe (error "unsafeNaturalToOrd Out of bound") $+    naturalToOrd k++{-# DEPRECATED unsafeFromInt' "Use unsafeNaturalToOrd' instead" #-}+-- | Since 0.8.0.0 unsafeFromInt' :: forall proxy (n :: nat). (HasOrdinal nat, SingI n)-              => proxy nat -> MonomorphicRep (Sing :: nat -> *) -> Ordinal n-unsafeFromInt' _ n =-    case promote (n :: MonomorphicRep (Sing :: nat -> *)) of-      Monomorphic sn ->-           case sn %:< (sing :: Sing n) of-             STrue -> sNatToOrd' (sing :: Sing n) sn+              => proxy nat -> Int -> Ordinal n+unsafeFromInt' p = unsafeNaturalToOrd' p . fromIntegral++-- | Since 0.8.0.0+unsafeNaturalToOrd' :: forall proxy (n :: nat). (HasOrdinal nat, SingI n)+                   => proxy nat -> Natural -> Ordinal n+unsafeNaturalToOrd' _ n =+    case fromNatural n of+      SomeSing sn ->+           case sn %< (sing :: Sing n) of+             STrue  -> sNatToOrd' (sing :: Sing n) sn              SFalse -> error "Bound over!" +{-# WARNING reallyUnsafeNaturalToOrd "This function may violate type safety. Use with care!" #-}+-- | Converts @'Natural'@s into @'Ordinal' n@, WITHOUT any boundary check.+--   This function may easily violate type-safety. Use with care!+reallyUnsafeNaturalToOrd :: forall pxy nat (n :: nat). (HasOrdinal nat, SingI n)+                         => pxy nat -> Natural -> Ordinal n+reallyUnsafeNaturalToOrd _ k =+  case fromNatural k of+    SomeSing (sk :: Sing (k :: nat)) ->+      withRefl (unsafeCoerce (Refl :: () :~: ()) :: (k < n) :~: 'True) $+      OLt sk+ -- | 'sNatToOrd'' @n m@ injects @m@ as @Ordinal n@. -- --   Since 0.5.0.0-sNatToOrd' :: (PeanoOrder nat, (m :< n) ~ 'True) => Sing (n :: nat) -> Sing m -> Ordinal n-sNatToOrd' _ m = OLt m+sNatToOrd' :: (PeanoOrder nat, (m < n) ~ 'True) => Sing (n :: nat) -> Sing m -> Ordinal n+sNatToOrd' _ = OLt {-# INLINE sNatToOrd' #-}  -- | 'sNatToOrd'' with @n@ inferred.-sNatToOrd :: (PeanoOrder nat, SingI (n :: nat), (m :< n) ~ 'True) => Sing m -> Ordinal n+sNatToOrd :: (PeanoOrder nat, SingI (n :: nat), (m < n) ~ 'True) => Sing m -> Ordinal n sNatToOrd = sNatToOrd' sing +-- | Since 0.8.0.0+naturalToOrd :: forall nat n. (HasOrdinal nat, SingI n)+             => Natural -> Maybe (Ordinal (n :: nat))+naturalToOrd = naturalToOrd' (sing :: Sing n)++naturalToOrd' :: HasOrdinal nat+              => Sing (n :: nat) -> Natural -> Maybe (Ordinal n)+naturalToOrd' sn k =+  case fromNatural k of+    SomeSing sk ->+      case sk %< sn of+        STrue -> Just (OLt sk)+        _     -> Nothing+ -- | Convert @Ordinal n@ into monomorphic @Sing@ -- -- Since 0.5.0.0@@ -203,35 +238,43 @@ ordToSing (OLt n) = SomeSing n {-# INLINE ordToSing #-} --- | Convert ordinal into @Int@.-ordToInt :: (HasOrdinal nat, int ~ MonomorphicRep (Sing :: nat -> *))+{-# DEPRECATED ordToInt "Use ordToNatural instead." #-}+-- | Convert ordinal into @'Int'@.+ordToInt :: (HasOrdinal nat)          => Ordinal (n :: nat)-         -> int-ordToInt (OLt n) = demote $ Monomorphic n-{-# SPECIALISE ordToInt :: Ordinal (n :: PN.Nat) -> Integer #-}-{-# SPECIALISE ordToInt :: Ordinal (n :: TL.Nat) -> Integer #-}+         -> Int+ordToInt = fromIntegral . ordToNatural+{-# SPECIALISE ordToInt :: Ordinal (n :: PN.Nat) -> Int #-}+{-# SPECIALISE ordToInt :: Ordinal (n :: TL.Nat) -> Int #-} +ordToNatural :: HasOrdinal nat+             => Ordinal (n :: nat)+             -> Natural+ordToNatural (OLt n) = toNatural n+{-# SPECIALISE ordToNatural :: Ordinal (n :: PN.Nat) -> Natural #-}+{-# SPECIALISE ordToNatural :: Ordinal (n :: TL.Nat) -> Natural #-}+ -- | Inclusion function for ordinals. -- --   Since 0.7.0.0 (constraint was weakened since last released)-inclusion' :: (n :<= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m+inclusion' :: (n <= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m inclusion' _ = unsafeCoerce {-# INLINE inclusion' #-}  -- | Inclusion function for ordinals with codomain inferred. -- --   Since 0.7.0.0 (constraint was weakened since last released)-inclusion :: ((n :<= m) ~ 'True) => Ordinal n -> Ordinal m-inclusion on = unsafeCoerce on+inclusion :: ((n <= m) ~ 'True) => Ordinal n -> Ordinal m+inclusion = unsafeCoerce {-# INLINE inclusion #-}   -- | Ordinal addition. (@+) :: forall n m. (PeanoOrder nat, SingI (n :: nat), SingI m)-     => Ordinal n -> Ordinal m -> Ordinal (n :+ m)+     => Ordinal n -> Ordinal m -> Ordinal (n + m) OLt k @+ OLt l =   let (n, m) = (n :: Sing n, m :: Sing m)-  in withWitness (plusStrictMonotone k n l m Witness Witness) $ OLt $ k %:+ l+  in withWitness (plusStrictMonotone k n l m Witness Witness) $ OLt $ k %+ l  -- | Since @Ordinal 'Z@ is logically not inhabited, we can coerce it to any value. --@@ -272,3 +315,4 @@ odPN  = mkOrdinalQQ [t| PN.Nat |] -- | Quasiquoter for ordinal indexed by built-in numeral @'GHC.TypeLits.Nat'@. odLit = mkOrdinalQQ [t| TL.Nat |]+
Data/Type/Ordinal/Builtin.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds, ExplicitNamespaces, FlexibleInstances, GADTs    #-} {-# LANGUAGE KindSignatures, PatternSynonyms, TypeInType, TypeOperators #-}+{-# OPTIONS_GHC -Wno-warnings-deprecations #-} -- | Module providing the same API as 'Data.Type.Ordinal' but specialised to --   GHC's builtin @'Nat'@. --   @@ -11,20 +12,24 @@          -- $quasiquotes          od,          -- * Conversion from cardinals to ordinals.-         sNatToOrd', sNatToOrd, ordToInt,-         unsafeFromInt, inclusion, inclusion',+         sNatToOrd', sNatToOrd, ordToNatural,+         unsafeNaturalToOrd, naturalToOrd, naturalToOrd',+         inclusion, inclusion',          -- * Ordinal arithmetics          (@+), enumOrdinal,          -- * Elimination rules for @'Ordinal' 0'@.-         absurdOrd, vacuousOrd+         absurdOrd, vacuousOrd,+         -- * Deprecated combinators+         ordToInt, unsafeFromInt        ) where-import           Data.Kind-import           Data.Singletons.Prelude      (POrd (..), Sing (..))+import qualified Data.Type.Natural.Singleton.Compat as SC++import Numeric.Natural (Natural)+import           Data.Singletons (SingI, Sing) import           Data.Singletons.Prelude.Enum (PEnum (..)) import qualified Data.Type.Ordinal            as O import           GHC.TypeLits import           Language.Haskell.TH.Quote    (QuasiQuoter)-import           Data.Type.Monomorphic  -- | Set-theoretic (finite) ordinals: --@@ -42,7 +47,7 @@ --   but it is due to the limitation of GHC's current exhaustiveness checker. --    --   Since 0.7.0.0-pattern OLt :: () => forall  (n1 :: Nat). ((n1 :< t) ~ 'True)+pattern OLt :: () => forall  (n1 :: Nat). ((n1 SC.< t) ~ 'True)             => Sing n1 -> O.Ordinal t pattern OLt n = O.OLt n @@ -50,7 +55,7 @@ --    --   Since 0.7.0.0 pattern OZ :: forall  (n :: Nat). ()-           => (0 :< n) ~ 'True => O.Ordinal n+           => (0 SC.< n) ~ 'True => O.Ordinal n pattern OZ = O.OZ  -- | Pattern synonym @'OS' n@ represents (n+1)-th ordinal.@@ -83,40 +88,59 @@ -- | 'sNatToOrd'' @n m@ injects @m@ as @Ordinal n@. --    --   Since 0.7.0.0-sNatToOrd' :: (m :< n) ~ 'True => Sing n -> Sing m -> Ordinal n+sNatToOrd' :: (m SC.< n) ~ 'True => Sing n -> Sing m -> Ordinal n sNatToOrd' = O.sNatToOrd' {-# INLINE sNatToOrd' #-}  -- | 'sNatToOrd'' with @n@ inferred. --    --   Since 0.7.0.0-sNatToOrd :: (KnownNat n, (m :< n) ~ 'True) => Sing m -> Ordinal n+sNatToOrd :: (KnownNat n, (m SC.< n) ~ 'True) => Sing m -> Ordinal n sNatToOrd = O.sNatToOrd {-# INLINE sNatToOrd #-} +{-# DEPRECATED ordToInt "Use ordToNatural instead" #-} -- | Convert ordinal into @Int@. --    --   Since 0.7.0.0-ordToInt :: Ordinal n -> Integer+ordToInt :: Ordinal n -> Int ordToInt = O.ordToInt {-# INLINE ordToInt #-} +{-# DEPRECATED unsafeFromInt "Use unsafeNaturalToOrd instead" #-} unsafeFromInt :: KnownNat n-              => MonomorphicRep (Sing :: Nat -> Type) -> Ordinal n+              => Int -> Ordinal n unsafeFromInt = O.unsafeFromInt {-# INLINE unsafeFromInt #-} +ordToNatural :: Ordinal (n :: Nat) -> Natural+ordToNatural = O.ordToNatural+{-# INLINE ordToNatural #-}+++naturalToOrd :: SingI (n :: Nat) => Natural -> Maybe (Ordinal n)+naturalToOrd = O.naturalToOrd+{-# INLINE naturalToOrd #-}++naturalToOrd' :: Sing (n :: Nat) -> Natural -> Maybe (Ordinal n)+naturalToOrd' = O.naturalToOrd'+{-# INLINE naturalToOrd' #-}++unsafeNaturalToOrd :: SingI (n :: Nat) => Natural -> Ordinal n+unsafeNaturalToOrd = O.unsafeNaturalToOrd+{-# INLINE unsafeNaturalToOrd #-}+ -- | Inclusion function for ordinals. -- --   Since 0.7.0.0-inclusion :: (n :<= m) ~ 'True => Ordinal n -> Ordinal m+inclusion :: (n SC.<= m) ~ 'True => Ordinal n -> Ordinal m inclusion = O.inclusion {-# INLINE inclusion #-}  -- | Inclusion function for ordinals with codomain inferred. -- --   Since 0.7.0.0-inclusion' :: (n :<= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m+inclusion' :: (n SC.<= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m inclusion' = O.inclusion' {-# INLINE inclusion' #-} 
Data/Type/Ordinal/Peano.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds, ExplicitNamespaces, FlexibleInstances, GADTs    #-} {-# LANGUAGE KindSignatures, PatternSynonyms, TypeInType, TypeOperators #-}+{-# OPTIONS_GHC -Wno-warnings-deprecations #-} -- | Module providing the same API as 'Data.Type.Ordinal' but specialised to --   peano numeral @'Nat'@. --   @@ -11,20 +12,23 @@          -- $quasiquotes          od,          -- * Conversion from cardinals to ordinals.-         sNatToOrd', sNatToOrd, ordToInt,-         unsafeFromInt, inclusion, inclusion',+         sNatToOrd', sNatToOrd, inclusion, inclusion',+         ordToNatural, unsafeNaturalToOrd, naturalToOrd, naturalToOrd',          -- * Ordinal arithmetics          (@+), enumOrdinal,          -- * Elimination rules for @'Ordinal' 'Z'@.-         absurdOrd, vacuousOrd+         absurdOrd, vacuousOrd,+         -- * Deprecated Combinators+         ordToInt, unsafeFromInt        ) where-import           Data.Kind-import           Data.Singletons.Prelude      (POrd (..), SingI, Sing (..))+import Data.Type.Natural.Singleton.Compat++import Numeric.Natural (Natural)+import           Data.Singletons.Prelude      (SingI, Sing (..)) import           Data.Singletons.Prelude.Enum (PEnum (..)) import qualified Data.Type.Ordinal            as O import           Data.Type.Natural import           Language.Haskell.TH.Quote    (QuasiQuoter)-import           Data.Type.Monomorphic  -- | Set-theoretic (finite) ordinals: --@@ -42,7 +46,7 @@ --   but it is due to the limitation of GHC's current exhaustiveness checker. --    --   Since 0.7.0.0-pattern OLt :: () => forall  (n1 :: Nat). ((n1 :< t) ~ 'True)+pattern OLt :: () => forall  (n1 :: Nat). ((n1 < t) ~ 'True)             => Sing n1 -> O.Ordinal t pattern OLt n = O.OLt n @@ -50,7 +54,7 @@ --    --   Since 0.7.0.0 pattern OZ :: forall  (n :: Nat). ()-           => ('Z :< n) ~ 'True => O.Ordinal n+           => ('Z < n) ~ 'True => O.Ordinal n pattern OZ = O.OZ  -- | Pattern synonym @'OS' n@ represents (n+1)-th ordinal.@@ -83,47 +87,47 @@ -- | 'sNatToOrd'' @n m@ injects @m@ as @Ordinal n@. --    --   Since 0.7.0.0-sNatToOrd' :: (m :< n) ~ 'True => Sing n -> Sing m -> Ordinal n+sNatToOrd' :: (m < n) ~ 'True => Sing n -> Sing m -> Ordinal n sNatToOrd' = O.sNatToOrd' {-# INLINE sNatToOrd' #-}  -- | 'sNatToOrd'' with @n@ inferred. --    --   Since 0.7.0.0-sNatToOrd :: (SingI n, (m :< n) ~ 'True) => Sing m -> Ordinal n+sNatToOrd :: (SingI n, (m < n) ~ 'True) => Sing m -> Ordinal n sNatToOrd = O.sNatToOrd {-# INLINE sNatToOrd #-}  -- | Convert ordinal into @Int@. --    --   Since 0.7.0.0-ordToInt :: Ordinal n -> Integer+ordToInt :: Ordinal n -> Int ordToInt = O.ordToInt {-# INLINE ordToInt #-}  unsafeFromInt :: SingI n-              => MonomorphicRep (Sing :: Nat -> Type) -> Ordinal n+              => Int -> Ordinal n unsafeFromInt = O.unsafeFromInt {-# INLINE unsafeFromInt #-}  -- | Inclusion function for ordinals. -- --   Since 0.7.0.0-inclusion :: (n :<= m) ~ 'True => Ordinal n -> Ordinal m+inclusion :: (n <= m) ~ 'True => Ordinal n -> Ordinal m inclusion = O.inclusion {-# INLINE inclusion #-}  -- | Inclusion function for ordinals with codomain inferred. -- --   Since 0.7.0.0-inclusion' :: (n :<= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m+inclusion' :: (n <= m) ~ 'True => Sing m -> Ordinal n -> Ordinal m inclusion' = O.inclusion' {-# INLINE inclusion' #-}  -- | Ordinal addition. -- --   Since 0.7.0.0-(@+) :: (SingI n, SingI m) => Ordinal n -> Ordinal m -> Ordinal (n :+ m)+(@+) :: (SingI n, SingI m) => Ordinal n -> Ordinal m -> Ordinal (n + m) (@+) = (O.@+) {-# INLINE (@+) #-} @@ -147,3 +151,16 @@ vacuousOrd :: Functor f => f (Ordinal 'Z) -> f a vacuousOrd = O.vacuousOrd {-# INLINE vacuousOrd #-}++ordToNatural :: Ordinal (n :: Nat) -> Natural+ordToNatural = O.ordToNatural+{-# INLINE ordToNatural #-}++unsafeNaturalToOrd :: SingI (n :: Nat) => Natural -> Ordinal n+unsafeNaturalToOrd = O.unsafeNaturalToOrd++naturalToOrd :: SingI (n :: Nat) => Natural -> Maybe (Ordinal n)+naturalToOrd = O.naturalToOrd++naturalToOrd' :: Sing (n :: Nat) -> Natural -> Maybe (Ordinal n)+naturalToOrd' = O.naturalToOrd'
type-natural.cabal view
@@ -1,57 +1,64 @@-name: type-natural-version: 0.7.1.4-cabal-version: >=1.10-build-type: Simple-license: BSD3-license-file: LICENSE-copyright: (C) Hiromi ISHII 2013-2014-maintainer: konn.jinro_at_gmail.com-homepage: https://github.com/konn/type-natural-synopsis: Type-level natural and proofs of their properties.-description:-    Type-level natural numbers and proofs of their properties.-    .-    Version 0.6+ supports __GHC 8+ only__.-    .-    __Use 0.5.* with ~ GHC 7.10.3__.-category: Math-author: Hiromi ISHII-tested-with: GHC ==8.0.2 GHC ==8.2.2+-- Initial type-natural.cabal generated by cabal init.  For further +-- documentation, see http://haskell.org/cabal/users-guide/ +name:                type-natural+version:             0.8.0.0+synopsis:            Type-level natural and proofs of their properties.+description:         Type-level natural numbers and proofs of their properties.+                     .+                     Version 0.6+ supports __GHC 8+ only__.+                     .+                     __Use 0.5.* with ~ GHC 7.10.3__.+homepage:            https://github.com/konn/type-natural+license:             BSD3+license-file:        LICENSE+author:              Hiromi ISHII+maintainer:          konn.jinro_at_gmail.com+copyright:           (C) Hiromi ISHII 2013-2014+category:            Math+build-type:          Simple+cabal-version:       >= 1.10+tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1+ source-repository head-    type: git-    location: git://github.com/konn/type-natural.git+  Type: git+  Location: git://github.com/konn/type-natural.git + library-    -    if impl(ghc >=8.0.0)-        ghc-options: -Wno-redundant-constraints-    exposed-modules:-        Data.Type.Natural-        Data.Type.Ordinal-        Data.Type.Ordinal.Builtin-        Data.Type.Ordinal.Peano-        Data.Type.Natural.Builtin-        Data.Type.Natural.Class-        Data.Type.Natural.Class.Arithmetic-        Data.Type.Natural.Class.Order-    build-depends:-        base >=4 && <4.10,-        equational-reasoning >=0.4.1.1 && <0.6,-        monomorphic >=0.0.3 && <0.1,-        template-haskell >=2.8 && <2.12,-        constraints >=0.3 && <0.10,-        ghc-typelits-natnormalise >=0.4 && <0.6,-        ghc-typelits-presburger >=0.1.1 && <0.2,-        singletons >=2.2 && <2.4-    default-language: Haskell2010-    default-extensions: DataKinds PolyKinds ConstraintKinds GADTs-                        ScopedTypeVariables TemplateHaskell TypeFamilies TypeOperators-                        MultiParamTypeClasses UndecidableInstances FlexibleContexts-                        FlexibleInstances-    other-modules:-        Data.Type.Natural.Definitions-        Data.Type.Natural.Core-        Data.Type.Natural.Compat-    ghc-options: -Wall -O2 -fno-warn-orphans+  ghc-options:         -Wall -O2 -fno-warn-orphans+  if impl(ghc >= 8.0.0)+    ghc-options:       -Wno-redundant-constraints+  exposed-modules:     Data.Type.Natural+                     , Data.Type.Ordinal+                     , Data.Type.Ordinal.Builtin+                     , Data.Type.Ordinal.Peano+                     , Data.Type.Natural.Builtin+                     , Data.Type.Natural.Class+                     , Data.Type.Natural.Class.Arithmetic+                     , Data.Type.Natural.Class.Order+  other-modules:       Data.Type.Natural.Definitions+                     , Data.Type.Natural.Core+                     , Data.Type.Natural.Singleton.Compat+                     , Data.Type.Natural.Singleton.Compat.TH+  build-depends:       base                      == 4.*+                     , equational-reasoning      >= 0.4.1.1+                     , template-haskell          >= 2.8+                     , constraints               >= 0.3+                     , ghc-typelits-natnormalise >= 0.4+                     , ghc-typelits-presburger   >= 0.2.0.0+                     , singletons               >= 2.2 && < 2.5 +  default-language:    Haskell2010+  default-extensions:  DataKinds+                       PolyKinds+                       ConstraintKinds+                       GADTs+                       ScopedTypeVariables+                       TemplateHaskell+                       TypeFamilies+                       TypeOperators+                       MultiParamTypeClasses+                       UndecidableInstances+                       FlexibleContexts+                       FlexibleInstances