{-# OPTIONS --safe #-} module Cubical.Algebra.CommRing.Quotient.ImageQuotient where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Structure open import Cubical.Foundations.Function open import Cubical.Data.Sigma open import Cubical.Algebra.CommRing open import Cubical.Algebra.CommRing.Ideal open import Cubical.Algebra.Ring.Properties open RingTheory import Cubical.HITs.SetQuotients as SQ import Cubical.Algebra.CommRing.Quotient as CQ module _ {ℓ : Level} (R : CommRing ℓ) {X : Type ℓ} (f : X → ⟨ R ⟩) where module _ where open CommRingStr ⦃...⦄ open CQ instance _ = str R data generatedIdeal : ⟨ R ⟩ → Type ℓ where single : ∀ x → generatedIdeal (f x) zero : generatedIdeal 0r add : ∀ {x y} → generatedIdeal x → generatedIdeal y → generatedIdeal (x + y) mul : ∀ {r x} → generatedIdeal x → generatedIdeal (r · x) squash : ∀ {x} → isProp (generatedIdeal x) genIdeal : IdealsIn R genIdeal = makeIdeal (λ r → generatedIdeal r , squash) add zero λ r → mul _/Im_ : CommRing ℓ _/Im_ = R / genIdeal quotientImageHom : CommRingHom R _/Im_ quotientImageHom = quotientHom R genIdeal instance _ = str _/Im_ zeroOnImage : (x : X) → quotientImageHom $cr (f x) ≡ 0r zeroOnImage x = zeroOnIdeal genIdeal _ (single x) module _ {ℓ' : Level} {S : CommRing ℓ'} (g : CommRingHom R S) (gfx=0 : ∀ (x : X) → g $cr (f x) ≡ CommRingStr.0r (snd S)) where open CommIdeal R open IsCommRingHom (snd g) open CommRingStr ⦃...⦄ instance _ = snd R _ = snd S _ = snd _/Im_ extendToIdeal : (r : ⟨ R ⟩) → r ∈ genIdeal → g $cr r ≡ 0r extendToIdeal .(f x) (single x) = gfx=0 x extendToIdeal .(0r) zero = pres0 extendToIdeal .(r + s) (add {r} {s} r∈I s∈I) = g $cr (r + s ) ≡⟨ pres+ r s ⟩ (g $cr r) + (g $cr s) ≡⟨ cong (λ a → a + (g $cr s)) (extendToIdeal r r∈I) ⟩ 0r + (g $cr s) ≡⟨ cong (λ a → 0r + a) (extendToIdeal s s∈I) ⟩ 0r + 0r ≡⟨ +IdL 0r ⟩ 0r ∎ extendToIdeal .(r · s) (mul {r} {s} s∈I) = (g $cr (r · s)) ≡⟨ pres· r s ⟩ (g $cr r) · (g $cr s) ≡⟨ cong (λ a → (g $cr r) · a) (extendToIdeal s s∈I) ⟩ (g $cr r) · 0r ≡⟨ 0RightAnnihilates (CommRing→Ring S) (g $cr r) ⟩ 0r ∎ extendToIdeal r (squash r∈I0 r∈I1 i) = is-set (g $cr r) 0r (extendToIdeal r r∈I0) (extendToIdeal r r∈I1) i inducedMap : ⟨ _/Im_ ⟩ → ⟨ S ⟩ inducedMap = SQ.elim (λ x → is-set) (fst g) λ { a b r → equalByDifference (CommRing→Ring S) _ _ ( (g $cr a - g $cr b) ≡⟨ cong (λ b → g $cr a + b) (sym (pres- b)) ⟩ (g $cr a + g $cr (- b)) ≡⟨ sym (pres+ a (- b)) ⟩ g $cr (a - b) ≡⟨ extendToIdeal _ r ⟩ (0r ∎) ) } open IsCommRingHom inducedMapPreservesRing : IsCommRingHom (str _/Im_) inducedMap (str S) pres0 inducedMapPreservesRing = inducedMap 0r ≡⟨ cong inducedMap (pres0 (snd quotientImageHom)) ⟩ inducedMap (quotientImageHom $cr 0r) ≡⟨⟩ g $cr 0r ≡⟨ pres0 (snd g) ⟩ 0r ∎ pres1 inducedMapPreservesRing = inducedMap 1r ≡⟨ cong inducedMap (pres1 (snd quotientImageHom)) ⟩ inducedMap (quotientImageHom $cr 1r) ≡⟨⟩ g $cr 1r ≡⟨ pres1 (snd g) ⟩ 1r ∎ pres+ inducedMapPreservesRing = SQ.elimProp2 (λ x y → is-set _ _ ) (pres+ (snd g)) pres· inducedMapPreservesRing = SQ.elimProp2 (λ x y → is-set _ _ ) (pres· (snd g)) pres- inducedMapPreservesRing = SQ.elimProp (λ x → is-set _ _ ) (pres- (snd g)) inducedHom : CommRingHom _/Im_ S inducedHom = inducedMap , inducedMapPreservesRing inducedMapUnique : (h : ⟨ _/Im_ ⟩ → ⟨ S ⟩) → fst g ≡ h ∘ (fst quotientImageHom) → inducedMap ≡ h inducedMapUnique _ = funExt ∘ SQ.elimProp (λ { x → is-set _ _ }) ∘ funExt⁻ inducedHomUnique : (h : CommRingHom (_/Im_) S) → (p : g ≡ (h ∘cr quotientImageHom)) → inducedHom ≡ h inducedHomUnique h p = Σ≡Prop (λ { x → isPropIsCommRingHom (str _/Im_) x (str S) }) (inducedMapUnique (fst h) (cong fst p))