module MatrixFuncNormalization.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.Functional open import Relation.Binary.Core using (Rel) open import Relation.Binary.PropositionalEquality open import Relation.Unary open import Relation.Nullary.Construct.Add.Supremum open import lbry open import MatrixNormalization.FinProps import MatrixFuncNormalization.MatrixProps as PropNorm private open module PNorm {n} = PropNorm (F.<-strictTotalOrder n) private variable ℓ ℓ′ : Level m n : ℕ record FuncNormAndZeros {ℓ} {m n : ℕ} {Amn : Set ℓ} (numberZeros : Amn → Vector (Fin m ⁺) (suc n)) (_≈_ : Rel (Vector (Fin m ⁺) (suc n)) ℓ′) : Set (ℓ ⊔ ℓ′) where field f : Amn → Amn nZerosProp : (a : Amn) → numberZeros a ≈ numberZeros (f a) record FuncNormAllLines (m n : ℕ) (Amn : Set ℓ) : Set (lsuc lzero ⊔ ℓ) where field numberZeros : Amn → Vector (Fin m ⁺) (suc n) normProps : FinProps {ℓ₁ = lzero} {ℓ₂ = lzero} (Vector (Fin 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₂)