open import Level
open import Data.Product
open import Relation.Unary
open import Relation.Unary.Relation.Binary.Equality
open import Relation.Unary.Properties
open import Algebra
open import Algebra.Module
open import Algebra.Apartness
module Algebra.SubModule.Field {ℓ₁} {ℓ₂} {ℓm}
(field' : HeytingField ℓm ℓ₁ ℓ₂)
(let open HeytingField field')
(let open HeytingCommutativeRing heytingCommutativeRing using (commutativeRing))
(let open CommutativeRing commutativeRing using (ring; *-commutativeMonoid))
(leftModule : LeftModule ring ℓm ℓm)
where
open LeftModule leftModule
open import Relation.Binary.Reasoning.Setoid ≈ᴹ-setoid
import Relation.Binary.Reasoning.Setoid setoid as S
open import Algebra.Solver.CommutativeMonoid *-commutativeMonoid
open import Algebra.Properties.Ring ring
open import Algebra.SubModule.Base leftModule
open import Algebra.SubModule.Properties leftModule
import Relation.Binary.Reasoning.Setoid (≐-setoid Carrierᴹ ℓm) as ≐
sameMultipliedˡ : ∀ r (r#0 : r # 0#) v → span v ⊆ span (r *ₗ v)
sameMultipliedˡ r r#0 v {x} (rx , rx*v≈x) = (rx * r⁻¹) , (begin
(rx * r⁻¹) *ₗ r *ₗ v ≈˘⟨ *ₗ-assoc _ _ _ ⟩
(rx * r⁻¹ * r) *ₗ v ≈⟨ *ₗ-congʳ lemma ⟩
rx *ₗ v ≈⟨ rx*v≈x ⟩
x ∎) where
r⁻¹×Inv = #⇒invertible r#0
r⁻¹ = r⁻¹×Inv .proj₁
r⁻¹-0*r≈1 : r * r⁻¹ ≈ 1#
r⁻¹-0*r≈1 = S.begin
r * r⁻¹ S.≈˘⟨ *-congʳ (trans (+-congˡ -0#≈0#) (+-identityʳ _)) ⟩
(r - 0#) * r⁻¹ S.≈⟨ r⁻¹×Inv .proj₂ .proj₂ ⟩
1# S.∎
lemma = S.begin
rx * r⁻¹ * r S.≈⟨ solve 3 (λ a b c → ((a ⊕ b) ⊕ c) , a ⊕ c ⊕ b) refl rx r⁻¹ r ⟩
rx * (r * r⁻¹) S.≈⟨ *-congˡ r⁻¹-0*r≈1 ⟩
rx * 1# S.≈⟨ *-identityʳ _ ⟩
rx S.∎
sameMultiplied : ∀ r (r#0 : r # 0#) v → span v ≐ span (r *ₗ v)
sameMultiplied r r#0 v = sameMultipliedˡ r r#0 v , sameMultipliedʳ r v
sameMulitpliedBoth : ∀ r₁ (r₁#0 : r₁ # 0#) r₂ v₁ v₂ →
(span v₁ +ₛ span v₂) ≐ (span v₁ +ₛ span (r₁ *ₗ v₂ +ᴹ -ᴹ (r₂ *ₗ v₁)))
sameMulitpliedBoth r₁ r₁#0 r₂ v₁ v₂ = ≐.begin
(span v₁ +ₛ span v₂) ≐.≈⟨ +ₛ-congˡ (sameMultiplied r₁ r₁#0 v₂) ⟩
(span v₁ +ₛ span (r₁ *ₗ v₂)) ≐.≈˘⟨ sameAdd (- r₂) _ _ ⟩
(span v₁ +ₛ span (- r₂ *ₗ v₁ +ᴹ r₁ *ₗ v₂)) ≐.≈⟨ +ₛ-congˡ (cong-span (+ᴹ-comm _ _)) ⟩
(span v₁ +ₛ span (r₁ *ₗ v₂ +ᴹ - r₂ *ₗ v₁)) ≐.≈⟨ +ₛ-congˡ (cong-span (+ᴹ-congˡ (-→-ᴹ _ _))) ⟩
(span v₁ +ₛ span (r₁ *ₗ v₂ +ᴹ -ᴹ (r₂ *ₗ v₁))) ≐.∎