module Cubical.Algebra.CommRing.Base where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Function using (_$_) open import Cubical.Foundations.Equiv open import Cubical.Foundations.HLevels open import Cubical.Foundations.SIP open import Cubical.Data.Sigma open import Cubical.Displayed.Base open import Cubical.Displayed.Auto open import Cubical.Displayed.Record open import Cubical.Displayed.Universe open import Cubical.Algebra.Ring.Base open import Cubical.Algebra.AbGroup open import Cubical.Reflection.RecordEquiv open Iso private variable ℓ ℓ' : Level record IsCommRing {R : Type ℓ} (0r 1r : R) (_+_ _·_ : R → R → R) (-_ : R → R) : Type ℓ where constructor iscommring field isRing : IsRing 0r 1r _+_ _·_ -_ ·Comm : (x y : R) → x · y ≡ y · x open IsRing isRing public unquoteDecl IsCommRingIsoΣ = declareRecordIsoΣ IsCommRingIsoΣ (quote IsCommRing) record CommRingStr (A : Type ℓ) : Type (ℓ-suc ℓ) where constructor commringstr field 0r : A 1r : A _+_ : A → A → A _·_ : A → A → A -_ : A → A isCommRing : IsCommRing 0r 1r _+_ _·_ -_ infix 8 -_ infixl 7 _·_ infixl 6 _+_ open IsCommRing isCommRing public CommRing : ∀ ℓ → Type (ℓ-suc ℓ) CommRing ℓ = TypeWithStr ℓ CommRingStr makeIsCommRing : {R : Type ℓ} {0r 1r : R} {_+_ _·_ : R → R → R} { -_ : R → R} (is-setR : isSet R) (+Assoc : (x y z : R) → x + (y + z) ≡ (x + y) + z) (+IdR : (x : R) → x + 0r ≡ x) (+InvR : (x : R) → x + (- x) ≡ 0r) (+Comm : (x y : R) → x + y ≡ y + x) (·Assoc : (x y z : R) → x · (y · z) ≡ (x · y) · z) (·IdR : (x : R) → x · 1r ≡ x) (·DistR+ : (x y z : R) → x · (y + z) ≡ (x · y) + (x · z)) (·Comm : (x y : R) → x · y ≡ y · x) → IsCommRing 0r 1r _+_ _·_ -_ makeIsCommRing {_+_ = _+_} is-setR +Assoc +IdR +InvR +Comm ·Assoc ·IdR ·DistR+ ·Comm = iscommring (makeIsRing is-setR +Assoc +IdR +InvR +Comm ·Assoc ·IdR (λ x → ·Comm _ _ ∙ ·IdR x) ·DistR+ (λ x y z → ·Comm _ _ ∙∙ ·DistR+ z x y ∙∙ λ i → (·Comm z x i) + (·Comm z y i))) ·Comm makeCommRing : {R : Type ℓ} (0r 1r : R) (_+_ _·_ : R → R → R) (-_ : R → R) (is-setR : isSet R) (+Assoc : (x y z : R) → x + (y + z) ≡ (x + y) + z) (+IdR : (x : R) → x + 0r ≡ x) (+InvR : (x : R) → x + (- x) ≡ 0r) (+Comm : (x y : R) → x + y ≡ y + x) (·Assoc : (x y z : R) → x · (y · z) ≡ (x · y) · z) (·IdR : (x : R) → x · 1r ≡ x) (·DistR+ : (x y z : R) → x · (y + z) ≡ (x · y) + (x · z)) (·Comm : (x y : R) → x · y ≡ y · x) → CommRing ℓ makeCommRing 0r 1r _+_ _·_ -_ is-setR +Assoc +IdR +InvR +Comm ·Assoc ·IdR ·DistR+ ·Comm = _ , commringstr _ _ _ _ _ (makeIsCommRing is-setR +Assoc +IdR +InvR +Comm ·Assoc ·IdR ·DistR+ ·Comm) CommRingStr→RingStr : {A : Type ℓ} → CommRingStr A → RingStr A CommRingStr→RingStr cringStr = record { 0r = _ ; 1r = _ ; _+_ = _ ; _·_ = _ ; -_ = _ ; isRing = IsCommRing.isRing (CommRingStr.isCommRing cringStr) } CommRing→Ring : CommRing ℓ → Ring ℓ fst (CommRing→Ring CRing) = fst CRing snd (CommRing→Ring CRing) = record { 0r = _ ; 1r = _ ; _+_ = _ ; _·_ = _ ; -_ = _ ; isRing = IsCommRing.isRing (CommRingStr.isCommRing (snd CRing)) } CommRing→AbGroup : CommRing ℓ → AbGroup ℓ CommRing→AbGroup R = Ring→AbGroup (CommRing→Ring R) Ring→CommRing : (R : Ring ℓ) → ((x y : (fst R)) → (RingStr._·_ (snd R) x y ≡ RingStr._·_ (snd R) y x)) → CommRing ℓ fst (Ring→CommRing R p) = fst R CommRingStr.0r (snd (Ring→CommRing R p)) = RingStr.0r (snd R) CommRingStr.1r (snd (Ring→CommRing R p)) = RingStr.1r (snd R) CommRingStr._+_ (snd (Ring→CommRing R p)) = RingStr._+_ (snd R) CommRingStr._·_ (snd (Ring→CommRing R p)) = RingStr._·_ (snd R) CommRingStr.- snd (Ring→CommRing R p) = RingStr.-_ (snd R) IsCommRing.isRing (CommRingStr.isCommRing (snd (Ring→CommRing R p))) = RingStr.isRing (snd R) IsCommRing.·Comm (CommRingStr.isCommRing (snd (Ring→CommRing R p))) = p record IsCommRingHom {A : Type ℓ} {B : Type ℓ'} (R : CommRingStr A) (f : A → B) (S : CommRingStr B) : Type (ℓ-max ℓ ℓ') where no-eta-equality private module R = CommRingStr R module S = CommRingStr S field pres0 : f R.0r ≡ S.0r pres1 : f R.1r ≡ S.1r pres+ : (x y : A) → f (x R.+ y) ≡ f x S.+ f y pres· : (x y : A) → f (x R.· y) ≡ f x S.· f y pres- : (x : A) → f (R.- x) ≡ S.- (f x) unquoteDecl IsCommRingHomIsoΣ = declareRecordIsoΣ IsCommRingHomIsoΣ (quote IsCommRingHom) CommRingHom : (R : CommRing ℓ) (S : CommRing ℓ') → Type (ℓ-max ℓ ℓ') CommRingHom R S = Σ[ f ∈ (⟨ R ⟩ → ⟨ S ⟩) ] IsCommRingHom (R .snd) f (S .snd) IsCommRingEquiv : {A : Type ℓ} {B : Type ℓ'} (R : CommRingStr A) (e : A ≃ B) (S : CommRingStr B) → Type (ℓ-max ℓ ℓ') IsCommRingEquiv R e S = IsCommRingHom R (e .fst) S CommRingEquiv : (R : CommRing ℓ) (S : CommRing ℓ') → Type (ℓ-max ℓ ℓ') CommRingEquiv R S = Σ[ e ∈ (R .fst ≃ S .fst) ] IsCommRingEquiv (R .snd) e (S .snd) CommRingEquiv→CommRingHom : {A : CommRing ℓ} {B : CommRing ℓ'} → CommRingEquiv A B → CommRingHom A B CommRingEquiv→CommRingHom (e , eIsHom) = e .fst , eIsHom isPropIsCommRing : {R : Type ℓ} (0r 1r : R) (_+_ _·_ : R → R → R) (-_ : R → R) → isProp (IsCommRing 0r 1r _+_ _·_ -_) isPropIsCommRing 0r 1r _+_ _·_ -_ = isOfHLevelRetractFromIso 1 IsCommRingIsoΣ (isPropΣ (isPropIsRing 0r 1r _+_ _·_ (-_)) (λ ring → isPropΠ2 (λ _ _ → is-set ring _ _))) where open IsRing isPropIsCommRingHom : {A : Type ℓ} {B : Type ℓ'} (R : CommRingStr A) (f : A → B) (S : CommRingStr B) → isProp (IsCommRingHom R f S) isPropIsCommRingHom R f S = isOfHLevelRetractFromIso 1 IsCommRingHomIsoΣ (isProp×4 (is-set _ _) (is-set _ _) (isPropΠ2 λ _ _ → is-set _ _) (isPropΠ2 λ _ _ → is-set _ _) (isPropΠ λ _ → is-set _ _)) where open CommRingStr S using (is-set) isSetCommRingHom : (R : CommRing ℓ) (S : CommRing ℓ') → isSet (CommRingHom R S) isSetCommRingHom R S = isSetΣSndProp (isSetΠ λ _ → is-set) (λ f → isPropIsCommRingHom (snd R) f (snd S)) where open CommRingStr (str S) using (is-set) isSetCommRingEquiv : (A : CommRing ℓ) (B : CommRing ℓ') → isSet (CommRingEquiv A B) isSetCommRingEquiv A B = isSetΣSndProp (isOfHLevel≃ 2 A.is-set B.is-set) (λ e → isPropIsCommRingHom (snd A) (fst e) (snd B)) where module A = CommRingStr (str A) module B = CommRingStr (str B) RingHom→CommRingHom : {R : CommRing ℓ} {S : CommRing ℓ'} → RingHom (CommRing→Ring R) (CommRing→Ring S) → CommRingHom R S RingHom→CommRingHom f .fst = f .fst RingHom→CommRingHom {R = R} {S = S} f .snd = copy where open IsCommRingHom copy : IsCommRingHom (R .snd) (f .fst) (S .snd) copy .pres0 = f .snd .IsRingHom.pres0 copy .pres1 = f .snd .IsRingHom.pres1 copy .pres+ = f .snd .IsRingHom.pres+ copy .pres· = f .snd .IsRingHom.pres· copy .pres- = f .snd .IsRingHom.pres- IsRingHom→IsCommRingHom : (R : CommRing ℓ) (S : CommRing ℓ') → (f : ⟨ R ⟩ → ⟨ S ⟩) → IsRingHom ((CommRing→Ring R) .snd) f ((CommRing→Ring S) .snd) → IsCommRingHom (R .snd) f (S .snd) IsRingHom→IsCommRingHom R S f p = RingHom→CommRingHom (f , p) .snd CommRingHom→RingHom : {R : CommRing ℓ} {S : CommRing ℓ'} → CommRingHom R S → RingHom (CommRing→Ring R) (CommRing→Ring S) CommRingHom→RingHom f .fst = f .fst CommRingHom→RingHom {R = R} {S = S} f .snd = copy where open IsRingHom copy : IsRingHom ((CommRing→Ring R) .snd) (f .fst) ((CommRing→Ring S) .snd) copy .pres0 = f .snd .IsCommRingHom.pres0 copy .pres1 = f .snd .IsCommRingHom.pres1 copy .pres+ = f .snd .IsCommRingHom.pres+ copy .pres· = f .snd .IsCommRingHom.pres· copy .pres- = f .snd .IsCommRingHom.pres- IsCommRingHom→IsRingHom : (R : CommRing ℓ) (S : CommRing ℓ') → (f : ⟨ R ⟩ → ⟨ S ⟩) → IsCommRingHom (R .snd) f (S .snd) → IsRingHom ((CommRing→Ring R) .snd) f ((CommRing→Ring S) .snd) IsCommRingHom→IsRingHom R S f p = CommRingHom→RingHom (f , p) .snd CommRingEquiv→RingEquiv : {A : CommRing ℓ} {B : CommRing ℓ'} → CommRingEquiv A B → RingEquiv (CommRing→Ring A) (CommRing→Ring B) CommRingEquiv→RingEquiv e .fst = e .fst CommRingEquiv→RingEquiv e .snd = IsCommRingHom→IsRingHom _ _ (e .fst .fst) (e .snd) module _ {R : CommRing ℓ} {S : CommRing ℓ'} {f : ⟨ R ⟩ → ⟨ S ⟩} where private module R = CommRingStr (R .snd) module S = CommRingStr (S .snd) module _ (p1 : f R.1r ≡ S.1r) (p+ : (x y : ⟨ R ⟩) → f (x R.+ y) ≡ f x S.+ f y) (p· : (x y : ⟨ R ⟩) → f (x R.· y) ≡ f x S.· f y) where makeIsCommRingHom : IsCommRingHom (R .snd) f (S .snd) makeIsCommRingHom = IsRingHom→IsCommRingHom _ _ _ (makeIsRingHom p1 p+ p·) _$cr_ : {R : CommRing ℓ} {S : CommRing ℓ'} → (φ : CommRingHom R S) → (x : ⟨ R ⟩) → ⟨ S ⟩ φ $cr x = φ .fst x opaque CommRingHom≡ : {R : CommRing ℓ} {S : CommRing ℓ'} {φ ψ : CommRingHom R S} → fst φ ≡ fst ψ → φ ≡ ψ CommRingHom≡ = Σ≡Prop λ f → isPropIsCommRingHom _ f _ CommRingHomPathP : (R : CommRing ℓ) (S T : CommRing ℓ') (p : S ≡ T) (φ : CommRingHom R S) (ψ : CommRingHom R T) → PathP (λ i → R .fst → p i .fst) (φ .fst) (ψ .fst) → PathP (λ i → CommRingHom R (p i)) φ ψ CommRingHomPathP R S T p φ ψ q = ΣPathP (q , isProp→PathP (λ _ → isPropIsCommRingHom _ _ _) _ _)