diff options
author | Mikolaj Konarski <mikolaj.konarski@funktory.com> | 2025-05-17 00:20:47 +0200 |
---|---|---|
committer | Mikolaj Konarski <mikolaj.konarski@funktory.com> | 2025-05-17 00:26:59 +0200 |
commit | 713d76559c42129afb24843af4386d18f1827727 (patch) | |
tree | 476c00426dd778f1adaba50f069cd949a2992c34 /src/Data/Array/Mixed | |
parent | 0d6f77762d1697ea41b190e550f94e459079e3d1 (diff) |
Merge both Lemmas modules
Diffstat (limited to 'src/Data/Array/Mixed')
-rw-r--r-- | src/Data/Array/Mixed/Lemmas.hs | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/src/Data/Array/Mixed/Lemmas.hs b/src/Data/Array/Mixed/Lemmas.hs deleted file mode 100644 index e6d970c..0000000 --- a/src/Data/Array/Mixed/Lemmas.hs +++ /dev/null @@ -1,118 +0,0 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE PolyKinds #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE TypeOperators #-} -{-# OPTIONS_GHC -fplugin GHC.TypeLits.Normalise #-} -{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-} -module Data.Array.Mixed.Lemmas where - -import Data.Proxy -import Data.Type.Equality -import GHC.TypeLits - -import Data.Array.Nested.Mixed.Shape -import Data.Array.Nested.Permutation -import Data.Array.Nested.Types - - --- * Lemmas - --- ** Nat - -lemLeqSuccSucc :: k + 1 <= n => Proxy k -> Proxy n -> (k <=? n - 1) :~: True -lemLeqSuccSucc _ _ = unsafeCoerceRefl - -lemLeqPlus :: n <= m => Proxy n -> Proxy m -> Proxy k -> (n <=? (m + k)) :~: 'True -lemLeqPlus _ _ _ = Refl - - --- ** Append - -lemAppNil :: l ++ '[] :~: l -lemAppNil = unsafeCoerceRefl - -lemAppAssoc :: Proxy a -> Proxy b -> Proxy c -> (a ++ b) ++ c :~: a ++ (b ++ c) -lemAppAssoc _ _ _ = unsafeCoerceRefl - -lemAppLeft :: Proxy l -> a :~: b -> a ++ l :~: b ++ l -lemAppLeft _ Refl = Refl - - --- ** Rank - -lemRankApp :: forall sh1 sh2. - StaticShX sh1 -> StaticShX sh2 - -> Rank (sh1 ++ sh2) :~: Rank sh1 + Rank sh2 -lemRankApp ZKX _ = Refl -lemRankApp (_ :!% (ssh1 :: StaticShX sh1T)) ssh2 - = lem (Proxy @(Rank sh1T)) Proxy Proxy $ - sym (lemRankApp ssh1 ssh2) - where - lem :: proxy a -> proxy b -> proxy c - -> (a + b :~: c) - -> c + 1 :~: (a + 1 + b) - lem _ _ _ Refl = Refl - -lemRankAppComm :: proxy sh1 -> proxy sh2 - -> Rank (sh1 ++ sh2) :~: Rank (sh2 ++ sh1) -lemRankAppComm _ _ = unsafeCoerceRefl - -lemRankReplicate :: proxy n -> Rank (Replicate n (Nothing @Nat)) :~: n -lemRankReplicate _ = unsafeCoerceRefl - - --- ** Various type families - -lemReplicatePlusApp :: forall n m a. SNat n -> Proxy m -> Proxy a - -> Replicate (n + m) a :~: Replicate n a ++ Replicate m a -lemReplicatePlusApp sn _ _ = go sn - where - go :: SNat n' -> Replicate (n' + m) a :~: Replicate n' a ++ Replicate m a - go SZ = Refl - go (SS (n :: SNat n'm1)) - | Refl <- lemReplicateSucc @a @n'm1 - , Refl <- go n - = sym (lemReplicateSucc @a @(n'm1 + m)) - -lemDropLenApp :: Rank l1 <= Rank l2 - => Proxy l1 -> Proxy l2 -> Proxy rest - -> DropLen l1 l2 ++ rest :~: DropLen l1 (l2 ++ rest) -lemDropLenApp _ _ _ = unsafeCoerceRefl - -lemTakeLenApp :: Rank l1 <= Rank l2 - => Proxy l1 -> Proxy l2 -> Proxy rest - -> TakeLen l1 l2 :~: TakeLen l1 (l2 ++ rest) -lemTakeLenApp _ _ _ = unsafeCoerceRefl - -lemInitApp :: Proxy l -> Proxy x -> Init (l ++ '[x]) :~: l -lemInitApp _ _ = unsafeCoerceRefl - -lemLastApp :: Proxy l -> Proxy x -> Last (l ++ '[x]) :~: x -lemLastApp _ _ = unsafeCoerceRefl - - --- ** KnownNat - -lemKnownNatSucc :: KnownNat n => Dict KnownNat (n + 1) -lemKnownNatSucc = Dict - -lemKnownNatRank :: ShX sh i -> Dict KnownNat (Rank sh) -lemKnownNatRank ZSX = Dict -lemKnownNatRank (_ :$% sh) | Dict <- lemKnownNatRank sh = Dict - -lemKnownNatRankSSX :: StaticShX sh -> Dict KnownNat (Rank sh) -lemKnownNatRankSSX ZKX = Dict -lemKnownNatRankSSX (_ :!% ssh) | Dict <- lemKnownNatRankSSX ssh = Dict - - --- ** Known shapes - -lemKnownReplicate :: SNat n -> Dict KnownShX (Replicate n Nothing) -lemKnownReplicate sn = lemKnownShX (ssxFromSNat sn) - -lemKnownShX :: StaticShX sh -> Dict KnownShX sh -lemKnownShX ZKX = Dict -lemKnownShX (SKnown SNat :!% ssh) | Dict <- lemKnownShX ssh = Dict -lemKnownShX (SUnknown () :!% ssh) | Dict <- lemKnownShX ssh = Dict |