{-# OPTIONS --safe #-} module Cubical.Algebra.CommAlgebra.FP.Base where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Equiv open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Function open import Cubical.Foundations.HLevels open import Cubical.Foundations.Structure open import Cubical.Foundations.Powerset open import Cubical.Data.FinData open import Cubical.Data.Nat open import Cubical.Data.Vec open import Cubical.Data.Sigma open import Cubical.HITs.PropositionalTruncation as PT open import Cubical.Algebra.CommRing open import Cubical.Algebra.CommAlgebra open import Cubical.Algebra.CommAlgebra.Polynomials open import Cubical.Algebra.CommAlgebra.Quotient open import Cubical.Algebra.CommAlgebra.Ideal open import Cubical.Algebra.CommAlgebra.FGIdeal open import Cubical.Algebra.CommAlgebra.Notation private variable ℓ ℓ' ℓ'' : Level module _ (R : CommRing ℓ) where Polynomials : (n : ℕ) → CommAlgebra R ℓ Polynomials n = R [ Fin n ]ₐ record FinitePresentation : Type ℓ where no-eta-equality field n : ℕ m : ℕ relations : FinVec ⟨ Polynomials n ⟩ₐ m opaque fgIdeal : IdealsIn R (Polynomials n) fgIdeal = ⟨ relations ⟩[ Polynomials n ] asFGIdeal : fgIdeal ≡ ⟨ relations ⟩[ Polynomials n ] asFGIdeal = refl opaque fpAlg : CommAlgebra R ℓ fpAlg = Polynomials n / fgIdeal open InstancesForCAlg fpAlg π : CommAlgebraHom (Polynomials n) fpAlg π = quotientHom (Polynomials n) fgIdeal generator : (i : Fin n) → ⟨ fpAlg ⟩ₐ generator = ⟨ π ⟩ₐ→ ∘ var fgIdealZero : (x : ⟨ Polynomials n ⟩ₐ) → x ∈ fst fgIdeal → π $ca x ≡ 0r fgIdealZero x x∈I = isZeroFromIdeal {A = Polynomials n} {I = fgIdeal} x x∈I computeGenerator : (i : Fin n) → π $ca (var i) ≡ generator i computeGenerator i = refl fpAlgAsQuotient : CommAlgebraEquiv fpAlg (Polynomials n / fgIdeal) fpAlgAsQuotient = idCAlgEquiv fpAlg FPsOf : (A : CommAlgebra R ℓ') → Type (ℓ-max ℓ ℓ') FPsOf A = Σ[ p ∈ FinitePresentation ] CommAlgebraEquiv (FinitePresentation.fpAlg p) A isFP : (A : CommAlgebra R ℓ') → Type (ℓ-max ℓ ℓ') isFP A = ∥ FPsOf A ∥₁ opaque isFPIsProp : {A : CommAlgebra R ℓ'} → isProp (isFP A) isFPIsProp = isPropPropTrunc FPCAlg : (ℓ' : Level) → Type _ FPCAlg ℓ' = Σ[ A ∈ CommAlgebra R ℓ' ] isFP A isFPByEquiv : (A : CommAlgebra R ℓ') (B : CommAlgebra R ℓ'') → CommAlgebraEquiv A B → isFP A → isFP B isFPByEquiv A B A≅B ∥fpA∥ = PT.rec isPropPropTrunc (λ (fp , fp≅A) → ∣ fp , compCommAlgebraEquiv fp≅A A≅B ∣₁) ∥fpA∥