module MatrixNormalization.FinInduction where open import Level using (Level; _⊔_) renaming (zero to lzero; suc to lsuc) open import Function open import Data.Nat as ℕ hiding (_⊔_) open import Data.Nat.Properties as ℕ hiding (<⇒≢) open import Data.Product open import Data.Fin as F open import Data.Fin.Properties as F open import Data.Fin.Induction as F open import Data.Vec open import Relation.Binary.Core using (Rel) open import Relation.Binary.PropositionalEquality open import Relation.Unary open import lbry open import MatrixNormalization.FinProps open import MatrixNormalization.Props private open module PNorm {n} = PropNorm (F.<-strictTotalOrder n) renaming (A to Carrier) private variable ℓ ℓ′ : Level m n : ℕ record FuncNormAndZeros {ℓ} {m n : ℕ} {Amn : Set ℓ} (numberZeros : Amn → Vec (Fin⊤ m) (suc n)) (g : Rel (Vec (Fin⊤ m) (suc n)) ℓ′) : Set (ℓ ⊔ ℓ′) where field f : Amn → Amn nZerosProp : (a : Amn) → g (numberZeros a) (numberZeros (f a)) record FuncNormAllLines (m n : ℕ) (Amn : Set ℓ) : Set (lsuc lzero ⊔ ℓ) where field numberZeros : Amn → Vec (Fin⊤ m) (suc n) normProps : FinProps {ℓ₁ = lzero} {ℓ₂ = lzero} (Vec (Carrier {m}) (suc n)) n open FinProps normProps field fNormLines : ∀ i j i≢j → FuncNormAndZeros {m = m} {n} {Amn} numberZeros (Pab i j i≢j) module _ {Amn : Set ℓ} {m n : ℕ} (fNorm : FuncNormAllLines m n Amn) where open FuncNormAllLines fNorm open FuncNormAndZeros open FinProps normProps public normalizeStep : ∀ (a : Amn) i j i≤j (normBefore : Pij i (inject₁ {n = n} j) (cong≤ʳ (sym (toℕ-inject₁ _)) i≤j) (numberZeros a)) → Σ[ a ∈ Amn ] Pij i (suc j) (<⇒≤ (s≤s i≤j)) (numberZeros a) normalizeStep a i j i≤j normBefore = _ , Ps i j i≤j (numberZeros a) (numberZeros fa) normBefore (nZerosProp fnorm a) where fnorm = fNormLines i (suc j) (<⇒≢ (s≤s i≤j)) fa = f fnorm a normalizeStepLine' : ∀ (a : Amn) i (normBefore : Pij i i F.≤-refl (numberZeros a)) → Σ[ a ∈ Amn ] Pij i (fromℕ _) (≤fromℕ _) (numberZeros a) normalizeStepLine' a i normBefore = <-weakInduction-startingFrom P' Pi' PS (≤fromℕ i) .proj₂ where P' : Pred (Fin (suc n)) _ P' fn = Σ[ fn≥i ∈ fn F.≥ i ] Σ[ a ∈ Amn ] Pij i fn fn≥i (numberZeros a) Pi' : P' i Pi' = F.≤-refl , _ , normBefore PS : ∀ j → P' (inject₁ j) → P' (suc j) PS j (j≥i , a , normed) = i≤inject₁[j]⇒i≤1+j j≥i , _ , normalizeStep a _ _ (cong≤ʳ (toℕ-inject₁ _) j≥i) normed .proj₂ normalizeStepLine : ∀ (a : Amn) i (normBefore : Pi (inject₁ i) (numberZeros a)) → Σ[ a ∈ Amn ] Pi (suc i) (numberZeros a) normalizeStepLine a i normBefore = _ , Pij→Pi _ (numberZeros _) (normalizeStepLine' a (suc i) (Pi→Pii _ (numberZeros _) normBefore) .proj₂) normalizeBeforeLast : Amn → Σ[ a ∈ Amn ] Pi (fromℕ n) (numberZeros a) normalizeBeforeLast a = <-weakInduction P' P0 PS (fromℕ _) where P' : Pred _ _ P' fn = Σ[ a ∈ Amn ] Pi fn (numberZeros a) P0 : P' zero proj₁ P0 = _ proj₂ P0 = Pij→Pi zero (numberZeros _) (normalizeStepLine' a _ (P00 _) .proj₂) PS : ∀ i → P' (inject₁ i) → P' (suc i) proj₁ (PS i Pi) = _ proj₂ (PS i Pi) = normalizeStepLine _ _ (Pi .proj₂) .proj₂ normalizeA : Amn → Σ[ a ∈ Amn ] (P (numberZeros a)) normalizeA a = _ , Pi→P (numberZeros _) (normalizeBeforeLast a .proj₂)