{-# OPTIONS --safe #-} module Cubical.Algebra.CommAlgebra.Univalence where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Structure using (⟨_⟩) open import Cubical.Foundations.HLevels open import Cubical.Foundations.Univalence open import Cubical.Foundations.Transport open import Cubical.Foundations.Path open import Cubical.Data.Sigma open import Cubical.Algebra.CommRing open import Cubical.Algebra.CommRing.Univalence open import Cubical.Algebra.CommAlgebra.Base private variable ℓ ℓ' ℓ'' : Level module _ {R : CommRing ℓ} where CommAlgebraPath' : (A B : CommAlgebra R ℓ') → (Σ[ f ∈ CommRingEquiv (A .fst) (B .fst) ] (f .fst .fst , f .snd) ∘cr A .snd ≡ B .snd) ≃ (A ≡ B) CommAlgebraPath' A B = (Σ-cong-equiv (CommRingPath _ _) (λ e → compPathlEquiv (computeSubst e))) ∙ₑ ΣPathTransport≃PathΣ A B where computeSubst : (e : CommRingEquiv (fst A) (fst B)) → subst (CommRingHom R) (uaCommRing e) (A .snd) ≡ (CommRingEquiv→CommRingHom e) ∘cr A .snd computeSubst e = CommRingHom≡ $ (subst (CommRingHom R) (uaCommRing e) (A .snd)) .fst ≡⟨ sym (substCommSlice (CommRingHom R) (λ X → ⟨ R ⟩ → ⟨ X ⟩) (λ _ → fst) (uaCommRing e) (A .snd)) ⟩ subst (λ X → ⟨ R ⟩ → ⟨ X ⟩) (uaCommRing e) (A .snd .fst) ≡⟨ fromPathP (funTypeTransp (λ _ → ⟨ R ⟩) ⟨_⟩ (uaCommRing e) (A .snd .fst)) ⟩ subst ⟨_⟩ (uaCommRing e) ∘ A .snd .fst ∘ subst (λ _ → ⟨ R ⟩) (sym (uaCommRing e)) ≡⟨ cong ((subst ⟨_⟩ (uaCommRing e) ∘ A .snd .fst) ∘_) (funExt (λ _ → transportRefl _)) ⟩ (subst ⟨_⟩ (uaCommRing e) ∘ (A .snd .fst)) ≡⟨ funExt (λ _ → uaβ (e .fst) _) ⟩ (CommRingEquiv→CommRingHom e ∘cr A .snd) .fst ∎ CommRingEquiv→CommAlgebraEquiv : {A : CommAlgebra R ℓ'} {B : CommAlgebra R ℓ''} → (e : CommRingEquiv (A .fst) (B .fst)) → e .fst .fst ∘ A .snd .fst ≡ B .snd .fst → CommAlgebraEquiv A B CommRingEquiv→CommAlgebraEquiv {A = A} {B = B} e p = e .fst , isHom where opaque isHom : IsCommAlgebraHom A B (e .fst .fst) isHom = record { isCommRingHom = e .snd ; commutes = CommRingHom≡ p } CommAlgebraEquiv→CREquivΣ : {A : CommAlgebra R ℓ'} {B : CommAlgebra R ℓ''} → (CommAlgebraEquiv A B) ≃ (Σ[ f ∈ CommRingEquiv (A .fst) (B .fst) ] (f .fst .fst , f .snd) ∘cr A .snd ≡ B .snd) CommAlgebraEquiv→CREquivΣ = isoToEquiv $ iso to from (λ _ → Σ≡Prop (λ _ → isSetCommRingHom _ _ _ _) (Σ≡Prop (λ f → isPropIsCommRingHom _ (f .fst) _) refl)) (λ _ → Σ≡Prop (isPropIsCommAlgebraHom _ _ ∘ fst) refl) where to : CommAlgebraEquiv _ _ → _ to e = (e .fst , IsCommAlgebraHom.isCommRingHom (e .snd)) , IsCommAlgebraHom.commutes (e .snd) from : _ → CommAlgebraEquiv _ _ from (e , commutes) = CommRingEquiv→CommAlgebraEquiv e (cong fst commutes) CommAlgebraPath : (A B : CommAlgebra R ℓ') → CommAlgebraEquiv A B ≃ (A ≡ B) CommAlgebraPath A B = CommAlgebraEquiv A B ≃⟨ CommAlgebraEquiv→CREquivΣ ⟩ Σ[ f ∈ CommRingEquiv (A .fst) (B .fst) ] (f .fst .fst , f .snd) ∘cr A .snd ≡ B .snd ≃⟨ CommAlgebraPath' A B ⟩ A ≡ B ■ uaCommAlgebra : {A B : CommAlgebra R ℓ'} → CommAlgebraEquiv A B → A ≡ B uaCommAlgebra {A = A} {B = B} = equivFun $ CommAlgebraPath A B isGroupoidCommAlgebra : isGroupoid (CommAlgebra R ℓ') isGroupoidCommAlgebra A B = isOfHLevelRespectEquiv 2 (CommAlgebraPath' _ _) (isSetΣSndProp (isSetCommRingEquiv _ _) λ _ → isSetCommRingHom _ _ _ _)