open import Algebra.DecidableField
module MatrixFuncNormalization.ElimZeros.Properties {c ℓ₁ ℓ₂} (dField : DecidableField c ℓ₁ ℓ₂) where
open import Level using (Level; lift)
open import Algebra
open import Algebra.Apartness
open import Function
open import Data.Product
open import Data.Fin as F using (Fin; zero; suc; inject!; toℕ)
open import Data.Fin.Patterns
open import Data.Fin.Properties
open import Data.Maybe
open import Data.Sum
open import Data.Nat using (ℕ; NonZero; z≤n; s<s)
open import Data.Vec.Functional as V
open import Data.Maybe.Relation.Unary.All
open import Data.Maybe.Relation.Unary.Any
open import Relation.Nullary.Construct.Add.Supremum
open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; _≢_; cong)
open import Relation.Binary.Construct.Add.Supremum.Strict
open import Algebra.Matrix
open import MatrixFuncNormalization.normBef dField using (VecPivotPos; MatrixPivots)
open import MatrixFuncNormalization.ElimZeros.Base dField hiding (divideVec)
open import MatrixFuncNormalization.NormAfter.Properties dField using (ColumnsZero; Maybe≈0)
open import MatrixFuncNormalization.NormAfter.PropsFlip dField
open import MatrixFuncNormalization.Definitions dField
open DecidableField dField renaming (Carrier to F; heytingField to hField)
open import Algebra.HeytingField.Properties hField
open import Algebra.Ring.Properties
import Algebra.Module.Definition as MDefinition
import Algebra.Module.PropsField as PField
open import Algebra.Module.Instances.FunctionalVector ring
open import Algebra.BigOps
open import Data.Vec.Functional.Relation.Binary.Equality.Setoid setoid
open import Relation.Binary.Reasoning.Setoid setoid
open module PFieldN {n} = PField dField (leftModule n)
open module MDefN {n} = MDefinition (leftModule n)
open PNorm
open module ∑′ {n} = SumCommMonoid (commutativeMonoid n)
private variable
m n : ℕ
invVecValue : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → F
invVecValue xs ⊤⁺ vPos = 1#
invVecValue xs [ p ] (xp#0 , _) = proj₁ (#0⇒invertible xp#0)
multiplyF : ∀ (xs : Vector F n) (p : Fin n ⁺) → F
multiplyF xs ⊤⁺ = 1#
multiplyF xs [ p ] = xs p
divideF : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → F
divideF xs ⊤⁺ vPos = 1#
divideF xs [ _ ] (xp#0 , _) = #⇒invertible xp#0 .proj₁
divideVec : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → Vector F n
divideVec xs ⊤⁺ vPos i = xs i
divideVec xs [ p ] (xp#0 , _) i = #⇒invertible xp#0 .proj₁ * xs i
divideF*vec≈divideVec : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) i
→ divideF xs p vPos * xs i ≈ divideVec xs p vPos i
divideF*vec≈divideVec xs [ p ] (xp#0 , _) i = refl
divideF*vec≈divideVec xs ⊤⁺ vPos i = *-identityˡ _
multiply*divide≈same : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) i
→ multiplyF xs p * divideVec xs p vPos i ≈ xs i
multiply*divide≈same xs ⊤⁺ vPos i = *-identityˡ _
multiply*divide≈same xs [ p ] (xsp#0 , _) i = begin
xs p * (xsP⁻¹ * xs i) ≈⟨ *-comm _ _ ⟩
_ * xs p ≈⟨ *-congʳ (*-comm _ _) ⟩
xs i * _ * xs p ≈⟨ *-assoc _ _ _ ⟩
xs i * (xsP⁻¹ * xs p) ≈⟨ *-congˡ (#0⇒invertible xsp#0 .proj₂ .proj₁) ⟩
xs i * 1# ≈⟨ *-identityʳ _ ⟩
xs i ∎ where
xsP⁻¹ = #⇒invertible xsp#0 .proj₁
multiplyF#0 : ∀ (xs : Vector F n) (p : Fin n ⁺) (vPos : VecPivotPos xs p) → multiplyF xs p # 0#
multiplyF#0 xs ⊤⁺ _ = 1#0
multiplyF#0 xs [ p ] (xsP#0 , _) = xsP#0
divideF#0 : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → divideF xs p vPos # 0#
divideF#0 xs [ p ] vPos = x⁻¹#0 _ _
divideF#0 xs ⊤⁺ vPos = 1#0
divideVec₂ : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → Vector F n
divideVec₂ xs p vPos i = invVecValue xs p vPos * xs i
dV₂≈dV : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → divideVec₂ xs p vPos ≋ divideVec xs p vPos
dV₂≈dV xs ⊤⁺ vPos _ = *-identityˡ _
dV₂≈dV xs [ p ] vPos i = refl
divideVecPreservesPos : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → VecPivotPos (divideVec xs p vPos) p
divideVecPreservesPos xs ⊤⁺ vPos = vPos
proj₁ (divideVecPreservesPos xs [ p ] vPos@(xp#0 , xi≈0)) = x#0y#0→xy#0 (x⁻¹#0 _ _) xp#0
proj₂ (divideVecPreservesPos xs [ p ] vPos@(xp#0 , xi≈0)) i i<p = begin
_ * xs i ≈⟨ *-congˡ (xi≈0 i i<p) ⟩
_ * 0# ≈⟨ zeroʳ _ ⟩
0# ∎
divideVec≈0 : ∀ {xs : Vector F n} {q} (vPos : VecPivotPos xs q) p → xs p ≈ 0# → divideVec xs q vPos p ≈ 0#
divideVec≈0 {q = [ q ]} vPos p xsP≈0 = trans (*-congˡ xsP≈0) (0RightAnnihilates _)
divideVec≈0 {q = ⊤⁺} vPos p = id
divideVecP≈1 : ∀ {xs : Vector F n} {p} (vPos : VecPivotPos xs p) → All (λ i → divideVec xs p vPos i ≈ 1#) p
divideVecP≈1 {xs = xs} {[ i ]} (xsI#0 , _) = let x⁻¹ = #⇒invertible xsI#0 .proj₁ in just (begin
x⁻¹ * xs i ≈˘⟨ *-congˡ (trans (+-congˡ -0#≈0#) (+-identityʳ _)) ⟩
x⁻¹ * (xs i - 0#) ≈⟨ #⇒invertible xsI#0 .proj₂ .proj₁ ⟩
1# ∎)
divideVecP≈1 {p = ⊤⁺} vPos = nothing
invVecValue#0 : ∀ (xs : Vector F n) p (vPos : VecPivotPos xs p) → invVecValue xs p vPos # 0#
invVecValue#0 xs ⊤⁺ vPos = 1#0
invVecValue#0 xs [ p ] vPos = x⁻¹#0 _ _
firstZero : Vector (Fin m ⁺) n → Fin (ℕ.suc n)
firstZero {n = ℕ.zero} xs = 0F
firstZero {n = ℕ.suc n} xs = maybe′ (const (suc (firstZero (tail xs)))) 0F (xs 0F)
normPivs : ∀ (pivs : Vector (Fin m ⁺) n) → Vector (Fin m) (toℕ (firstZero pivs))
normPivs {n = ℕ.suc n} pivs i with pivs 0F
normPivs {n = ℕ.suc n} pivs 0F | just i = i
normPivs {n = ℕ.suc n} pivs (suc i) | just _ = normPivs (tail pivs) i
mPivs≁0′ : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs)
→ MatrixPivots≁0 (xs ∘ inject!) (normPivs pivs)
mPivs≁0′ {n = ℕ.suc n} xs pivs mPivs i with pivs 0F | mPivs 0F
mPivs≁0′ {_} {ℕ.suc n} xs pivs mPivs 0F | just x | c = c
mPivs≁0′ {_} {ℕ.suc n} xs pivs mPivs (suc i) | just x | _ = mPivs≁0′ (tail xs) (tail pivs) (mPivs ∘ suc) i
normPivsSame : ∀ (pivs : Vector (Fin m ⁺) n) i → just (normPivs pivs i) ≡ pivs (inject! i)
normPivsSame {n = ℕ.suc n} pivs i with pivs 0F in eq
normPivsSame {n = ℕ.suc n} pivs 0F | just x rewrite eq = ≡.refl
normPivsSame {n = ℕ.suc n} pivs (suc i) | just x rewrite eq = normPivsSame {n = n} (tail pivs) i
private
injectPreserves : ∀ {k : Fin (ℕ.suc n)} {i j : F.Fin′ k} → i F.< j → inject! i F.< inject! j
injectPreserves {ℕ.suc n} {k = suc k} {0F} {suc j} (s<s z≤n) = s<s z≤n
injectPreserves {ℕ.suc n} {k = suc k} {suc i} {suc j} (s<s i<j) = s<s (injectPreserves i<j)
inject⇒≡ : ∀ {k : Fin (ℕ.suc n)} {i j : F.Fin′ k} → inject! i ≡ inject! j → i ≡ j
inject⇒≡ {ℕ.zero} {0F} {i = ()} x
inject⇒≡ {ℕ.zero} {suc ()} {i = 0F} {0F} x
inject⇒≡ {ℕ.zero} {suc ()} {i = 0F} {suc j} x
inject⇒≡ {ℕ.zero} {suc ()} {i = suc i} x
inject⇒≡ {ℕ.suc n} {suc k} {0F} {0F} ≡.refl = ≡.refl
inject⇒≡ {ℕ.suc n} {suc k} {suc i} {suc j} eq rewrite inject⇒≡ (suc-injective eq) = ≡.refl
inject⇒≢ : ∀ {k : Fin (ℕ.suc n)} {i j : F.Fin′ k} → i ≢ j → inject! i ≢ inject! j
inject⇒≢ = _∘ inject⇒≡
pivsCrescent≁0′ : {pivs : Vector (Fin m ⁺) n} (normed : AllRowsNormalized pivs) → AllRowsNormalized≁0 (normPivs pivs)
pivsCrescent≁0′ {pivs = pivs} normed {i} {j} i<j = helper $ normed _ _ $ injectPreserves i<j
where
helper2 : _ → _
helper2 (inj₁ [ pI<pJ ]) = pI<pJ
helper : pivs (inject! i) <′ pivs (inject! j) → _
helper rewrite ≡.sym (normPivsSame pivs i) | ≡.sym (normPivsSame pivs j) = helper2
cols0≁0′ : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (cols0 : ColumnsZero xs pivs)
→ ColumnsZero≁0 (xs ∘ inject!) (normPivs pivs)
cols0≁0′ {n = ℕ.suc n} xs pivs cols0 i j i≢j = helper $ cols0 _ _ $ inject⇒≢ i≢j
where
helper : Maybe≈0 (xs (inject! j)) (pivs (inject! i)) → _
helper rewrite ≡.sym (normPivsSame pivs i) = id
pivsOne≁0′ : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (pivsOne : PivsOne xs pivs)
→ PivsOne≁0 (xs ∘ inject!) (normPivs pivs)
pivsOne≁0′ {n = ℕ.suc n} xs pivs pivsOne i with pivs 0F | pivsOne 0F
pivsOne≁0′ {_} {ℕ.suc n} xs pivs pivsOne 0F | just a | just b = b
pivsOne≁0′ {_} {ℕ.suc n} xs pivs pivsOne (suc i) | just a | just b = pivsOne≁0′ (tail xs) (tail pivs) (pivsOne ∘ F.suc) i
eq0Piv : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ firstZero pivs ≡ 0F → ∀ i
→ xs i ≋ 0ᴹ
eq0Piv {n = ℕ.suc n} xs pivs mPivs normed fP≈0 0F j with pivs 0F | mPivs 0F
... | ⊤⁺ | lift lower = lower _
eq0Piv {n = ℕ.suc n} xs pivs mPivs normed fP≈0 (suc i) j with pivs 0F | pivs (suc i) | normed 0F (suc i) (s<s z≤n) | mPivs (suc i)
... | ⊤⁺ | ⊤⁺ | inj₂ _ | lift lower = lower _
sumZero : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ firstZero pivs ≡ 0F
→ ∑ xs ≈ᴹ 0ᴹ
sumZero {n = n} xs pivs mPivs normed fZ i = begin
∑ xs i ≈⟨ ∑Ext (eq0Piv xs pivs mPivs normed fZ) i ⟩
∑ {_} {n} (const (const 0#)) i ≈⟨ ∑0r n _ ⟩
0# ∎
injSuc : ∀ {c : Fin (ℕ.suc n)} i → inject! {i = suc c} (suc i) ≡ F.suc (inject! {i = c} i)
injSuc i = ≡.refl
∑Inj′ : ∀ (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs) {c}
→ firstZero pivs ≡ c
→ ∑ (xs ∘ inject! {i = c}) ≈ᴹ ∑ xs
∑Inj′ xs pivs mPivs normed {0F} eqn i = sym $ sumZero xs pivs mPivs normed eqn i
∑Inj′ {n = ℕ.suc n} xs pivs mPivs normed {suc c} eqn i with pivs 0F
... | just _ = begin
xs 0F i + ∑ {_} {toℕ c} (xs ∘ suc ∘ inject! {i = c}) i ≈⟨ +-congˡ
(∑Inj′ (tail xs) (tail pivs) (mPivs ∘ suc) (λ a b a<b → normed (suc a) (suc b) (s<s a<b)) {c} (suc-injective eqn) i) ⟩
xs 0F i + ∑ {_} {n} (xs ∘ suc) i ∎
∑Inj : ∀ {xs : Matrix F _ m} {pivs : Vector (Fin m ⁺) n} (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ ∑ (xs ∘ inject! {i = firstZero pivs}) ≈ᴹ ∑ xs
∑Inj mPivs normed = ∑Inj′ _ _ mPivs normed ≡.refl
sumZero′ : (xs : Matrix F _ m) (ys : Vector F n) (pivs : Vector (Fin m ⁺) n)
(mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ firstZero pivs ≡ 0F
→ ∑ (ys *ᵣ xs) ≈ᴹ 0ᴹ
sumZero′ {n = n} xs ys pivs mPivs normed eqn i = begin
∑ (ys *ᵣ xs) i ≈⟨ ∑Ext (λ j k → trans (*-congˡ (eq0Piv xs pivs mPivs normed eqn j k)) (zeroʳ _)) i ⟩
∑ {_} {n} (const $ const 0#) i ≈⟨ ∑0r n _ ⟩
0# ∎
∑Inj′₂ : ∀ (xs : Matrix F _ m) (ys : Vector F n) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs)
(normed : AllRowsNormalized pivs) {c}
→ firstZero pivs ≡ c
→ ∑ ((ys *ᵣ xs) ∘ inject! {i = c}) ≈ᴹ ∑ (ys *ᵣ xs)
∑Inj′₂ xs ys pivs mPivs normed {0F} eq i = sym (sumZero′ xs ys pivs mPivs normed eq i)
∑Inj′₂ {n = ℕ.suc n} xs ys pivs mPivs normed {suc c} eq i with pivs 0F
... | just x = +-congˡ (∑Inj′₂ (tail xs) (tail ys) (tail pivs) (mPivs ∘ suc) (λ a b a<b → normed _ _ (s<s a<b)) (suc-injective eq) i)
∑Inj₂ : ∀ {xs : Matrix F _ m} {pivs : Vector (Fin m ⁺) n} (ys : Vector F n) (mPivs : MatrixPivots xs pivs)
(normed : AllRowsNormalized pivs)
→ ∑ ((ys *ᵣ xs) ∘ inject! {i = firstZero pivs}) ≈ᴹ ∑ (ys *ᵣ xs)
∑Inj₂ ys mPivs normed = ∑Inj′₂ _ ys _ mPivs normed ≡.refl
open _reaches_ renaming (ys to ws; xs*ys≈x to xs*ws≈x)
xs⊆ⱽxs∘inj : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ xs ⊆ⱽ xs ∘ inject! {i = firstZero pivs}
ws (xs⊆ⱽxs∘inj xs pivs mPivs normed (ys by xs*ys≈x)) = ys ∘ inject!
xs*ws≈x (xs⊆ⱽxs∘inj xs pivs mPivs normed {x} (ys by xs*ys≈x)) i = begin
∑ ((ys *ᵣ xs) ∘ inject! {i = firstZero pivs}) i ≈⟨ ∑Inj₂ ys mPivs normed i ⟩
∑ (ys *ᵣ xs) i ≈⟨ xs*ys≈x i ⟩
x i ∎
vecInj : (k : Fin (ℕ.suc n)) (ys : Vector F $ toℕ $ k) → Vector F n
vecInj 0F ys i = 0#
vecInj (suc k) ys 0F = ys 0F
vecInj (suc k) ys (suc i) = vecInj k (tail ys) i
vecInjProp : ∀ (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (ys : Vector F _)
(mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs) c
→ firstZero pivs ≡ c
→ ∑ (vecInj (firstZero pivs) ys *ᵣ xs) ≈ᴹ ∑ (ys *ᵣ xs ∘ inject!)
vecInjProp {n = ℕ.zero} xs pivs ys mPivs normed 0F eqn i = refl
vecInjProp {n = ℕ.suc n} xs pivs ys mPivs normed 0F eqn i with pivs 0F
... | ⊤⁺ = begin
0# * _ + ∑ {_} {n} (λ _ _ → 0# * _) i ≈⟨ +-cong (zeroˡ _) (trans (∑Ext {_} {n} (λ j k → zeroˡ _) i) (∑0r n i)) ⟩
0# + 0# ≈⟨ +-identityˡ _ ⟩
0# ∎
vecInjProp {n = ℕ.suc n} xs pivs ys mPivs normed (suc c) eqn i with pivs 0F
... | just x = +-congˡ $ vecInjProp (tail xs) (tail pivs) (tail ys) (mPivs ∘ suc) (λ a b a<b → normed _ _ (s<s a<b))
c (suc-injective eqn) i
xs⊇ⱽxs∘inj : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ xs ⊇ⱽ xs ∘ inject! {i = firstZero pivs}
ws (xs⊇ⱽxs∘inj {n = n} xs pivs mPivs normed (ys by xs*ys≈x)) = vecInj (firstZero pivs) ys
xs*ws≈x (xs⊇ⱽxs∘inj {n = n} xs pivs mPivs normed {x} (ys by xs*ys≈x)) i = begin
∑ (vecInj (firstZero pivs) ys *ᵣ xs) i ≈⟨ vecInjProp xs pivs ys mPivs normed _ ≡.refl i ⟩
∑ (ys *ᵣ xs ∘ inject!) i ≈⟨ xs*ys≈x i ⟩
x i ∎
xs≋ⱽxs∘inj : (xs : Matrix F _ m) (pivs : Vector (Fin m ⁺) n) (mPivs : MatrixPivots xs pivs) (normed : AllRowsNormalized pivs)
→ xs ≋ⱽ xs ∘ inject! {i = firstZero pivs}
xs≋ⱽxs∘inj xs pivs mPivs normed = record
{ fwd = xs⊆ⱽxs∘inj xs pivs mPivs normed
; bwd = xs⊇ⱽxs∘inj xs pivs mPivs normed
}
module MatNormed (xsNormed : MatrixNormed m n) where
open MatrixNormed xsNormed
ys : Matrix F n m
ys i = divideVec (xs i) (pivs i) (mPivots i)
mPivAfter : MatrixPivots ys pivs
mPivAfter _ = divideVecPreservesPos _ _ _
columnsZeros : ColumnsZero ys pivs
columnsZeros i j i≢j = helper (columnsZero i j i≢j)
where
helper : Maybe≈0 (xs j) (pivs i) → Maybe≈0 (divideVec (xs j) (pivs j) (mPivots j)) (pivs i)
helper with pivs i
... | ⊤⁺ = λ _ → _
... | [ p ] = divideVec≈0 (mPivots j) p
pivsOne : PivsOne ys pivs
pivsOne _ = divideVecP≈1 _
xs≋ⱽys : xs ≋ⱽ ys
xs≋ⱽys = ≋ⱽ-trans (*#0≈ⱽ xs λ i → invVecValue#0 (xs i) (pivs i) (mPivots i))
(≋⇒≋ⱽ λ i → dV₂≈dV (xs i) (pivs i) (mPivots i))
ysNormed : MatrixIsNormed ys
ysNormed = record
{ mPivots = mPivAfter
; pivsCrescent = pivsCrescent
; columnsZero = columnsZeros
}
ysIsNormed≈1 : MatrixIsNormed≈1 ys
ysIsNormed≈1 = record { isNormed = ysNormed ; pivsOne = pivsOne }
ysNormed≈1 : MatrixNormed≈1 m n
ysNormed≈1 = record { isNormed≈1 = ysIsNormed≈1 }
sizeF = firstZero pivs
n′ = toℕ sizeF
xs≁0 : Matrix F n′ m
xs≁0 = xs ∘ inject! {i = sizeF}
pivs≁0 = normPivs pivs
mPivs≁0 : MatrixPivots≁0 xs≁0 pivs≁0
mPivs≁0 = mPivs≁0′ xs pivs mPivots
pivsCrescent≁0 : AllRowsNormalized≁0 pivs≁0
pivsCrescent≁0 x<y = pivsCrescent≁0′ pivsCrescent x<y
colsZero : ColumnsZero≁0 xs≁0 pivs≁0
colsZero = cols0≁0′ _ _ columnsZero
pivsOne≁0 : PivsOne xs pivs → PivsOne≁0 xs≁0 pivs≁0
pivsOne≁0 = pivsOne≁0′ _ _
xs≋ⱽxs≁0 : xs ≋ⱽ xs≁0
xs≋ⱽxs≁0 = xs≋ⱽxs∘inj xs pivs mPivots pivsCrescent
xsIsNormed≁0 : MatrixIsNormed≁0 xs≁0
xsIsNormed≁0 = record
{ mPivots = mPivs≁0
; pivsCrescent = pivsCrescent≁0
; columnsZero = colsZero
}
xsNormed≁0 : MatrixNormed≁0 _ _
xsNormed≁0 = record { isNormed = xsIsNormed≁0 }
module _ (pivsOne : PivsOne≁0 xs≁0 pivs≁0) where
xs≁0≈1isNormed : MatrixIsNormed≁0≈1 xs≁0
xs≁0≈1isNormed = record { isNormed = xsIsNormed≁0 ; pivsOne = pivsOne }
xs≁0≈1Normed : MatrixNormed≁0≈1 _ _
xs≁0≈1Normed = record { isNormed≈1 = xs≁0≈1isNormed }
module FromNormed (xsNormed : MatrixNormed m n) where
open MatrixNormed xsNormed
open MatNormed xsNormed public
ysFromNormalization : FromNormalization≈1 xs
ysFromNormalization = record
{ ysNormed = ysIsNormed≈1
; xs≋ⱽys = xs≋ⱽys
}
xs≁0FromFormalization : FromNormalization≁0 xs _
xs≁0FromFormalization = record
{ ysNormed = xsIsNormed≁0
; xs≋ⱽys = xs≋ⱽxs≁0
}
module FromNormed≈1 (xsNormed≈1 : MatrixNormed≈1 m n) where
open MatrixNormed≈1 xsNormed≈1
open FromNormed xsNormed hiding (pivsOne) public
xs≁0Normed : MatrixIsNormed≁0≈1 xs≁0
xs≁0Normed = xs≁0≈1isNormed (pivsOne≁0 pivsOne)
xs≁0≈1FromFormalization : FromNormalization≁0≈1 xs _
xs≁0≈1FromFormalization = record
{ ysNormed = xs≁0Normed
; xs≋ⱽys = xs≋ⱽxs≁0
}