open import Algebra.Core open import Algebra.Bundles open import Algebra.Module module Algebra.Module.Props {rr ℓr mr ℓm} (cRing : CommutativeRing rr ℓr) (open CommutativeRing cRing using (ring)) (leftModule : LeftModule ring mr ℓm) where open import Level open import Function open import Data.Nat using (ℕ; zero; suc) open import Data.Fin as F using (Fin) open import Data.Fin.Patterns open import Data.Vec.Functional open import Relation.Binary.Definitions open import Algebra.Module.Definition leftModule open import Algebra.BigOps open CommutativeRing cRing renaming (Carrier to A) open LeftModule leftModule renaming (Carrierᴹ to M) open SumCommMonoid +ᴹ-commutativeMonoid open SumRawRing rawRing using (δ; δss≡δ) open import Algebra.Morphism.Definitions M A _≈_ open import Data.Vec.Functional.Relation.Binary.Equality.Setoid ≈ᴹ-setoid import Relation.Binary.Reasoning.Setoid ≈ᴹ-setoid as ≈ᴹ-Reasoning import Relation.Binary.Reasoning.Setoid setoid as ≈-Reasoning private variable m n : ℕ xs ys zs : Vector M n α : A open ≈ᴹ-Reasoning ∑Mulrdist‵ : (x : A) (V : Vector M n) → x *ₗ ∑ V ≈ᴹ ∑ λ i → x *ₗ V i ∑Mulrdist‵ {zero} x V = *ₗ-zeroʳ _ ∑Mulrdist‵ {suc _} x V = begin x *ₗ ∑ V ≈⟨ *ₗ-distribˡ x (V F.zero) _ ⟩ x *ₗ V F.zero +ᴹ x *ₗ ∑ (tail V) ≈⟨ +ᴹ-congˡ (∑Mulrdist‵ x (tail V)) ⟩ x *ₗ V F.zero +ᴹ ∑ (λ i → x *ₗ V (F.suc i)) ∎ δ*ᵣ-refl : ∀ V (i : Fin n) → ∑ (δ i *ᵣ V) ≈ᴹ V i δ*ᵣ-refl {suc n} V F.zero = begin 1# *ₗ V F.zero +ᴹ ∑ (λ i → δ F.zero (F.suc i) *ₗ tail V i) ≈⟨ +ᴹ-cong (*ₗ-identityˡ _) (begin _ ≈⟨ ∑Ext {n} (λ _ → *ₗ-zeroˡ _) ⟩ ∑ {n} (const 0ᴹ) ≈⟨ ∑0r n ⟩ 0ᴹ ∎ ) ⟩ V F.zero +ᴹ 0ᴹ ≈⟨ +ᴹ-identityʳ _ ⟩ V F.zero ∎ δ*ᵣ-refl {suc n} V i@(F.suc i′) = begin 0# *ₗ _ +ᴹ ∑ {n} (λ j → δ i (F.suc j) *ₗ tail V j) ≈⟨ +ᴹ-cong (*ₗ-zeroˡ _) (begin _ ≈⟨ ∑Ext (λ j → *ₗ-congʳ (reflexive (δss≡δ i′ j))) ⟩ ∑ {n} (λ j → δ i′ j *ₗ tail V j) ≈⟨ δ*ᵣ-refl (tail V) i′ ⟩ _ ∎ ) ⟩ 0ᴹ +ᴹ V i ≈⟨ +ᴹ-identityˡ _ ⟩ V i ∎ xsReachesItself : ∀ xs (i : Fin n) → xs reaches xs i xsReachesItself xs i = record { ys = δ i ; xs*ys≈x = δ*ᵣ-refl xs i } 0∷⊆ⱽ : (xs : Vector M n) → (0ᴹ ∷ xs) ⊆ⱽ xs 0∷⊆ⱽ xs {x} (ys by xs*ys≈x) = as by ∑as*xs≈x where as = tail ys ∑as*xs≈x = begin ∑ (tail ys *ᵣ xs) ≈˘⟨ +ᴹ-identityˡ _ ⟩ 0ᴹ +ᴹ _ ≈˘⟨ +ᴹ-congʳ (*ₗ-zeroʳ _) ⟩ _ *ₗ 0ᴹ +ᴹ ∑ (tail ys *ᵣ xs) ≈⟨ xs*ys≈x ⟩ x ∎ ⊆ⱽ0∷ : (xs : Vector M n) → xs ⊆ⱽ (0ᴹ ∷ xs) ⊆ⱽ0∷ xs {x} (ys by xs*ys≈x) = as by ∑ws≈x where as = 0# ∷ ys ∑ws≈x = begin 0# *ₗ 0ᴹ +ᴹ ∑ (ys *ᵣ xs) ≈⟨ +ᴹ-congʳ (*ₗ-zeroˡ _) ⟩ 0ᴹ +ᴹ ∑ (ys *ᵣ xs) ≈⟨ +ᴹ-identityˡ _ ⟩ ∑ (ys *ᵣ xs) ≈⟨ xs*ys≈x ⟩ x ∎ 0∷≈ⱽ : (xs : Vector M n) → (0ᴹ ∷ xs) ≋ⱽ xs 0∷≈ⱽ xs = record { fwd = 0∷⊆ⱽ xs ; bwd = ⊆ⱽ0∷ xs } ⊆ⱽ-reflexive : xs ≋ ys → xs ⊆ⱽ ys ⊆ⱽ-reflexive {xs = xs} {ys} xs≋ys {x} (ws by ws*xs≈x) = ws by ∑ws≈x where ∑ws≈x = begin ∑ (ws *ᵣ ys) ≈˘⟨ ∑Ext (λ i → *ₗ-congˡ (xs≋ys i)) ⟩ ∑ (ws *ᵣ xs) ≈⟨ ws*xs≈x ⟩ x ∎ ≋ⱽ-refl : Reflexive (_≋ⱽ_ {n}) ≋ⱽ-refl = record { fwd = id ; bwd = id } ≋ⱽ-reflexive : xs ≋ ys → xs ≋ⱽ ys ≋ⱽ-reflexive xs≋ys = record { fwd = ⊆ⱽ-reflexive xs≋ys ; bwd = ⊆ⱽ-reflexive (≋-sym xs≋ys) } ≋ⱽ-sym : Symmetric (_≋ⱽ_ {n}) ≋ⱽ-sym record { fwd = fwd ; bwd = bwd } = record { fwd = bwd ; bwd = fwd } ≋ⱽ-trans : xs ≋ⱽ ys → ys ≋ⱽ zs → xs ≋ⱽ zs ≋ⱽ-trans record { fwd = fwdA ; bwd = bwdA } record { fwd = fwdB ; bwd = bwdB } = record { fwd = fwdB ∘ fwdA ; bwd = bwdA ∘ bwdB } ≋⇒⊆ⱽ : xs ≋ ys → xs ⊆ⱽ ys ≋⇒⊆ⱽ {n} {xs} {ys} xs≋ys (zs by xs*zs≈x) = zs by ≈ᴹ-trans (∑Ext (*ₗ-congˡ ∘ ≋-sym xs≋ys)) xs*zs≈x ≋⇒≋ⱽ : xs ≋ ys → xs ≋ⱽ ys ≋⇒≋ⱽ xs≋ys = record { fwd = ≋⇒⊆ⱽ xs≋ys ; bwd = ≋⇒⊆ⱽ (≋-sym xs≋ys) }