{-# OPTIONS --cubical --safe --no-import-sorts #-} module Cubical.Algebra.Algebra.Base where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Equiv open import Cubical.Foundations.Equiv.HalfAdjoint open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Function open import Cubical.Foundations.SIP open import Cubical.Data.Sigma open import Cubical.Structures.Axioms open import Cubical.Structures.Auto open import Cubical.Structures.Macro open import Cubical.Algebra.Module open import Cubical.Algebra.Ring open import Cubical.Algebra.AbGroup open import Cubical.Algebra.Group open import Cubical.Algebra.Monoid open Iso private variable ℓ : Level record IsAlgebra (R : Ring {ℓ}) {A : Type ℓ} (0a 1a : A) (_+_ _·_ : A → A → A) (-_ : A → A) (_⋆_ : ⟨ R ⟩ → A → A) : Type ℓ where constructor isalgebra open RingStr (snd R) using (1r) renaming (_+_ to _+r_; _·_ to _·r_) field isLeftModule : IsLeftModule R 0a _+_ -_ _⋆_ ·-isMonoid : IsMonoid 1a _·_ dist : (x y z : A) → (x · (y + z) ≡ (x · y) + (x · z)) × ((x + y) · z ≡ (x · z) + (y · z)) ⋆-lassoc : (r : ⟨ R ⟩) (x y : A) → (r ⋆ x) · y ≡ r ⋆ (x · y) ⋆-rassoc : (r : ⟨ R ⟩) (x y : A) → r ⋆ (x · y) ≡ x · (r ⋆ y) open IsLeftModule isLeftModule public isRing : IsRing _ _ _ _ _ isRing = isring (IsLeftModule.+-isAbGroup isLeftModule) ·-isMonoid dist open IsRing isRing public hiding (_-_; +Assoc; +Lid; +Linv; +Rid; +Rinv; +Comm) record Algebra (R : Ring {ℓ}) : Type (ℓ-suc ℓ) where constructor algebra field Carrier : Type ℓ 0a : Carrier 1a : Carrier _+_ : Carrier → Carrier → Carrier _·_ : Carrier → Carrier → Carrier -_ : Carrier → Carrier _⋆_ : ⟨ R ⟩ → Carrier → Carrier isAlgebra : IsAlgebra R 0a 1a _+_ _·_ -_ _⋆_ open IsAlgebra isAlgebra public module commonExtractors {R : Ring {ℓ}} where ⟨_⟩a : Algebra R → Type ℓ ⟨_⟩a = Algebra.Carrier Algebra→Module : (A : Algebra R) → LeftModule R Algebra→Module (algebra A _ _ _ _ _ _ (isalgebra isLeftModule _ _ _ _)) = leftmodule A _ _ _ _ isLeftModule Algebra→Ring : (A : Algebra R) → Ring {ℓ} Algebra→Ring A = _ , ringstr _ _ _ _ _ (IsAlgebra.isRing (Algebra.isAlgebra A)) Algebra→AbGroup : (A : Algebra R) → AbGroup {ℓ} Algebra→AbGroup A = LeftModule→AbGroup (Algebra→Module A) Algebra→Monoid : (A : Algebra R) → Monoid {ℓ} Algebra→Monoid A = Ring→Monoid (Algebra→Ring A) isSetAlgebra : (A : Algebra R) → isSet ⟨ A ⟩a isSetAlgebra A = isSetAbGroup (Algebra→AbGroup A) open RingStr (snd R) using (1r; ·Ldist+) renaming (_+_ to _+r_; _·_ to _·s_) makeIsAlgebra : {A : Type ℓ} {0a 1a : A} {_+_ _·_ : A → A → A} { -_ : A → A} {_⋆_ : ⟨ R ⟩ → A → A} (isSet-A : isSet A) (+-assoc : (x y z : A) → x + (y + z) ≡ (x + y) + z) (+-rid : (x : A) → x + 0a ≡ x) (+-rinv : (x : A) → x + (- x) ≡ 0a) (+-comm : (x y : A) → x + y ≡ y + x) (·-assoc : (x y z : A) → x · (y · z) ≡ (x · y) · z) (·-rid : (x : A) → x · 1a ≡ x) (·-lid : (x : A) → 1a · x ≡ x) (·-rdist-+ : (x y z : A) → x · (y + z) ≡ (x · y) + (x · z)) (·-ldist-+ : (x y z : A) → (x + y) · z ≡ (x · z) + (y · z)) (⋆-assoc : (r s : ⟨ R ⟩) (x : A) → (r ·s s) ⋆ x ≡ r ⋆ (s ⋆ x)) (⋆-ldist : (r s : ⟨ R ⟩) (x : A) → (r +r s) ⋆ x ≡ (r ⋆ x) + (s ⋆ x)) (⋆-rdist : (r : ⟨ R ⟩) (x y : A) → r ⋆ (x + y) ≡ (r ⋆ x) + (r ⋆ y)) (⋆-lid : (x : A) → 1r ⋆ x ≡ x) (⋆-lassoc : (r : ⟨ R ⟩) (x y : A) → (r ⋆ x) · y ≡ r ⋆ (x · y)) (⋆-rassoc : (r : ⟨ R ⟩) (x y : A) → r ⋆ (x · y) ≡ x · (r ⋆ y)) → IsAlgebra R 0a 1a _+_ _·_ -_ _⋆_ makeIsAlgebra isSet-A +-assoc +-rid +-rinv +-comm ·-assoc ·-rid ·-lid ·-rdist-+ ·-ldist-+ ⋆-assoc ⋆-ldist ⋆-rdist ⋆-lid ⋆-lassoc ⋆-rassoc = isalgebra (makeIsLeftModule isSet-A +-assoc +-rid +-rinv +-comm ⋆-assoc ⋆-ldist ⋆-rdist ⋆-lid) (makeIsMonoid isSet-A ·-assoc ·-rid ·-lid) (λ x y z → ·-rdist-+ x y z , ·-ldist-+ x y z) ⋆-lassoc ⋆-rassoc open commonExtractors public record AlgebraEquiv {R : Ring {ℓ}} (A B : Algebra R) : Type ℓ where constructor algebraiso instance _ : Algebra R _ = A _ : Algebra R _ = B open Algebra {{...}} field e : ⟨ A ⟩a ≃ ⟨ B ⟩a isHom+ : (x y : ⟨ A ⟩a) → equivFun e (x + y) ≡ equivFun e x + equivFun e y isHom· : (x y : ⟨ A ⟩a) → equivFun e (x · y) ≡ equivFun e x · equivFun e y pres1 : equivFun e 1a ≡ 1a comm⋆ : (r : ⟨ R ⟩) (x : ⟨ A ⟩a) → equivFun e (r ⋆ x) ≡ r ⋆ equivFun e x record AlgebraHom {R : Ring {ℓ}} (A B : Algebra R) : Type ℓ where constructor algebrahom private instance _ : Algebra R _ = A _ : Algebra R _ = B open Algebra {{...}} field map : ⟨ A ⟩a → ⟨ B ⟩a isHom+ : (x y : ⟨ A ⟩a) → map (x + y) ≡ map x + map y isHom· : (x y : ⟨ A ⟩a) → map (x · y) ≡ map x · map y pres1 : map 1a ≡ 1a comm⋆ : (r : ⟨ R ⟩) (x : ⟨ A ⟩a) → map (r ⋆ x) ≡ r ⋆ map x pres0 : map 0a ≡ 0a pres0 = Theory.+Idempotency→0 (Algebra→Ring B) (map 0a) (map 0a ≡⟨ cong map (sym (+-rid _)) ⟩ map (0a + 0a) ≡⟨ isHom+ _ _ ⟩ map 0a + map 0a ∎) isHom- : (x : ⟨ A ⟩a) → map (- x) ≡ - map x isHom- x = Theory.implicitInverse (Algebra→Ring B) (map x) (map (- x)) (map (x) + map (- x) ≡⟨ sym (isHom+ _ _) ⟩ map (x - x) ≡⟨ cong map (+-rinv _) ⟩ map 0a ≡⟨ pres0 ⟩ 0a ∎) _$a_ : {R : Ring {ℓ}} {A B : Algebra R} → AlgebraHom A B → ⟨ A ⟩a → ⟨ B ⟩a f $a x = AlgebraHom.map f x _∘a_ : {R : Ring {ℓ}} {A B C : Algebra R} → AlgebraHom B C → AlgebraHom A B → AlgebraHom A C _∘a_ {ℓ} {R} {A} {B} {C} (algebrahom f isHom+f isHom·f pres1f comm⋆f) (algebrahom g isHom+g isHom·g pres1g comm⋆g) = let open Algebra ⦃...⦄ instance _ : Algebra R _ = A _ : Algebra R _ = B _ : Algebra R _ = C in algebrahom (f ∘ g) (λ x y → f (g (x + y)) ≡⟨ cong f (isHom+g x y) ⟩ f (g x + g y) ≡⟨ isHom+f _ _ ⟩ f (g x) + f (g y) ∎) (λ x y → f (g (x · y)) ≡⟨ cong f (isHom·g x y) ⟩ f (g x · g y) ≡⟨ isHom·f _ _ ⟩ f (g x) · f (g y) ∎) (f (g 1a) ≡⟨ cong f pres1g ⟩ f 1a ≡⟨ pres1f ⟩ 1a ∎) λ r x → f (g (r ⋆ x)) ≡⟨ cong f (comm⋆g _ _) ⟩ f (r ⋆ (g x)) ≡⟨ comm⋆f _ _ ⟩ r ⋆ (f (g x)) ∎ module AlgebraΣTheory (R : Ring {ℓ}) where RawAlgebraStructure = λ (A : Type ℓ) → (A → A → A) × (A → A → A) × A × (⟨ R ⟩ → A → A) RawAlgebraEquivStr = AutoEquivStr RawAlgebraStructure rawAlgebraUnivalentStr : UnivalentStr _ RawAlgebraEquivStr rawAlgebraUnivalentStr = autoUnivalentStr RawAlgebraStructure open RingStr (snd R) using (1r) renaming (_+_ to _+r_; _·_ to _·r_) open RingΣTheory open LeftModuleΣTheory R open MonoidΣTheory AlgebraAxioms : (A : Type ℓ) (str : RawAlgebraStructure A) → Type ℓ AlgebraAxioms A (_+_ , _·_ , 1a , _⋆_) = LeftModuleAxioms A (_+_ , _⋆_) × (MonoidAxioms A (1a , _·_)) × ((x y z : A) → (x · (y + z) ≡ (x · y) + (x · z)) × ((x + y) · z ≡ (x · z) + (y · z))) × ((r : ⟨ R ⟩) (x y : A) → (r ⋆ x) · y ≡ r ⋆ (x · y)) × ((r : ⟨ R ⟩) (x y : A) → r ⋆ (x · y) ≡ x · (r ⋆ y)) AlgebraStructure : Type ℓ → Type ℓ AlgebraStructure = AxiomsStructure RawAlgebraStructure AlgebraAxioms AlgebraΣ : Type (ℓ-suc ℓ) AlgebraΣ = TypeWithStr ℓ AlgebraStructure AlgebraEquivStr : StrEquiv AlgebraStructure ℓ AlgebraEquivStr = AxiomsEquivStr RawAlgebraEquivStr AlgebraAxioms isSetAlgebraΣ : (A : AlgebraΣ) → isSet _ isSetAlgebraΣ (A , _ , (isLeftModule , _ , _) ) = isSetLeftModuleΣ (A , _ , isLeftModule) isPropAlgebraAxioms : (A : Type ℓ) (s : RawAlgebraStructure A) → isProp (AlgebraAxioms A s) isPropAlgebraAxioms A (_+_ , _·_ , 1a , _⋆_) = isPropΣ (isPropLeftModuleAxioms A (_+_ , _⋆_)) (λ isLeftModule → isProp× (isPropMonoidAxioms A (1a , _·_)) (isProp× (isPropΠ3 (λ _ _ _ → isProp× ((isSetLeftModuleΣ (A , _ , isLeftModule)) _ _) ((isSetLeftModuleΣ (A , _ , isLeftModule)) _ _))) (isProp× (isPropΠ3 (λ _ _ _ → (isSetLeftModuleΣ (A , _ , isLeftModule)) _ _)) (isPropΠ3 (λ _ _ _ → (isSetLeftModuleΣ (A , _ , isLeftModule)) _ _))))) Algebra→AlgebraΣ : Algebra R → AlgebraΣ Algebra→AlgebraΣ (algebra A 0a 1a _+_ _·_ -_ _⋆_ (isalgebra isLeftModule isMonoid dist ⋆-lassoc ⋆-rassoc)) = A , (_+_ , _·_ , 1a , _⋆_) , (LeftModule→LeftModuleΣ (leftmodule A _ _ _ _ isLeftModule) .snd .snd) , Monoid→MonoidΣ (monoid A _ _ isMonoid) .snd .snd , dist , ⋆-lassoc , ⋆-rassoc AlgebraΣ→Algebra : AlgebraΣ → Algebra R AlgebraΣ→Algebra (A , (_+_ , _·_ , 1a , _⋆_) , isLeftModule , isMonoid , dist , lassoc , rassoc) = algebra A _ 1a _+_ _·_ _ _⋆_ (isalgebra (LeftModule.isLeftModule (LeftModuleΣ→LeftModule (A , (_ , isLeftModule)))) (MonoidStr.isMonoid (MonoidΣ→Monoid (A , (_ , isMonoid)) .snd)) dist lassoc rassoc) AlgebraIsoAlgebraΣ : Iso (Algebra R) AlgebraΣ AlgebraIsoAlgebraΣ = iso Algebra→AlgebraΣ AlgebraΣ→Algebra (λ _ → refl) (λ _ → refl) algebraUnivalentStr : UnivalentStr AlgebraStructure AlgebraEquivStr algebraUnivalentStr = axiomsUnivalentStr _ isPropAlgebraAxioms rawAlgebraUnivalentStr AlgebraΣPath : (M N : AlgebraΣ) → (M ≃[ AlgebraEquivStr ] N) ≃ (M ≡ N) AlgebraΣPath = SIP algebraUnivalentStr AlgebraEquivΣ : (M N : Algebra R) → Type ℓ AlgebraEquivΣ M N = Algebra→AlgebraΣ M ≃[ AlgebraEquivStr ] Algebra→AlgebraΣ N AlgebraEquivΣPath : {M N : Algebra R} → Iso (AlgebraEquiv M N) (AlgebraEquivΣ M N) fun AlgebraEquivΣPath (algebraiso e isHom+ isHom· pres1 comm⋆) = e , isHom+ , (isHom· , (pres1 , comm⋆)) inv AlgebraEquivΣPath (f , isHom+ , isHom· , pres1 , comm⋆) = algebraiso f isHom+ isHom· pres1 comm⋆ rightInv AlgebraEquivΣPath _ = refl leftInv AlgebraEquivΣPath _ = refl AlgebraPath : (M N : Algebra R) → (AlgebraEquiv M N) ≃ (M ≡ N) AlgebraPath M N = AlgebraEquiv M N ≃⟨ isoToEquiv AlgebraEquivΣPath ⟩ AlgebraEquivΣ M N ≃⟨ AlgebraΣPath _ _ ⟩ Algebra→AlgebraΣ M ≡ Algebra→AlgebraΣ N ≃⟨ isoToEquiv (invIso (congIso AlgebraIsoAlgebraΣ)) ⟩ M ≡ N ■ AlgebraPath : {R : Ring {ℓ}} (M N : Algebra R) → (AlgebraEquiv M N) ≃ (M ≡ N) AlgebraPath {ℓ} {R} = AlgebraΣTheory.AlgebraPath R module AlgebraTheory (R : Ring {ℓ}) (A : Algebra R) where open RingStr (snd R) renaming (_+_ to _+r_) open Algebra A 0-actsNullifying : (x : ⟨ A ⟩a) → 0r ⋆ x ≡ 0a 0-actsNullifying x = let idempotent-+ = 0r ⋆ x ≡⟨ cong (λ u → u ⋆ x) (sym (Theory.0Idempotent R)) ⟩ (0r +r 0r) ⋆ x ≡⟨ ⋆-ldist 0r 0r x ⟩ (0r ⋆ x) + (0r ⋆ x) ∎ in Theory.+Idempotency→0 (Algebra→Ring A) (0r ⋆ x) idempotent-+