diff --git a/Cubical.Algebra.CommAlgebra.Localisation.html b/Cubical.Algebra.CommAlgebra.Localisation.html index a853eba55f..39ac83a7d5 100644 --- a/Cubical.Algebra.CommAlgebra.Localisation.html +++ b/Cubical.Algebra.CommAlgebra.Localisation.html @@ -256,7 +256,7 @@ open InvertingElementsBase open CommRingStr (snd R) hiding (·IdR) open isMultClosedSubset - open DoubleLoc R f g hiding (R[1/fg]≡R[1/f][1/g]) + open DoubleLoc R f g hiding (R[1/fg]≡R[1/f][1/g]) open CommAlgChar R open AlgLoc R ([_ⁿ|n≥0] R (f · g)) (powersFormMultClosedSubset R (f · g)) renaming (S⁻¹RAlgCharEquiv to R[1/fg]AlgCharEquiv) @@ -276,10 +276,10 @@ R[1/f][1/g]AsCommRing = R[1/_]AsCommRing (R[1/_]AsCommRing R f) [ g , 1r , powersFormMultClosedSubset R f .containsOne ] - R[1/f][1/g]AsCommAlgebra = toCommAlg (R[1/f][1/g]AsCommRing , /1/1AsCommRingHom) + R[1/f][1/g]AsCommAlgebra = toCommAlg (R[1/f][1/g]AsCommRing , /1/1AsCommRingHom) R[1/fg]≡R[1/f][1/g] : R[1/fg]AsCommAlgebra R[1/f][1/g]AsCommAlgebra - R[1/fg]≡R[1/f][1/g] = uaCommAlgebra (R[1/fg]AlgCharEquiv _ _ pathtoR[1/fg]) + R[1/fg]≡R[1/f][1/g] = uaCommAlgebra (R[1/fg]AlgCharEquiv _ _ pathtoR[1/fg]) doubleLocCancel : g ∈ᵢ f R[1/f][1/g]AsCommAlgebra R[1/g]AsCommAlgebra doubleLocCancel g∈√⟨f⟩ = sym R[1/fg]≡R[1/f][1/g] isContrR[1/fg]≡R[1/g] toUnit1 toUnit2 .fst @@ -298,7 +298,7 @@ toUnit1 : s s [_ⁿ|n≥0] R (f · g) s 1a R[1/g]ˣ toUnit1 s s∈[fgⁿ|n≥0] = subst-∈ R[1/g]ˣ (sym (·IdR (s /1ᵍ))) - (RadicalLemma.toUnit R g (f · g) (radHelper _ _ g∈√⟨f⟩) s s∈[fgⁿ|n≥0]) + (RadicalLemma.toUnit R g (f · g) (radHelper _ _ g∈√⟨f⟩) s s∈[fgⁿ|n≥0]) where radHelper : x y x ∈ᵢ y x ∈ᵢ y · x radHelper x y = PT.rec (( y · x ) .fst x .snd) (uncurry helper1) @@ -313,7 +313,7 @@ toUnit2 : s s [_ⁿ|n≥0] R g s 1a R[1/fg]ˣ toUnit2 s s∈[gⁿ|n≥0] = subst-∈ R[1/fg]ˣ (sym (·IdR (s /1ᶠᵍ))) - (RadicalLemma.toUnit R (f · g) g radHelper s s∈[gⁿ|n≥0]) + (RadicalLemma.toUnit R (f · g) g radHelper s s∈[gⁿ|n≥0]) where radHelper : (f · g) ∈ᵢ g radHelper = ·Closed (snd ( g )) f (∈→∈√ _ _ (indInIdeal R _ zero)) diff --git a/Cubical.Algebra.CommRing.Localisation.InvertingElements.html b/Cubical.Algebra.CommRing.Localisation.InvertingElements.html index 05ede97da3..7fd5f70203 100644 --- a/Cubical.Algebra.CommRing.Localisation.InvertingElements.html +++ b/Cubical.Algebra.CommRing.Localisation.InvertingElements.html @@ -176,655 +176,649 @@ 1r · s · g ^ l - invElPropElimN : (n : ) (f : FinVec R (suc n)) (P : ((i : Fin (suc n)) R[1/ (f i) ]) Type ℓ') - (∀ x isProp (P x)) - (∀ (r : FinVec R (suc n)) (m : ) P i [ r i , (f i ^ m) , PT.∣ m , refl ∣₁ ])) - ------------------------------------------------------------------------------------- - x P x - invElPropElimN zero f P isPropP baseCase x = - subst P (funExt { zero refl })) (invElPropElim {P = P'} _ isPropP _) - r n subst P (funExt { zero refl })) (baseCase {zero r}) n)) (x zero)) - where - P' : R[1/ (f zero) ] Type _ - P' x = P {zero x}) - - invElPropElimN (suc n) f P isPropP baseCase x = - subst P (funExt { zero refl ; (suc i) refl })) - (invElPropElimN n (f suc) P' _ isPropP _) baseCase' (x suc)) - where - P' : ((i : Fin (suc n)) R[1/ (f (suc i)) ]) Type _ - P' y = P { zero x zero ; (suc i) y i }) - - baseCase' : (rₛ : FinVec R (suc n)) (m : ) - P' i [ rₛ i , f (suc i) ^ m , m , refl ∣₁ ]) - baseCase' rₛ m = - subst P (funExt { zero refl ; (suc i) refl })) - (invElPropElim {P = P''} _ isPropP _) baseCase'' (x zero)) - where - P'' : R[1/ (f zero) ] Type _ - P'' y = P { zero y ; (suc i) [ rₛ i , f (suc i) ^ m , m , refl ∣₁ ]}) - - baseCase'' : (r₀ : R) (k : ) P'' [ r₀ , f zero ^ k , k , refl ∣₁ ] - baseCase'' r₀ k = subst P (funExt { zero vecPaths zero ; (suc i) vecPaths (suc i) })) - (baseCase newEnumVec l) - where - l = max m k - - newEnumVec : FinVec R (suc (suc n)) - newEnumVec zero = r₀ · (f zero) ^ (l k) - newEnumVec (suc i) = rₛ i · (f (suc i)) ^ (l m) - - oldBaseVec : (i : Fin (suc (suc n))) R[1/ (f i) ] - oldBaseVec = λ { zero [ r₀ , f zero ^ k , k , refl ∣₁ ] - ; (suc i) [ rₛ i , f (suc i) ^ m , m , _ f (suc i) ^ m) ∣₁ ] } - - newBaseVec : (i : Fin (suc (suc n))) R[1/ (f i) ] - newBaseVec zero = [ r₀ · (f zero) ^ (l k) , (f zero) ^ l , l , refl ∣₁ ] - newBaseVec (suc i) = [ rₛ i · (f (suc i)) ^ (l m) , (f (suc i)) ^ l , l , refl ∣₁ ] - - vecPaths : i newBaseVec i oldBaseVec i - vecPaths zero = eq/ _ _ ((1r , 0 , refl ∣₁) , path) - where - path : 1r · (r₀ · f zero ^ (l k)) · f zero ^ k 1r · r₀ · f zero ^ l - path = 1r · (r₀ · f zero ^ (l k)) · f zero ^ k - ≡⟨ solve! R' - r₀ · (f zero ^ (l k) · f zero ^ k) - ≡⟨ cong (r₀ ·_) (·-of-^-is-^-of-+ _ _ _) - r₀ · f zero ^ (l k +ℕ k) - ≡⟨ cong k' r₀ · f zero ^ k') (≤-∸-+-cancel right-≤-max) - r₀ · f zero ^ l - ≡⟨ solve! R' - 1r · r₀ · f zero ^ l - - vecPaths (suc i) = eq/ _ _ ((1r , 0 , refl ∣₁) , path) - where - path : 1r · (rₛ i · f (suc i) ^ (l m)) · f (suc i) ^ m 1r · rₛ i · f (suc i) ^ l - path = 1r · (rₛ i · f (suc i) ^ (l m)) · f (suc i) ^ m - ≡⟨ solve! R' - rₛ i · (f (suc i) ^ (l m) · f (suc i) ^ m) - ≡⟨ cong (rₛ i ·_) (·-of-^-is-^-of-+ _ _ _) - rₛ i · f (suc i) ^ (l m +ℕ m) - ≡⟨ cong m' rₛ i · f (suc i) ^ m') (≤-∸-+-cancel left-≤-max) - rₛ i · f (suc i) ^ l - ≡⟨ solve! R' - 1r · rₛ i · f (suc i) ^ l - - - - -- For predicates over the set of powers - powersPropElim : {f : R} {P : R Type ℓ'} - (∀ x isProp (P x)) - (∀ n P (f ^ n)) - ------------------------------ - s s [ f ⁿ|n≥0] P s - powersPropElim {f = f} {P = P} PisProp base s = - PT.rec (PisProp s) λ (n , p) subst P (sym p) (base n) - - - - -- A more specialized universal property. - -- (Just ask f to become invertible, not all its powers.) - module UniversalProp (f : R) where - open S⁻¹RUniversalProp R' [ f ⁿ|n≥0] (powersFormMultClosedSubset f) public - open CommRingHomTheory - - invElemUniversalProp : (A : CommRing ) (φ : CommRingHom R' A) - (φ .fst f A ˣ) - ∃![ χ CommRingHom R[1/ f ]AsCommRing A ] - (fst χ) (fst /1AsCommRingHom) (fst φ) - invElemUniversalProp A φ φf∈Aˣ = - S⁻¹RHasUniversalProp A φ - (powersPropElim _ ∈-isProp _ _) - n subst-∈ (A ˣ) (sym (pres^ φ f n)) (Exponentiation.^-presUnit A _ n φf∈Aˣ))) - - --- "functorial action" of localizing away from an element -module _ {A B : CommRing } (φ : CommRingHom A B) (f : fst A) where - open CommRingStr (snd B) - private - module A = InvertingElementsBase A - module B = InvertingElementsBase B - module AU = A.UniversalProp f - module BU = B.UniversalProp (φ $r f) - - φ/1 = BU./1AsCommRingHom ∘cr φ - - uniqInvElemHom : ∃![ χ CommRingHom A.R[1/ f ]AsCommRing B.R[1/ φ $r f ]AsCommRing ] - (fst χ) (fst AU./1AsCommRingHom) (fst φ/1) - uniqInvElemHom = AU.invElemUniversalProp _ φ/1 (BU.S/1⊆S⁻¹Rˣ _ 1 , sym (·IdR _) ∣₁) - - - -module _ (R : CommRing ) (f : fst R) where - open CommRingTheory R - open RingTheory (CommRing→Ring R) - open Units R - open Exponentiation R - open InvertingElementsBase R - open isMultClosedSubset (powersFormMultClosedSubset f) - open S⁻¹RUniversalProp R [ f ⁿ|n≥0] (powersFormMultClosedSubset f) - open CommRingStr (snd R) - open PathToS⁻¹R - - invertingUnitsPath : f R ˣ R[1/ f ]AsCommRing R - invertingUnitsPath f∈Rˣ = S⁻¹RChar _ _ _ _ (idCommRingHom R) (char f∈Rˣ) - where - char : f R ˣ PathToS⁻¹R _ _ (powersFormMultClosedSubset f) - _ (idCommRingHom R) - φS⊆Aˣ (char f∈Rˣ) = powersPropElim (∈-isProp _) - λ n ^-presUnit _ n f∈Rˣ - kerφ⊆annS (char _) _ r≡0 = (1r , containsOne) , ·IdL _ r≡0 ∣₁ - surχ (char _) r = (r , 1r , containsOne) - , cong (r ·_) (transportRefl _) ·IdR _ ∣₁ - - -module RadicalLemma (R' : CommRing ) (f g : (fst R')) where - open IsRingHom - open isMultClosedSubset - open CommRingTheory R' - open RingTheory (CommRing→Ring R') - open CommIdeal R' hiding (subst-∈) renaming (_∈_ to _∈ᵢ_) - open RadicalIdeal R' - open Exponentiation R' - open InvertingElementsBase R' - - open S⁻¹RUniversalProp R' [ f ⁿ|n≥0] (powersFormMultClosedSubset f) - hiding (S⁻¹RHasUniversalProp) - open S⁻¹RUniversalProp R' [ g ⁿ|n≥0] (powersFormMultClosedSubset g) - hiding (_/1 ; /1AsCommRingHom) - open CommRingStr (R' .snd) - - private - R = R' .fst - ⟨_⟩ : R CommIdeal - f = replicateFinVec 1 f ⟩[ R' ] - - unitHelper : f ∈ᵢ g (g /1) R[1/ f ]AsCommRing ˣ - unitHelper = PT.rec isPropGoal (uncurry ℕhelper) - where - isPropGoal = Units.inverseUniqueness _ (g /1) - - ℕhelper : (n : ) f ^ n ∈ᵢ g (g /1) R[1/ f ]AsCommRing ˣ - ℕhelper n = PT.rec isPropGoal -- fⁿ≡αg → g⁻¹≡α/fⁿ - λ (α , p) [ (α zero) , (f ^ n) , n , refl ∣₁ ] - , eq/ _ _ ((1r , powersFormMultClosedSubset f .containsOne) - , (solve! R') sym p (solve! R')) - - toUnit : f ∈ᵢ g - s s [ g ⁿ|n≥0] (s /1) R[1/ f ]AsCommRing ˣ - toUnit f∈√⟨g⟩ = powersPropElim x Units.inverseUniqueness _ (x /1)) - λ n subst-∈ (R[1/ f ]AsCommRing ˣ) (sym (^-respects-/1 n)) - (Exponentiation.^-presUnit _ _ n (unitHelper f∈√⟨g⟩)) - - -module DoubleLoc (R' : CommRing ) (f g : fst R') where - open isMultClosedSubset - open CommRingStr (snd R') - open CommRingTheory R' - open Exponentiation R' - open InvertingElementsBase - open RingTheory (CommRing→Ring R') - open CommRingStr (snd (R[1/_]AsCommRing R' f)) renaming ( _·_ to _·ᶠ_ ; 1r to 1ᶠ - ; _+_ to _+ᶠ_ ; 0r to 0ᶠ - ; ·IdL to ·ᶠ-lid ; ·IdR to ·ᶠ-rid - ; ·Assoc to ·ᶠ-assoc ; ·Comm to ·ᶠ-comm) - open IsRingHom - - private - R = fst R' - R[1/f] = R[1/_] R' f - R[1/f]AsCommRing = R[1/_]AsCommRing R' f - R[1/fg] = R[1/_] R' (f · g) - R[1/fg]AsCommRing = R[1/_]AsCommRing R' (f · g) - R[1/f][1/g] = R[1/_] (R[1/_]AsCommRing R' f) - [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] - R[1/f][1/g]AsCommRing = R[1/_]AsCommRing (R[1/_]AsCommRing R' f) - [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] - R[1/f][1/g]ˣ = R[1/f][1/g]AsCommRing ˣ - - - _/1/1 : R R[1/f][1/g] - r /1/1 = [ [ r , 1r , PT.∣ 0 , refl ∣₁ ] , 1ᶠ , PT.∣ 0 , refl ∣₁ ] - - /1/1AsCommRingHom : CommRingHom R' R[1/f][1/g]AsCommRing - fst /1/1AsCommRingHom = _/1/1 - snd /1/1AsCommRingHom = makeIsRingHom refl lem+ lem· - where - lem+ : _ - lem+ r r' = - cong [_] - (≡-× - (cong [_] - (≡-× - (cong₂ _+_ - (sym (·IdR _) i (·IdR r (~ i)) · (·IdR 1r (~ i)))) - (sym (·IdR _) i (·IdR r' (~ i)) · (·IdR 1r (~ i))))) - (Σ≡Prop _ isPropPropTrunc) - (sym (·IdL _) i (·IdL 1r (~ i)) · (·IdL 1r (~ i))))))) - (Σ≡Prop _ isPropPropTrunc) (sym (·ᶠ-lid 1ᶠ)))) - - lem· : _ - lem· r r' = - cong [_] - (≡-× - (cong [_] (≡-× refl (Σ≡Prop _ isPropPropTrunc) (sym (·IdL _))))) - (Σ≡Prop _ isPropPropTrunc) (sym (·ᶠ-lid 1ᶠ)))) - - -- this will give us a map R[1/fg] → R[1/f][1/g] by the universal property of localisation - fⁿgⁿ/1/1∈R[1/f][1/g]ˣ : (s : R) s ([_ⁿ|n≥0] R' (f · g)) s /1/1 R[1/f][1/g]ˣ - fⁿgⁿ/1/1∈R[1/f][1/g]ˣ = powersPropElim R' s R[1/f][1/g]ˣ (s /1/1) .snd) ℕcase - where - ℕcase : (n : ) ((f · g) ^ n) /1/1 R[1/f][1/g]ˣ - ℕcase n = [ [ 1r , (f ^ n) , PT.∣ n , refl ∣₁ ] - , [ (g ^ n) , 1r , PT.∣ 0 , refl ∣₁ ] --denominator - , PT.∣ n , ^-respects-/1 _ n ∣₁ ] - , eq/ _ _ ((1ᶠ , powersFormMultClosedSubset _ _ .containsOne) - , eq/ _ _ ((1r , powersFormMultClosedSubset _ _ .containsOne) , path)) - where - path : 1r · (1r · ((f · g) ^ n · 1r) · 1r) · (1r · 1r · (1r · 1r)) - 1r · (1r · 1r · (1r · g ^ n)) · (1r · (1r · f ^ n) · 1r) - path = 1r · (1r · ((f · g) ^ n · 1r) · 1r) · (1r · 1r · (1r · 1r)) ≡⟨ solve! R' - (f · g) ^ n ≡⟨ ^-ldist-· _ _ _ - f ^ n · g ^ n ≡⟨ solve! R' - 1r · (1r · 1r · (1r · g ^ n)) · (1r · (1r · f ^ n) · 1r) - - - open PathToS⁻¹R - pathtoR[1/fg] : PathToS⁻¹R R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) - R[1/f][1/g]AsCommRing /1/1AsCommRingHom - φS⊆Aˣ pathtoR[1/fg] = fⁿgⁿ/1/1∈R[1/f][1/g]ˣ - - kerφ⊆annS pathtoR[1/fg] r p = toGoal helperR[1/f] - where - open RingTheory (CommRing→Ring R[1/f]AsCommRing) renaming ( 0RightAnnihilates to 0ᶠRightAnnihilates - ; 0LeftAnnihilates to 0ᶠ-leftNullifies) - open Exponentiation R[1/f]AsCommRing renaming (_^_ to _^ᶠ_) - hiding (·-of-^-is-^-of-+ ; ^-ldist-·) - - S[f] = Loc.S R' ([_ⁿ|n≥0] R' f) (powersFormMultClosedSubset R' f) - S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) - g/1 : R[1/_] R' f - g/1 = [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] - S[g/1] = Loc.S R[1/f]AsCommRing - ([_ⁿ|n≥0] R[1/f]AsCommRing g/1) - (powersFormMultClosedSubset R[1/f]AsCommRing g/1) - r/1 : R[1/_] R' f - r/1 = [ r , 1r , powersFormMultClosedSubset R' f .containsOne ] - - -- this is the crucial step, modulo truncation we can take p to be generated - -- by the quotienting relation of localisation. Note that we wouldn't be able - -- to prove our goal if kerφ⊆annS was formulated with a Σ instead of a ∃ - ∥r/1,1/1≈0/1,1/1∥ : ∃[ u S[g/1] ] fst u ·ᶠ r/1 ·ᶠ 1ᶠ fst u ·ᶠ 0ᶠ ·ᶠ 1ᶠ - ∥r/1,1/1≈0/1,1/1∥ = Iso.fun (SQ.isEquivRel→TruncIso (Loc.locIsEquivRel _ _ _) _ _) p - - helperR[1/f] : ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ - helperR[1/f] = PT.rec isPropPropTrunc - (uncurry (uncurry (powersPropElim R[1/f]AsCommRing - _ isPropΠ _ isPropPropTrunc)) baseCase))) - ∥r/1,1/1≈0/1,1/1∥ - where - baseCase : n g/1 ^ᶠ n ·ᶠ r/1 ·ᶠ 1ᶠ g/1 ^ᶠ n ·ᶠ 0ᶠ ·ᶠ 1ᶠ - ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ - baseCase n q = PT.∣ n , path ∣₁ - where - path : [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ - path = [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] - - ≡⟨ cong [_] (≡-× refl (Σ≡Prop _ isPropPropTrunc) (sym (·IdR _)))) - - [ g ^ n , 1r , PT.∣ 0 , refl ∣₁ ] ·ᶠ r/1 - - ≡⟨ cong (_·ᶠ r/1) (^-respects-/1 _ n) - - g/1 ^ᶠ n ·ᶠ r/1 - - ≡⟨ sym (·ᶠ-rid _) - - g/1 ^ᶠ n ·ᶠ r/1 ·ᶠ 1ᶠ - - ≡⟨ q - - g/1 ^ᶠ n ·ᶠ 0ᶠ ·ᶠ 1ᶠ - - ≡⟨ cong (_·ᶠ 1ᶠ) (0ᶠRightAnnihilates _) 0ᶠ-leftNullifies 1ᶠ - - 0ᶠ - - - toGoal : ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ - ∃[ u S[fg] ] fst u · r 0r - toGoal = PT.rec isPropPropTrunc Σhelper - where - Σhelper : Σ[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ - ∃[ u S[fg] ] fst u · r 0r - Σhelper (n , q) = PT.map Σhelper2 helperR - where - -- now, repeat the above strategy with q - ∥gⁿr≈0∥ : ∃[ u S[f] ] fst u · (g ^ n · r) · 1r fst u · 0r · 1r - ∥gⁿr≈0∥ = Iso.fun (SQ.isEquivRel→TruncIso (Loc.locIsEquivRel _ _ _) _ _) q + invElPropElimN : (n : ) (f : FinVec R n) (P : ((i : Fin n) R[1/ (f i) ]) Type ℓ') + (∀ x isProp (P x)) + (∀ (r : FinVec R n) (m : ) P i [ r i , (f i ^ m) , PT.∣ m , refl ∣₁ ])) + ------------------------------------------------------------------------------------- + x P x + invElPropElimN zero f P isPropP baseCase x = + subst P (funExt ())) (baseCase ()) zero) + + invElPropElimN (suc n) f P isPropP baseCase x = + subst P (funExt { zero refl ; (suc i) refl })) + (invElPropElimN n (f suc) P' _ isPropP _) baseCase' (x suc)) + where + P' : ((i : Fin n) R[1/ (f (suc i)) ]) Type _ + P' y = P { zero x zero ; (suc i) y i }) + + baseCase' : (rₛ : FinVec R n) (m : ) + P' i [ rₛ i , f (suc i) ^ m , m , refl ∣₁ ]) + baseCase' rₛ m = + subst P (funExt { zero refl ; (suc i) refl })) + (invElPropElim {P = P''} _ isPropP _) baseCase'' (x zero)) + where + P'' : R[1/ (f zero) ] Type _ + P'' y = P { zero y ; (suc i) [ rₛ i , f (suc i) ^ m , m , refl ∣₁ ]}) + + baseCase'' : (r₀ : R) (k : ) P'' [ r₀ , f zero ^ k , k , refl ∣₁ ] + baseCase'' r₀ k = subst P (funExt { zero vecPaths zero ; (suc i) vecPaths (suc i) })) + (baseCase newEnumVec l) + where + l = max m k + + newEnumVec : FinVec R (suc n) + newEnumVec zero = r₀ · (f zero) ^ (l k) + newEnumVec (suc i) = rₛ i · (f (suc i)) ^ (l m) + + oldBaseVec : (i : Fin (suc n)) R[1/ (f i) ] + oldBaseVec = λ { zero [ r₀ , f zero ^ k , k , refl ∣₁ ] + ; (suc i) [ rₛ i , f (suc i) ^ m , m , _ f (suc i) ^ m) ∣₁ ] } + + newBaseVec : (i : Fin (suc n)) R[1/ (f i) ] + newBaseVec zero = [ r₀ · (f zero) ^ (l k) , (f zero) ^ l , l , refl ∣₁ ] + newBaseVec (suc i) = [ rₛ i · (f (suc i)) ^ (l m) , (f (suc i)) ^ l , l , refl ∣₁ ] + + vecPaths : i newBaseVec i oldBaseVec i + vecPaths zero = eq/ _ _ ((1r , 0 , refl ∣₁) , path) + where + path : 1r · (r₀ · f zero ^ (l k)) · f zero ^ k 1r · r₀ · f zero ^ l + path = 1r · (r₀ · f zero ^ (l k)) · f zero ^ k + ≡⟨ solve! R' + r₀ · (f zero ^ (l k) · f zero ^ k) + ≡⟨ cong (r₀ ·_) (·-of-^-is-^-of-+ _ _ _) + r₀ · f zero ^ (l k +ℕ k) + ≡⟨ cong k' r₀ · f zero ^ k') (≤-∸-+-cancel right-≤-max) + r₀ · f zero ^ l + ≡⟨ solve! R' + 1r · r₀ · f zero ^ l + + vecPaths (suc i) = eq/ _ _ ((1r , 0 , refl ∣₁) , path) + where + path : 1r · (rₛ i · f (suc i) ^ (l m)) · f (suc i) ^ m 1r · rₛ i · f (suc i) ^ l + path = 1r · (rₛ i · f (suc i) ^ (l m)) · f (suc i) ^ m + ≡⟨ solve! R' + rₛ i · (f (suc i) ^ (l m) · f (suc i) ^ m) + ≡⟨ cong (rₛ i ·_) (·-of-^-is-^-of-+ _ _ _) + rₛ i · f (suc i) ^ (l m +ℕ m) + ≡⟨ cong m' rₛ i · f (suc i) ^ m') (≤-∸-+-cancel left-≤-max) + rₛ i · f (suc i) ^ l + ≡⟨ solve! R' + 1r · rₛ i · f (suc i) ^ l + + + + -- For predicates over the set of powers + powersPropElim : {f : R} {P : R Type ℓ'} + (∀ x isProp (P x)) + (∀ n P (f ^ n)) + ------------------------------ + s s [ f ⁿ|n≥0] P s + powersPropElim {f = f} {P = P} PisProp base s = + PT.rec (PisProp s) λ (n , p) subst P (sym p) (base n) + + + + -- A more specialized universal property. + -- (Just ask f to become invertible, not all its powers.) + module UniversalProp (f : R) where + open S⁻¹RUniversalProp R' [ f ⁿ|n≥0] (powersFormMultClosedSubset f) public + open CommRingHomTheory + + invElemUniversalProp : (A : CommRing ) (φ : CommRingHom R' A) + (φ .fst f A ˣ) + ∃![ χ CommRingHom R[1/ f ]AsCommRing A ] + (fst χ) (fst /1AsCommRingHom) (fst φ) + invElemUniversalProp A φ φf∈Aˣ = + S⁻¹RHasUniversalProp A φ + (powersPropElim _ ∈-isProp _ _) + n subst-∈ (A ˣ) (sym (pres^ φ f n)) (Exponentiation.^-presUnit A _ n φf∈Aˣ))) + + +-- "functorial action" of localizing away from an element +module _ {A B : CommRing } (φ : CommRingHom A B) (f : fst A) where + open CommRingStr (snd B) + private + module A = InvertingElementsBase A + module B = InvertingElementsBase B + module AU = A.UniversalProp f + module BU = B.UniversalProp (φ $r f) + + φ/1 = BU./1AsCommRingHom ∘cr φ + + uniqInvElemHom : ∃![ χ CommRingHom A.R[1/ f ]AsCommRing B.R[1/ φ $r f ]AsCommRing ] + (fst χ) (fst AU./1AsCommRingHom) (fst φ/1) + uniqInvElemHom = AU.invElemUniversalProp _ φ/1 (BU.S/1⊆S⁻¹Rˣ _ 1 , sym (·IdR _) ∣₁) + +module _ (R : CommRing ) (f : fst R) where + open CommRingTheory R + open RingTheory (CommRing→Ring R) + open Units R + open Exponentiation R + open InvertingElementsBase R + open isMultClosedSubset (powersFormMultClosedSubset f) + open S⁻¹RUniversalProp R [ f ⁿ|n≥0] (powersFormMultClosedSubset f) + open CommRingStr (snd R) + open PathToS⁻¹R + + invertingUnitsPath : f R ˣ R[1/ f ]AsCommRing R + invertingUnitsPath f∈Rˣ = S⁻¹RChar _ _ _ _ (idCommRingHom R) (char f∈Rˣ) + where + char : f R ˣ PathToS⁻¹R _ _ (powersFormMultClosedSubset f) + _ (idCommRingHom R) + φS⊆Aˣ (char f∈Rˣ) = powersPropElim (∈-isProp _) + λ n ^-presUnit _ n f∈Rˣ + kerφ⊆annS (char _) _ r≡0 = (1r , containsOne) , ·IdL _ r≡0 ∣₁ + surχ (char _) r = (r , 1r , containsOne) + , cong (r ·_) (transportRefl _) ·IdR _ ∣₁ + + +module RadicalLemma (R' : CommRing ) (f g : (fst R')) where + open IsRingHom + open isMultClosedSubset + open CommRingTheory R' + open RingTheory (CommRing→Ring R') + open CommIdeal R' hiding (subst-∈) renaming (_∈_ to _∈ᵢ_) + open RadicalIdeal R' + open Exponentiation R' + open InvertingElementsBase R' + + open S⁻¹RUniversalProp R' [ f ⁿ|n≥0] (powersFormMultClosedSubset f) + hiding (S⁻¹RHasUniversalProp) + open S⁻¹RUniversalProp R' [ g ⁿ|n≥0] (powersFormMultClosedSubset g) + hiding (_/1 ; /1AsCommRingHom) + open CommRingStr (R' .snd) + + private + R = R' .fst + ⟨_⟩ : R CommIdeal + f = replicateFinVec 1 f ⟩[ R' ] + + unitHelper : f ∈ᵢ g (g /1) R[1/ f ]AsCommRing ˣ + unitHelper = PT.rec isPropGoal (uncurry ℕhelper) + where + isPropGoal = Units.inverseUniqueness _ (g /1) + + ℕhelper : (n : ) f ^ n ∈ᵢ g (g /1) R[1/ f ]AsCommRing ˣ + ℕhelper n = PT.rec isPropGoal -- fⁿ≡αg → g⁻¹≡α/fⁿ + λ (α , p) [ (α zero) , (f ^ n) , n , refl ∣₁ ] + , eq/ _ _ ((1r , powersFormMultClosedSubset f .containsOne) + , (solve! R') sym p (solve! R')) + + toUnit : f ∈ᵢ g + s s [ g ⁿ|n≥0] (s /1) R[1/ f ]AsCommRing ˣ + toUnit f∈√⟨g⟩ = powersPropElim x Units.inverseUniqueness _ (x /1)) + λ n subst-∈ (R[1/ f ]AsCommRing ˣ) (sym (^-respects-/1 n)) + (Exponentiation.^-presUnit _ _ n (unitHelper f∈√⟨g⟩)) + + +module DoubleLoc (R' : CommRing ) (f g : fst R') where + open isMultClosedSubset + open CommRingStr (snd R') + open CommRingTheory R' + open Exponentiation R' + open InvertingElementsBase + open RingTheory (CommRing→Ring R') + open CommRingStr (snd (R[1/_]AsCommRing R' f)) renaming ( _·_ to _·ᶠ_ ; 1r to 1ᶠ + ; _+_ to _+ᶠ_ ; 0r to 0ᶠ + ; ·IdL to ·ᶠ-lid ; ·IdR to ·ᶠ-rid + ; ·Assoc to ·ᶠ-assoc ; ·Comm to ·ᶠ-comm) + open IsRingHom + + private + R = fst R' + R[1/f] = R[1/_] R' f + R[1/f]AsCommRing = R[1/_]AsCommRing R' f + R[1/fg] = R[1/_] R' (f · g) + R[1/fg]AsCommRing = R[1/_]AsCommRing R' (f · g) + R[1/f][1/g] = R[1/_] (R[1/_]AsCommRing R' f) + [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] + R[1/f][1/g]AsCommRing = R[1/_]AsCommRing (R[1/_]AsCommRing R' f) + [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] + R[1/f][1/g]ˣ = R[1/f][1/g]AsCommRing ˣ + + + _/1/1 : R R[1/f][1/g] + r /1/1 = [ [ r , 1r , PT.∣ 0 , refl ∣₁ ] , 1ᶠ , PT.∣ 0 , refl ∣₁ ] + + /1/1AsCommRingHom : CommRingHom R' R[1/f][1/g]AsCommRing + fst /1/1AsCommRingHom = _/1/1 + snd /1/1AsCommRingHom = makeIsRingHom refl lem+ lem· + where + lem+ : _ + lem+ r r' = + cong [_] + (≡-× + (cong [_] + (≡-× + (cong₂ _+_ + (sym (·IdR _) i (·IdR r (~ i)) · (·IdR 1r (~ i)))) + (sym (·IdR _) i (·IdR r' (~ i)) · (·IdR 1r (~ i))))) + (Σ≡Prop _ isPropPropTrunc) + (sym (·IdL _) i (·IdL 1r (~ i)) · (·IdL 1r (~ i))))))) + (Σ≡Prop _ isPropPropTrunc) (sym (·ᶠ-lid 1ᶠ)))) + + lem· : _ + lem· r r' = + cong [_] + (≡-× + (cong [_] (≡-× refl (Σ≡Prop _ isPropPropTrunc) (sym (·IdL _))))) + (Σ≡Prop _ isPropPropTrunc) (sym (·ᶠ-lid 1ᶠ)))) + + -- this will give us a map R[1/fg] → R[1/f][1/g] by the universal property of localisation + fⁿgⁿ/1/1∈R[1/f][1/g]ˣ : (s : R) s ([_ⁿ|n≥0] R' (f · g)) s /1/1 R[1/f][1/g]ˣ + fⁿgⁿ/1/1∈R[1/f][1/g]ˣ = powersPropElim R' s R[1/f][1/g]ˣ (s /1/1) .snd) ℕcase + where + ℕcase : (n : ) ((f · g) ^ n) /1/1 R[1/f][1/g]ˣ + ℕcase n = [ [ 1r , (f ^ n) , PT.∣ n , refl ∣₁ ] + , [ (g ^ n) , 1r , PT.∣ 0 , refl ∣₁ ] --denominator + , PT.∣ n , ^-respects-/1 _ n ∣₁ ] + , eq/ _ _ ((1ᶠ , powersFormMultClosedSubset _ _ .containsOne) + , eq/ _ _ ((1r , powersFormMultClosedSubset _ _ .containsOne) , path)) + where + path : 1r · (1r · ((f · g) ^ n · 1r) · 1r) · (1r · 1r · (1r · 1r)) + 1r · (1r · 1r · (1r · g ^ n)) · (1r · (1r · f ^ n) · 1r) + path = 1r · (1r · ((f · g) ^ n · 1r) · 1r) · (1r · 1r · (1r · 1r)) ≡⟨ solve! R' + (f · g) ^ n ≡⟨ ^-ldist-· _ _ _ + f ^ n · g ^ n ≡⟨ solve! R' + 1r · (1r · 1r · (1r · g ^ n)) · (1r · (1r · f ^ n) · 1r) + + + open PathToS⁻¹R + pathtoR[1/fg] : PathToS⁻¹R R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) + R[1/f][1/g]AsCommRing /1/1AsCommRingHom + φS⊆Aˣ pathtoR[1/fg] = fⁿgⁿ/1/1∈R[1/f][1/g]ˣ + + kerφ⊆annS pathtoR[1/fg] r p = toGoal helperR[1/f] + where + open RingTheory (CommRing→Ring R[1/f]AsCommRing) renaming ( 0RightAnnihilates to 0ᶠRightAnnihilates + ; 0LeftAnnihilates to 0ᶠ-leftNullifies) + open Exponentiation R[1/f]AsCommRing renaming (_^_ to _^ᶠ_) + hiding (·-of-^-is-^-of-+ ; ^-ldist-·) + + S[f] = Loc.S R' ([_ⁿ|n≥0] R' f) (powersFormMultClosedSubset R' f) + S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) + g/1 : R[1/_] R' f + g/1 = [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] + S[g/1] = Loc.S R[1/f]AsCommRing + ([_ⁿ|n≥0] R[1/f]AsCommRing g/1) + (powersFormMultClosedSubset R[1/f]AsCommRing g/1) + r/1 : R[1/_] R' f + r/1 = [ r , 1r , powersFormMultClosedSubset R' f .containsOne ] + + -- this is the crucial step, modulo truncation we can take p to be generated + -- by the quotienting relation of localisation. Note that we wouldn't be able + -- to prove our goal if kerφ⊆annS was formulated with a Σ instead of a ∃ + ∥r/1,1/1≈0/1,1/1∥ : ∃[ u S[g/1] ] fst u ·ᶠ r/1 ·ᶠ 1ᶠ fst u ·ᶠ 0ᶠ ·ᶠ 1ᶠ + ∥r/1,1/1≈0/1,1/1∥ = Iso.fun (SQ.isEquivRel→TruncIso (Loc.locIsEquivRel _ _ _) _ _) p + + helperR[1/f] : ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ + helperR[1/f] = PT.rec isPropPropTrunc + (uncurry (uncurry (powersPropElim R[1/f]AsCommRing + _ isPropΠ _ isPropPropTrunc)) baseCase))) + ∥r/1,1/1≈0/1,1/1∥ + where + baseCase : n g/1 ^ᶠ n ·ᶠ r/1 ·ᶠ 1ᶠ g/1 ^ᶠ n ·ᶠ 0ᶠ ·ᶠ 1ᶠ + ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ + baseCase n q = PT.∣ n , path ∣₁ + where + path : [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ + path = [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] + + ≡⟨ cong [_] (≡-× refl (Σ≡Prop _ isPropPropTrunc) (sym (·IdR _)))) + + [ g ^ n , 1r , PT.∣ 0 , refl ∣₁ ] ·ᶠ r/1 + + ≡⟨ cong (_·ᶠ r/1) (^-respects-/1 _ n) + + g/1 ^ᶠ n ·ᶠ r/1 + + ≡⟨ sym (·ᶠ-rid _) + + g/1 ^ᶠ n ·ᶠ r/1 ·ᶠ 1ᶠ + + ≡⟨ q + + g/1 ^ᶠ n ·ᶠ 0ᶠ ·ᶠ 1ᶠ + + ≡⟨ cong (_·ᶠ 1ᶠ) (0ᶠRightAnnihilates _) 0ᶠ-leftNullifies 1ᶠ + + 0ᶠ + + + toGoal : ∃[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ + ∃[ u S[fg] ] fst u · r 0r + toGoal = PT.rec isPropPropTrunc Σhelper + where + Σhelper : Σ[ n ] [ g ^ n · r , 1r , PT.∣ 0 , refl ∣₁ ] 0ᶠ + ∃[ u S[fg] ] fst u · r 0r + Σhelper (n , q) = PT.map Σhelper2 helperR + where + -- now, repeat the above strategy with q + ∥gⁿr≈0∥ : ∃[ u S[f] ] fst u · (g ^ n · r) · 1r fst u · 0r · 1r + ∥gⁿr≈0∥ = Iso.fun (SQ.isEquivRel→TruncIso (Loc.locIsEquivRel _ _ _) _ _) q - helperR : ∃[ m ] f ^ m · g ^ n · r 0r - helperR = PT.rec isPropPropTrunc - (uncurry (uncurry (powersPropElim R' - _ isPropΠ _ isPropPropTrunc)) baseCase))) - ∥gⁿr≈0∥ - where - baseCase : (m : ) f ^ m · (g ^ n · r) · 1r f ^ m · 0r · 1r - ∃[ m ] f ^ m · g ^ n · r 0r - baseCase m q' = PT.∣ m , path ∣₁ - where - path : f ^ m · g ^ n · r 0r - path = i ·IdR (·Assoc (f ^ m) (g ^ n) r (~ i)) (~ i)) - ∙∙ q' ∙∙ i ·IdR (0RightAnnihilates (f ^ m) i) i) + helperR : ∃[ m ] f ^ m · g ^ n · r 0r + helperR = PT.rec isPropPropTrunc + (uncurry (uncurry (powersPropElim R' + _ isPropΠ _ isPropPropTrunc)) baseCase))) + ∥gⁿr≈0∥ + where + baseCase : (m : ) f ^ m · (g ^ n · r) · 1r f ^ m · 0r · 1r + ∃[ m ] f ^ m · g ^ n · r 0r + baseCase m q' = PT.∣ m , path ∣₁ + where + path : f ^ m · g ^ n · r 0r + path = i ·IdR (·Assoc (f ^ m) (g ^ n) r (~ i)) (~ i)) + ∙∙ q' ∙∙ i ·IdR (0RightAnnihilates (f ^ m) i) i) - Σhelper2 : Σ[ m ] f ^ m · g ^ n · r 0r - Σ[ u S[fg] ] fst u · r 0r - Σhelper2 (m , q') = (((f · g) ^ l) , PT.∣ l , refl ∣₁) , path - where - l = max m n + Σhelper2 : Σ[ m ] f ^ m · g ^ n · r 0r + Σ[ u S[fg] ] fst u · r 0r + Σhelper2 (m , q') = (((f · g) ^ l) , PT.∣ l , refl ∣₁) , path + where + l = max m n - path : (f · g) ^ l · r 0r - path = (f · g) ^ l · r + path : (f · g) ^ l · r 0r + path = (f · g) ^ l · r - ≡⟨ cong ( r) (^-ldist-· _ _ _) + ≡⟨ cong ( r) (^-ldist-· _ _ _) - f ^ l · g ^ l · r + f ^ l · g ^ l · r - ≡⟨ cong₂ x y f ^ x · g ^ y · r) (sym (≤-∸-+-cancel {m = m} left-≤-max)) - (sym (≤-∸-+-cancel {m = n} right-≤-max)) + ≡⟨ cong₂ x y f ^ x · g ^ y · r) (sym (≤-∸-+-cancel {m = m} left-≤-max)) + (sym (≤-∸-+-cancel {m = n} right-≤-max)) - f ^ (l m +ℕ m) · g ^ (l n +ℕ n) · r + f ^ (l m +ℕ m) · g ^ (l n +ℕ n) · r - ≡⟨ cong₂ x y x · y · r) (sym (·-of-^-is-^-of-+ _ _ _)) - (sym (·-of-^-is-^-of-+ _ _ _)) + ≡⟨ cong₂ x y x · y · r) (sym (·-of-^-is-^-of-+ _ _ _)) + (sym (·-of-^-is-^-of-+ _ _ _)) - f ^ (l m) · f ^ m · (g ^ (l n) · g ^ n) · r + f ^ (l m) · f ^ m · (g ^ (l n) · g ^ n) · r - ≡⟨ cong ( r) (·CommAssocSwap _ _ _ _) + ≡⟨ cong ( r) (·CommAssocSwap _ _ _ _) - f ^ (l m) · g ^ (l n) · (f ^ m · g ^ n) · r + f ^ (l m) · g ^ (l n) · (f ^ m · g ^ n) · r - ≡⟨ sym (·Assoc _ _ _) + ≡⟨ sym (·Assoc _ _ _) - f ^ (l m) · g ^ (l n) · (f ^ m · g ^ n · r) + f ^ (l m) · g ^ (l n) · (f ^ m · g ^ n · r) - ≡⟨ cong (f ^ (l m) · g ^ (l n) ·_) q' + ≡⟨ cong (f ^ (l m) · g ^ (l n) ·_) q' - f ^ (l m) · g ^ (l n) · 0r + f ^ (l m) · g ^ (l n) · 0r - ≡⟨ 0RightAnnihilates _ + ≡⟨ 0RightAnnihilates _ - 0r + 0r - surχ pathtoR[1/fg] = invElPropElim _ _ isPropPropTrunc) toGoal - where - open Exponentiation R[1/f]AsCommRing renaming (_^_ to _^ᶠ_) - hiding (·-of-^-is-^-of-+ ; ^-ldist-·) - open CommRingStr (snd R[1/f][1/g]AsCommRing) renaming (_·_ to _·R[1/f][1/g]_) - hiding (1r ; ·IdL ; ·IdR ; ·Assoc) - open Units R[1/f][1/g]AsCommRing - g/1 : R[1/_] R' f - g/1 = [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] - S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) + surχ pathtoR[1/fg] = invElPropElim _ _ isPropPropTrunc) toGoal + where + open Exponentiation R[1/f]AsCommRing renaming (_^_ to _^ᶠ_) + hiding (·-of-^-is-^-of-+ ; ^-ldist-·) + open CommRingStr (snd R[1/f][1/g]AsCommRing) renaming (_·_ to _·R[1/f][1/g]_) + hiding (1r ; ·IdL ; ·IdR ; ·Assoc) + open Units R[1/f][1/g]AsCommRing + g/1 : R[1/_] R' f + g/1 = [ g , 1r , powersFormMultClosedSubset R' f .containsOne ] + S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) - baseCase : (r : R) (m n : ) ∃[ x R × S[fg] ] (x .fst /1/1) - [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] - , [ g ^ n , 1r , PT.∣ 0 , refl ∣₁ ] , PT.∣ n , ^-respects-/1 _ n ∣₁ ] - ·R[1/f][1/g] (x .snd .fst /1/1) - baseCase r m n = PT.∣ ((r · f ^ (l m) · g ^ (l n)) -- x .fst - , (f · g) ^ l , PT.∣ l , refl ∣₁) -- x .snd - , eq/ _ _ ((1ᶠ , PT.∣ 0 , refl ∣₁) , eq/ _ _ ((1r , PT.∣ 0 , refl ∣₁) , path)) ∣₁ - -- reduce equality of double fractions into equality in R - where - l = max m n + baseCase : (r : R) (m n : ) ∃[ x R × S[fg] ] (x .fst /1/1) + [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] + , [ g ^ n , 1r , PT.∣ 0 , refl ∣₁ ] , PT.∣ n , ^-respects-/1 _ n ∣₁ ] + ·R[1/f][1/g] (x .snd .fst /1/1) + baseCase r m n = PT.∣ ((r · f ^ (l m) · g ^ (l n)) -- x .fst + , (f · g) ^ l , PT.∣ l , refl ∣₁) -- x .snd + , eq/ _ _ ((1ᶠ , PT.∣ 0 , refl ∣₁) , eq/ _ _ ((1r , PT.∣ 0 , refl ∣₁) , path)) ∣₁ + -- reduce equality of double fractions into equality in R + where + l = max m n - path : 1r · (1r · (r · f ^ (l m) · g ^ (l n)) · (g ^ n · 1r)) · (1r · (f ^ m · 1r) · 1r) - 1r · (1r · (r · (f · g) ^ l) · 1r) · (1r · 1r · (1r · 1r)) - path = 1r · (1r · (r · f ^ (l m) · g ^ (l n)) · (g ^ n · 1r)) · (1r · (f ^ m · 1r) · 1r) + path : 1r · (1r · (r · f ^ (l m) · g ^ (l n)) · (g ^ n · 1r)) · (1r · (f ^ m · 1r) · 1r) + 1r · (1r · (r · (f · g) ^ l) · 1r) · (1r · 1r · (1r · 1r)) + path = 1r · (1r · (r · f ^ (l m) · g ^ (l n)) · (g ^ n · 1r)) · (1r · (f ^ m · 1r) · 1r) - ≡⟨ solve! R' + ≡⟨ solve! R' - r · f ^ (l m) · (g ^ (l n) · g ^ n) · f ^ m + r · f ^ (l m) · (g ^ (l n) · g ^ n) · f ^ m - ≡⟨ cong x r · f ^ (l m) · x · f ^ m) (·-of-^-is-^-of-+ _ _ _) + ≡⟨ cong x r · f ^ (l m) · x · f ^ m) (·-of-^-is-^-of-+ _ _ _) - r · f ^ (l m) · g ^ (l n +ℕ n) · f ^ m + r · f ^ (l m) · g ^ (l n +ℕ n) · f ^ m - ≡⟨ cong x r · f ^ (l m) · g ^ x · f ^ m) (≤-∸-+-cancel right-≤-max) + ≡⟨ cong x r · f ^ (l m) · g ^ x · f ^ m) (≤-∸-+-cancel right-≤-max) - r · f ^ (l m) · g ^ l · f ^ m + r · f ^ (l m) · g ^ l · f ^ m - ≡⟨ solve! R' + ≡⟨ solve! R' - r · (f ^ (l m) · f ^ m) · g ^ l + r · (f ^ (l m) · f ^ m) · g ^ l - ≡⟨ cong x r · x · g ^ l) (·-of-^-is-^-of-+ _ _ _) + ≡⟨ cong x r · x · g ^ l) (·-of-^-is-^-of-+ _ _ _) - r · f ^ (l m +ℕ m) · g ^ l + r · f ^ (l m +ℕ m) · g ^ l - ≡⟨ cong x r · f ^ x · g ^ l) (≤-∸-+-cancel left-≤-max) + ≡⟨ cong x r · f ^ x · g ^ l) (≤-∸-+-cancel left-≤-max) - r · f ^ l · g ^ l + r · f ^ l · g ^ l - ≡⟨ sym (·Assoc _ _ _) + ≡⟨ sym (·Assoc _ _ _) - r · (f ^ l · g ^ l) + r · (f ^ l · g ^ l) - ≡⟨ cong (r ·_) (sym (^-ldist-· _ _ _)) + ≡⟨ cong (r ·_) (sym (^-ldist-· _ _ _)) - r · (f · g) ^ l + r · (f · g) ^ l - ≡⟨ solve! R' + ≡⟨ solve! R' - 1r · (1r · (r · (f · g) ^ l) · 1r) · (1r · 1r · (1r · 1r)) + 1r · (1r · (r · (f · g) ^ l) · 1r) · (1r · 1r · (1r · 1r)) - base-^ᶠ-helper : (r : R) (m n : ) ∃[ x R × S[fg] ] (x .fst /1/1) - [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] - , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) - base-^ᶠ-helper r m n = subst y ∃[ x R × S[fg] ] (x .fst /1/1) - [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] , y ] ·R[1/f][1/g] (x .snd .fst /1/1)) - (Σ≡Prop _ isPropPropTrunc) (^-respects-/1 _ n)) (baseCase r m n) + base-^ᶠ-helper : (r : R) (m n : ) ∃[ x R × S[fg] ] (x .fst /1/1) + [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] + , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) + base-^ᶠ-helper r m n = subst y ∃[ x R × S[fg] ] (x .fst /1/1) + [ [ r , f ^ m , PT.∣ m , refl ∣₁ ] , y ] ·R[1/f][1/g] (x .snd .fst /1/1)) + (Σ≡Prop _ isPropPropTrunc) (^-respects-/1 _ n)) (baseCase r m n) - indStep : (r : R[1/_] R' f) (n : ) ∃[ x R × S[fg] ] - (x .fst /1/1) [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) - indStep = invElPropElim _ _ isPropΠ λ _ isPropPropTrunc) base-^ᶠ-helper + indStep : (r : R[1/_] R' f) (n : ) ∃[ x R × S[fg] ] + (x .fst /1/1) [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) + indStep = invElPropElim _ _ isPropΠ λ _ isPropPropTrunc) base-^ᶠ-helper - toGoal : (r : R[1/_] R' f) (n : ) ∃[ x R × S[fg] ] - (x .fst /1/1) ·R[1/f][1/g] - ((x .snd .fst /1/1) ⁻¹) φS⊆Aˣ pathtoR[1/fg] (x .snd .fst) (x .snd .snd) - [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] - toGoal r n = PT.map Σhelper (indStep r n) - where - Σhelper : Σ[ x R × S[fg] ] - (x .fst /1/1) [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) - Σ[ x R × S[fg] ] - (x .fst /1/1) ·R[1/f][1/g] ((x .snd .fst /1/1) ⁻¹) - φS⊆Aˣ pathtoR[1/fg] (x .snd .fst) (x .snd .snd) - [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] - Σhelper ((r' , s , s∈S[fg]) , p) = (r' , s , s∈S[fg]) - , ⁻¹-eq-elim φS⊆Aˣ pathtoR[1/fg] s s∈S[fg] p + toGoal : (r : R[1/_] R' f) (n : ) ∃[ x R × S[fg] ] + (x .fst /1/1) ·R[1/f][1/g] + ((x .snd .fst /1/1) ⁻¹) φS⊆Aˣ pathtoR[1/fg] (x .snd .fst) (x .snd .snd) + [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] + toGoal r n = PT.map Σhelper (indStep r n) + where + Σhelper : Σ[ x R × S[fg] ] + (x .fst /1/1) [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] ·R[1/f][1/g] (x .snd .fst /1/1) + Σ[ x R × S[fg] ] + (x .fst /1/1) ·R[1/f][1/g] ((x .snd .fst /1/1) ⁻¹) + φS⊆Aˣ pathtoR[1/fg] (x .snd .fst) (x .snd .snd) + [ r , g/1 ^ᶠ n , PT.∣ n , refl ∣₁ ] + Σhelper ((r' , s , s∈S[fg]) , p) = (r' , s , s∈S[fg]) + , ⁻¹-eq-elim φS⊆Aˣ pathtoR[1/fg] s s∈S[fg] p - -- the main result: localising at one element and then at another is - -- the same as localising at the product. - -- takes forever to compute without experimental lossy unification - R[1/fg]≡R[1/f][1/g] : R[1/fg]AsCommRing R[1/f][1/g]AsCommRing - R[1/fg]≡R[1/f][1/g] = S⁻¹RChar R' ([_ⁿ|n≥0] R' (f · g)) - (powersFormMultClosedSubset R' (f · g)) _ /1/1AsCommRingHom pathtoR[1/fg] + -- the main result: localising at one element and then at another is + -- the same as localising at the product. + -- takes forever to compute without experimental lossy unification + R[1/fg]≡R[1/f][1/g] : R[1/fg]AsCommRing R[1/f][1/g]AsCommRing + R[1/fg]≡R[1/f][1/g] = S⁻¹RChar R' ([_ⁿ|n≥0] R' (f · g)) + (powersFormMultClosedSubset R' (f · g)) _ /1/1AsCommRingHom pathtoR[1/fg] - -- In this module we construct the map R[1/fg]→R[1/f][1/g] directly - -- and show that it is equal (although not judgementally) to the map induced - -- by the universal property of localisation, i.e. transporting along the path - -- constructed above. Given that this is the easier direction, we can see that - -- it is pretty cumbersome to prove R[1/fg]≡R[1/f][1/g] directly, - -- which illustrates the usefulness of S⁻¹RChar quite well. - private - module check where - φ : R[1/fg] R[1/f][1/g] - φ = SQ.rec squash/ ϕ ϕcoh - where - S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) + -- In this module we construct the map R[1/fg]→R[1/f][1/g] directly + -- and show that it is equal (although not judgementally) to the map induced + -- by the universal property of localisation, i.e. transporting along the path + -- constructed above. Given that this is the easier direction, we can see that + -- it is pretty cumbersome to prove R[1/fg]≡R[1/f][1/g] directly, + -- which illustrates the usefulness of S⁻¹RChar quite well. + private + module check where + φ : R[1/fg] R[1/f][1/g] + φ = SQ.rec squash/ ϕ ϕcoh + where + S[fg] = Loc.S R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) - curriedϕΣ : (r s : R) Σ[ n ] s (f · g) ^ n R[1/f][1/g] - curriedϕΣ r s (n , s≡fg^n) = [ [ r , (f ^ n) , PT.∣ n , refl ∣₁ ] - , [ (g ^ n) , 1r , PT.∣ 0 , refl ∣₁ ] --denominator - , PT.∣ n , ^-respects-/1 R' n ∣₁ ] + curriedϕΣ : (r s : R) Σ[ n ] s (f · g) ^ n R[1/f][1/g] + curriedϕΣ r s (n , s≡fg^n) = [ [ r , (f ^ n) , PT.∣ n , refl ∣₁ ] + , [ (g ^ n) , 1r , PT.∣ 0 , refl ∣₁ ] --denominator + , PT.∣ n , ^-respects-/1 R' n ∣₁ ] - curriedϕ : (r s : R) ∃[ n ] s (f · g) ^ n R[1/f][1/g] - curriedϕ r s = elim→Set _ squash/) (curriedϕΣ r s) coh - where - coh : (x y : Σ[ n ] s (f · g) ^ n) curriedϕΣ r s x curriedϕΣ r s y - coh (n , s≡fg^n) (m , s≡fg^m) = eq/ _ _ ((1ᶠ , PT.∣ 0 , refl ∣₁) , - eq/ _ _ ( (1r , powersFormMultClosedSubset R' f .containsOne) - , path)) - where - path : 1r · (1r · r · (g ^ m)) · (1r · (f ^ m) · 1r) - 1r · (1r · r · (g ^ n)) · (1r · (f ^ n) · 1r) - path = 1r · (1r · r · (g ^ m)) · (1r · (f ^ m) · 1r) + curriedϕ : (r s : R) ∃[ n ] s (f · g) ^ n R[1/f][1/g] + curriedϕ r s = elim→Set _ squash/) (curriedϕΣ r s) coh + where + coh : (x y : Σ[ n ] s (f · g) ^ n) curriedϕΣ r s x curriedϕΣ r s y + coh (n , s≡fg^n) (m , s≡fg^m) = eq/ _ _ ((1ᶠ , PT.∣ 0 , refl ∣₁) , + eq/ _ _ ( (1r , powersFormMultClosedSubset R' f .containsOne) + , path)) + where + path : 1r · (1r · r · (g ^ m)) · (1r · (f ^ m) · 1r) + 1r · (1r · r · (g ^ n)) · (1r · (f ^ n) · 1r) + path = 1r · (1r · r · (g ^ m)) · (1r · (f ^ m) · 1r) - ≡⟨ solve! R' + ≡⟨ solve! R' - r · (g ^ m · f ^ m) + r · (g ^ m · f ^ m) - ≡⟨ cong (r ·_) (sym (^-ldist-· g f m)) + ≡⟨ cong (r ·_) (sym (^-ldist-· g f m)) - r · ((g · f) ^ m) + r · ((g · f) ^ m) - ≡⟨ cong x r · (x ^ m)) (·Comm _ _) + ≡⟨ cong x r · (x ^ m)) (·Comm _ _) - r · ((f · g) ^ m) + r · ((f · g) ^ m) - ≡⟨ cong (r ·_) ((sym s≡fg^m) s≡fg^n) + ≡⟨ cong (r ·_) ((sym s≡fg^m) s≡fg^n) - r · ((f · g) ^ n) + r · ((f · g) ^ n) - ≡⟨ cong x r · (x ^ n)) (·Comm _ _) + ≡⟨ cong x r · (x ^ n)) (·Comm _ _) - r · ((g · f) ^ n) + r · ((g · f) ^ n) - ≡⟨ cong (r ·_) (^-ldist-· g f n) + ≡⟨ cong (r ·_) (^-ldist-· g f n) - r · (g ^ n · f ^ n) + r · (g ^ n · f ^ n) - ≡⟨ solve! R' + ≡⟨ solve! R' - 1r · (1r · r · (g ^ n)) · (1r · (f ^ n) · 1r) + 1r · (1r · r · (g ^ n)) · (1r · (f ^ n) · 1r) - ϕ : R × S[fg] R[1/f][1/g] - ϕ = uncurry2 curriedϕ -- λ (r / (fg)ⁿ) → ((r / fⁿ) / gⁿ) + ϕ : R × S[fg] R[1/f][1/g] + ϕ = uncurry2 curriedϕ -- λ (r / (fg)ⁿ) → ((r / fⁿ) / gⁿ) - curriedϕcohΣ : (r s r' s' u : R) (p : u · r · s' u · r' · s) - (α : Σ[ n ] s (f · g) ^ n) - (β : Σ[ m ] s' (f · g) ^ m) - (γ : Σ[ l ] u (f · g) ^ l) - ϕ (r , s , PT.∣ α ∣₁) ϕ (r' , s' , PT.∣ β ∣₁) - curriedϕcohΣ r s r' s' u p (n , s≡fgⁿ) (m , s'≡fgᵐ) (l , u≡fgˡ) = - eq/ _ _ ( ( [ (g ^ l) , 1r , powersFormMultClosedSubset R' f .containsOne ] - , PT.∣ l , ^-respects-/1 R' l ∣₁) - , eq/ _ _ ((f ^ l , PT.∣ l , refl ∣₁) , path)) - where - path : f ^ l · (g ^ l · transp i R) i0 r · transp i R) i0 (g ^ m)) - · (1r · transp i R) i0 (f ^ m) · transp i R) i0 1r) - f ^ l · (g ^ l · transp i R) i0 r' · transp i R) i0 (g ^ n)) - · (1r · transp i R) i0 (f ^ n) · transp i R) i0 1r) - path = f ^ l · (g ^ l · transp i R) i0 r · transp i R) i0 (g ^ m)) - · (1r · transp i R) i0 (f ^ m) · transp i R) i0 1r) + curriedϕcohΣ : (r s r' s' u : R) (p : u · r · s' u · r' · s) + (α : Σ[ n ] s (f · g) ^ n) + (β : Σ[ m ] s' (f · g) ^ m) + (γ : Σ[ l ] u (f · g) ^ l) + ϕ (r , s , PT.∣ α ∣₁) ϕ (r' , s' , PT.∣ β ∣₁) + curriedϕcohΣ r s r' s' u p (n , s≡fgⁿ) (m , s'≡fgᵐ) (l , u≡fgˡ) = + eq/ _ _ ( ( [ (g ^ l) , 1r , powersFormMultClosedSubset R' f .containsOne ] + , PT.∣ l , ^-respects-/1 R' l ∣₁) + , eq/ _ _ ((f ^ l , PT.∣ l , refl ∣₁) , path)) + where + path : f ^ l · (g ^ l · transp i R) i0 r · transp i R) i0 (g ^ m)) + · (1r · transp i R) i0 (f ^ m) · transp i R) i0 1r) + f ^ l · (g ^ l · transp i R) i0 r' · transp i R) i0 (g ^ n)) + · (1r · transp i R) i0 (f ^ n) · transp i R) i0 1r) + path = f ^ l · (g ^ l · transp i R) i0 r · transp i R) i0 (g ^ m)) + · (1r · transp i R) i0 (f ^ m) · transp i R) i0 1r) - ≡⟨ i f ^ l · (g ^ l · transportRefl r i · transportRefl (g ^ m) i) - · (1r · transportRefl (f ^ m) i · transportRefl 1r i)) + ≡⟨ i f ^ l · (g ^ l · transportRefl r i · transportRefl (g ^ m) i) + · (1r · transportRefl (f ^ m) i · transportRefl 1r i)) - f ^ l · (g ^ l · r · g ^ m) · (1r · f ^ m · 1r) + f ^ l · (g ^ l · r · g ^ m) · (1r · f ^ m · 1r) - ≡⟨ solve! R' + ≡⟨ solve! R' - f ^ l · g ^ l · r · (g ^ m · f ^ m) + f ^ l · g ^ l · r · (g ^ m · f ^ m) - ≡⟨ i ^-ldist-· f g l (~ i) · r · ^-ldist-· g f m (~ i)) + ≡⟨ i ^-ldist-· f g l (~ i) · r · ^-ldist-· g f m (~ i)) - (f · g) ^ l · r · (g · f) ^ m + (f · g) ^ l · r · (g · f) ^ m - ≡⟨ cong x (f · g) ^ l · r · x ^ m) (·Comm _ _) + ≡⟨ cong x (f · g) ^ l · r · x ^ m) (·Comm _ _) - (f · g) ^ l · r · (f · g) ^ m + (f · g) ^ l · r · (f · g) ^ m - ≡⟨ i u≡fgˡ (~ i) · r · s'≡fgᵐ (~ i)) + ≡⟨ i u≡fgˡ (~ i) · r · s'≡fgᵐ (~ i)) - u · r · s' + u · r · s' - ≡⟨ p + ≡⟨ p - u · r' · s + u · r' · s - ≡⟨ i u≡fgˡ i · r' · s≡fgⁿ i) + ≡⟨ i u≡fgˡ i · r' · s≡fgⁿ i) - (f · g) ^ l · r' · (f · g) ^ n + (f · g) ^ l · r' · (f · g) ^ n - ≡⟨ cong x (f · g) ^ l · r' · x ^ n) (·Comm _ _) + ≡⟨ cong x (f · g) ^ l · r' · x ^ n) (·Comm _ _) - (f · g) ^ l · r' · (g · f) ^ n + (f · g) ^ l · r' · (g · f) ^ n - ≡⟨ i ^-ldist-· f g l i · r' · ^-ldist-· g f n i) + ≡⟨ i ^-ldist-· f g l i · r' · ^-ldist-· g f n i) - f ^ l · g ^ l · r' · (g ^ n · f ^ n) + f ^ l · g ^ l · r' · (g ^ n · f ^ n) - ≡⟨ solve! R' + ≡⟨ solve! R' - f ^ l · (g ^ l · r' · g ^ n) · (1r · f ^ n · 1r) + f ^ l · (g ^ l · r' · g ^ n) · (1r · f ^ n · 1r) - ≡⟨ i f ^ l · (g ^ l · transportRefl r' (~ i) · transportRefl (g ^ n) (~ i)) - · (1r · transportRefl (f ^ n) (~ i) · transportRefl 1r (~ i))) + ≡⟨ i f ^ l · (g ^ l · transportRefl r' (~ i) · transportRefl (g ^ n) (~ i)) + · (1r · transportRefl (f ^ n) (~ i) · transportRefl 1r (~ i))) - f ^ l · (g ^ l · transp i R) i0 r' · transp i R) i0 (g ^ n)) - · (1r · transp i R) i0 (f ^ n) · transp i R) i0 1r) + f ^ l · (g ^ l · transp i R) i0 r' · transp i R) i0 (g ^ n)) + · (1r · transp i R) i0 (f ^ n) · transp i R) i0 1r) - curriedϕcoh : (r s r' s' u : R) (p : u · r · s' u · r' · s) - (α : ∃[ n ] s (f · g) ^ n) - (β : ∃[ m ] s' (f · g) ^ m) - (γ : ∃[ l ] u (f · g) ^ l) - ϕ (r , s , α) ϕ (r' , s' , β) - curriedϕcoh r s r' s' u p = PT.elim _ isPropΠ2 _ _ squash/ _ _)) - λ α PT.elim _ isPropΠ _ squash/ _ _)) - λ β PT.rec (squash/ _ _) - λ γ curriedϕcohΣ r s r' s' u p α β γ + curriedϕcoh : (r s r' s' u : R) (p : u · r · s' u · r' · s) + (α : ∃[ n ] s (f · g) ^ n) + (β : ∃[ m ] s' (f · g) ^ m) + (γ : ∃[ l ] u (f · g) ^ l) + ϕ (r , s , α) ϕ (r' , s' , β) + curriedϕcoh r s r' s' u p = PT.elim _ isPropΠ2 _ _ squash/ _ _)) + λ α PT.elim _ isPropΠ _ squash/ _ _)) + λ β PT.rec (squash/ _ _) + λ γ curriedϕcohΣ r s r' s' u p α β γ - ϕcoh : (a b : R × S[fg]) - Loc._≈_ R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) a b - ϕ a ϕ b - ϕcoh (r , s , α) (r' , s' , β) ((u , γ) , p) = curriedϕcoh r s r' s' u p α β γ + ϕcoh : (a b : R × S[fg]) + Loc._≈_ R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) a b + ϕ a ϕ b + ϕcoh (r , s , α) (r' , s' , β) ((u , γ) , p) = curriedϕcoh r s r' s' u p α β γ - -- the map induced by the universal property - open S⁻¹RUniversalProp R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) - χ : R[1/fg] R[1/f][1/g] - χ = S⁻¹RHasUniversalProp R[1/f][1/g]AsCommRing /1/1AsCommRingHom fⁿgⁿ/1/1∈R[1/f][1/g]ˣ .fst .fst .fst + -- the map induced by the universal property + open S⁻¹RUniversalProp R' ([_ⁿ|n≥0] R' (f · g)) (powersFormMultClosedSubset R' (f · g)) + χ : R[1/fg] R[1/f][1/g] + χ = S⁻¹RHasUniversalProp R[1/f][1/g]AsCommRing /1/1AsCommRingHom fⁿgⁿ/1/1∈R[1/f][1/g]ˣ .fst .fst .fst - -- the sanity check: - -- both maps send a fraction r/(fg)ⁿ to a double fraction, - -- where numerator and denominator are almost the same fraction respectively. - -- unfortunately the proofs that the denominators are powers are quite different for - -- the two maps, but of course we can ignore them. - -- The definition of χ introduces a lot of (1r ·_). Perhaps most surprisingly, - -- we have to give the path eq1 for the equality of the numerator of the numerator. - φ≡χ : r φ r χ r - φ≡χ = invElPropElim _ _ squash/ _ _) ℕcase - where - ℕcase : (r : R) (n : ) - φ [ r , (f · g) ^ n , PT.∣ n , refl ∣₁ ] χ [ r , (f · g) ^ n , PT.∣ n , refl ∣₁ ] - ℕcase r n = cong [_] (ΣPathP --look into the components of the double-fractions - ( cong [_] (ΣPathP (eq1 , Σ≡Prop x S'[f] x .snd) (sym (·IdL _)))) - , Σ≡Prop x S'[f][g] x .snd) --ignore proof that denominator is power of g/1 - ( cong [_] (ΣPathP (sym (·IdL _) , Σ≡Prop x S'[f] x .snd) (sym (·IdL _))))))) - where - S'[f] = ([_ⁿ|n≥0] R' f) - S'[f][g] = ([_ⁿ|n≥0] R[1/f]AsCommRing [ g , 1r , powersFormMultClosedSubset R' f .containsOne ]) + -- the sanity check: + -- both maps send a fraction r/(fg)ⁿ to a double fraction, + -- where numerator and denominator are almost the same fraction respectively. + -- unfortunately the proofs that the denominators are powers are quite different for + -- the two maps, but of course we can ignore them. + -- The definition of χ introduces a lot of (1r ·_). Perhaps most surprisingly, + -- we have to give the path eq1 for the equality of the numerator of the numerator. + φ≡χ : r φ r χ r + φ≡χ = invElPropElim _ _ squash/ _ _) ℕcase + where + ℕcase : (r : R) (n : ) + φ [ r , (f · g) ^ n , PT.∣ n , refl ∣₁ ] χ [ r , (f · g) ^ n , PT.∣ n , refl ∣₁ ] + ℕcase r n = cong [_] (ΣPathP --look into the components of the double-fractions + ( cong [_] (ΣPathP (eq1 , Σ≡Prop x S'[f] x .snd) (sym (·IdL _)))) + , Σ≡Prop x S'[f][g] x .snd) --ignore proof that denominator is power of g/1 + ( cong [_] (ΣPathP (sym (·IdL _) , Σ≡Prop x S'[f] x .snd) (sym (·IdL _))))))) + where + S'[f] = ([_ⁿ|n≥0] R' f) + S'[f][g] = ([_ⁿ|n≥0] R[1/f]AsCommRing [ g , 1r , powersFormMultClosedSubset R' f .containsOne ]) - eq1 : transp i fst R') i0 r r · transp i fst R') i0 1r - eq1 = transportRefl r ∙∙ sym (·IdR r) ∙∙ cong (r ·_) (sym (transportRefl 1r)) + eq1 : transp i fst R') i0 r r · transp i fst R') i0 1r + eq1 = transportRefl r ∙∙ sym (·IdR r) ∙∙ cong (r ·_) (sym (transportRefl 1r)) \ No newline at end of file diff --git a/Cubical.Algebra.CommRing.Localisation.Limit.html b/Cubical.Algebra.CommRing.Localisation.Limit.html index ce789560b0..a42c246f34 100644 --- a/Cubical.Algebra.CommRing.Localisation.Limit.html +++ b/Cubical.Algebra.CommRing.Localisation.Limit.html @@ -60,546 +60,546 @@ -- were not dealing with case 0 here -- but then R = 0 = lim {} (limit of the empty diagram) -module _ (R' : CommRing ) {n : } (f : FinVec (fst R') (suc n)) where - open isMultClosedSubset - open CommRingTheory R' - open RingTheory (CommRing→Ring R') - open Sum (CommRing→Ring R') - open CommIdeal R' - open InvertingElementsBase R' - open Exponentiation R' - open CommRingStr ⦃...⦄ - - private - R = fst R' - ⟨_⟩ : {n : } FinVec R n CommIdeal - V = V ⟩[ R' ] - ⟨f₀,⋯,fₙ⟩ = f ⟩[ R' ] - - instance - _ = R' .snd - - module L i = Loc R' [ f i ⁿ|n≥0] (powersFormMultClosedSubset (f i)) - module U i = S⁻¹RUniversalProp R' [ f i ⁿ|n≥0] (powersFormMultClosedSubset (f i)) - module LP i j = Loc R' [ f i · f j ⁿ|n≥0] (powersFormMultClosedSubset (f i · f j)) - module UP i j = S⁻¹RUniversalProp R' [ f i · f j ⁿ|n≥0] (powersFormMultClosedSubset (f i · f j)) - - -- some syntax to make things readable - 0at : (i : Fin (suc n)) R[1/ (f i) ] - 0at i = R[1/ (f i) ]AsCommRing .snd .CommRingStr.0r - - _/1ˢ : R {i : Fin (suc n)} R[1/ (f i) ] - (r /1ˢ) {i = i} = U._/1 i r - - _/1ᵖ : R {i j : Fin (suc n)} R[1/ (f i) · (f j) ] - (r /1ᵖ) {i = i} {j = j} = UP._/1 i j r - - - -- This lemma proves that if ⟨ f₀ ,..., fₙ ⟩ ≡ R, - -- then we get an exact sequence - -- 0 → R → ∏ᵢ R[1/fᵢ] - -- sending r : R to r/1 in R[1/fᵢ] for each i - injectivityLemma : 1r ⟨f₀,⋯,fₙ⟩ (x : R) (∀ i x /1ˢ 0at i) x 0r - injectivityLemma 1∈⟨f₀,⋯,fₙ⟩ x x/1≡0 = recFin (is-set _ _) annihilatorHelper exAnnihilator - where - exAnnihilator : i ∃[ s L.S i ] (fst s · x · 1r fst s · 0r · 1r) - exAnnihilator i = isEquivRel→TruncIso (L.locIsEquivRel i) _ _ .fun (x/1≡0 i) - - annihilatorHelper : (∀ i Σ[ s L.S i ] (fst s · x · 1r fst s · 0r · 1r)) - x 0r - annihilatorHelper ann = recFin (is-set _ _) exponentHelper uIsPower - where - u : FinVec R (suc n) - u i = ann i .fst .fst - - uIsPower : i u i ∈ₚ [ (f i) ⁿ|n≥0] - uIsPower i = ann i .fst .snd - - ux≡0 : i u i · x 0r - ux≡0 i = sym (·IdR _) ann i .snd cong ( 1r) (0RightAnnihilates _) (·IdR _) - - exponentHelper : (∀ i Σ[ m ] u i f i ^ m) - x 0r - exponentHelper pows = PT.rec (is-set _ _) Σhelper (GeneratingPowers.thm R' l _ _ 1∈⟨f₀,⋯,fₙ⟩) - where - m : FinVec (suc n) - m i = pows i .fst - - u≡fᵐ : i u i f i ^ m i - u≡fᵐ i = pows i .snd - - l = Max m - - : FinVec R (suc n) - i = f i ^ l - - fˡx≡0 : i f i ^ l · x 0r - fˡx≡0 i = - f i ^ l · x ≡⟨ cong k f i ^ k · x) - (sym (≤-∸-+-cancel (ind≤Max m i))) - f i ^ ((l m i) +ℕ m i) · x ≡⟨ cong ( x) (sym (·-of-^-is-^-of-+ _ _ _)) - f i ^ (l m i) · f i ^ m i · x ≡⟨ cong y f i ^ (l m i) · y · x) - (sym (u≡fᵐ i)) - f i ^ (l m i) · u i · x ≡⟨ sym (·Assoc _ _ _) - f i ^ (l m i) · (u i · x) ≡⟨ cong (f i ^ (l m i) ·_) (ux≡0 i) - f i ^ (l m i) · 0r ≡⟨ 0RightAnnihilates _ - 0r - - - Σhelper : Σ[ α FinVec R (suc n) ] 1r i α i · f i ^ l) - x 0r - Σhelper (α , 1≡∑αfˡ) = - x ≡⟨ sym (·IdL _) - 1r · x ≡⟨ cong ( x) 1≡∑αfˡ - i α i · f i ^ l) · x ≡⟨ ∑Mulldist _ _ - i α i · f i ^ l · x) ≡⟨ ∑Ext i sym (·Assoc (α i) - (f i ^ l) x)) - i α i · (f i ^ l · x)) ≡⟨ ∑Ext i cong (α i ·_) (fˡx≡0 i)) - i α i · 0r) ≡⟨ ∑Ext i 0RightAnnihilates (α i)) - (replicateFinVec (suc n) 0r) ≡⟨ ∑0r (suc n) - 0r - - - -- the morphisms into localisations of products from the left/right - -- we need to define them by hand as using RadicalLemma wouldn't compute later - χˡUnique : (i j : Fin (suc n)) - ∃![ χ CommRingHom R[1/ f i ]AsCommRing R[1/ f i · f j ]AsCommRing ] - (fst χ) (U._/1 i) (UP._/1 i j) - χˡUnique i j = U.S⁻¹RHasUniversalProp i _ (UP./1AsCommRingHom i j) unitHelper - where - unitHelper : s s ∈ₚ [ (f i) ⁿ|n≥0] s /1ᵖ ∈ₚ (R[1/ f i · f j ]AsCommRing) ˣ - unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᵖ)) - λ m [ f j ^ m , (f i · f j) ^ m , m , refl ∣₁ ] - , eq/ _ _ ((1r , powersFormMultClosedSubset (f i · f j) .containsOne) - , path m) - where - path : (n : ) 1r · (f i ^ n · f j ^ n) · 1r (1r · 1r) · (1r · ((f i · f j) ^ n)) - path n = solve! R' sym (^-ldist-· (f i) (f j) n) solve! R' - - χˡ : (i j : Fin (suc n)) CommRingHom R[1/ f i ]AsCommRing R[1/ f i · f j ]AsCommRing - χˡ i j = χˡUnique i j .fst .fst - - χʳUnique : (i j : Fin (suc n)) - ∃![ χ CommRingHom R[1/ f j ]AsCommRing R[1/ f i · f j ]AsCommRing ] - (fst χ) (U._/1 j) (UP._/1 i j) - χʳUnique i j = U.S⁻¹RHasUniversalProp j _ (UP./1AsCommRingHom i j) unitHelper - where - unitHelper : s s ∈ₚ [ (f j) ⁿ|n≥0] s /1ᵖ ∈ₚ (R[1/ f i · f j ]AsCommRing) ˣ - unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᵖ)) - λ m [ f i ^ m , (f i · f j) ^ m , m , refl ∣₁ ] - , eq/ _ _ ((1r , powersFormMultClosedSubset (f i · f j) .containsOne) - , path m) - where - path : (n : ) 1r · (f j ^ n · f i ^ n) · 1r (1r · 1r) · (1r · ((f i · f j) ^ n)) - path n = solve! R' sym (^-ldist-· (f i) (f j) n) solve! R' - - χʳ : (i j : Fin (suc n)) CommRingHom R[1/ f j ]AsCommRing R[1/ f i · f j ]AsCommRing - χʳ i j = χʳUnique i j .fst .fst - - - - -- super technical stuff, please don't look at it - private - χ≡Elim<Only : (x : (i : Fin (suc n)) R[1/ f i ]) - (∀ i j i < j χˡ i j .fst (x i) χʳ i j .fst (x j)) - i j χˡ i j .fst (x i) χʳ i j .fst (x j) - χ≡Elim<Only x <hyp i j = aux (i j) -- doesn't type check in reasonable time using with syntax - where - aux : FinTrichotomy i j χˡ i j .fst (x i) χʳ i j .fst (x j) - aux (lt i<j) = <hyp _ _ i<j - aux (eq i≡j) = subst j' χˡ i j' .fst (x i) χʳ i j' .fst (x j')) i≡j (χId i (x i)) - where - χId : i x χˡ i i .fst x χʳ i i .fst x - χId i = invElPropElim _ squash/ _ _) - r m cong [_] (ΣPathP (refl , Σ≡Prop (∈-isProp _) refl))) - - aux (gt j<i) = - χˡ i j .fst (x i) ≡⟨ χSwapL→R i j (x i) - χʳsubst i j (x i) ≡⟨ cong (subst r R[1/ r ]) (·Comm (f j) (f i))) (sym (<hyp _ _ j<i)) - χˡsubst i j (x j) ≡⟨ sym (χSwapR→L i j (x j)) - χʳ i j .fst (x j) - where - χʳsubst : (i j : Fin (suc n)) R[1/ f i ] R[1/ f i · f j ] - χʳsubst i j x = subst r R[1/ r ]) (·Comm (f j) (f i)) (χʳ j i .fst x) - - χSwapL→R : i j x χˡ i j .fst x χʳsubst i j x - χSwapL→R i j = invElPropElim _ squash/ _ _) - λ r m cong [_] (ΣPathP (sym (transportRefl _) , Σ≡Prop (∈-isProp _) - (sym (transportRefl _ cong x 1r · transport refl (x ^ m)) (·Comm _ _))))) - χˡsubst : (i j : Fin (suc n)) R[1/ f j ] R[1/ f i · f j ] - χˡsubst i j x = subst r R[1/ r ]) (·Comm (f j) (f i)) (χˡ j i .fst x) - - χSwapR→L : i j x χʳ i j .fst x χˡsubst i j x - χSwapR→L i j = invElPropElim _ squash/ _ _) - λ r m cong [_] (ΣPathP (sym (transportRefl _) , Σ≡Prop (∈-isProp _) - (sym (transportRefl _ cong x 1r · transport refl (x ^ m)) (·Comm _ _))))) - - χ≡PropElim : {B : ((i : Fin (suc n)) R[1/ f i ]) Type ℓ''} (isPropB : {x} isProp (B x)) - (∀ (r : FinVec R (suc n)) (m l : ) - (∀ i j r i · f j ^ m · (f i · f j) ^ l r j · f i ^ m · (f i · f j) ^ l) - B i [ r i , f i ^ m , m , refl ∣₁ ])) - ------------------------------------------------------------------------------------- - (x : (i : Fin (suc n)) R[1/ f i ]) - (∀ i j χˡ i j .fst (x i) χʳ i j .fst (x j)) - B x - χ≡PropElim {B = B} isPropB baseHyp = invElPropElimN n f _ _ isProp→ isPropB) baseCase - where - baseCase : (r : FinVec R (suc n)) (m : ) - (∀ i j χˡ i j .fst ([ r i , f i ^ m , m , refl ∣₁ ]) - χʳ i j .fst ([ r j , f j ^ m , m , refl ∣₁ ])) - B i [ r i , f i ^ m , m , refl ∣₁ ]) - baseCase r m pairHyp = recFin2 isPropB annihilatorHelper exAnnihilator - where - -- This computes because we defined the χ by hand - exAnnihilator : i j - ∃[ s LP.S i j ] -- s.t. - fst s · (r i · transport refl (f j ^ m)) - · (1r · transport refl ((f i · f j) ^ m)) - fst s · (r j · transport refl (f i ^ m)) - · (1r · transport refl ((f i · f j) ^ m)) - exAnnihilator i j = isEquivRel→TruncIso (LP.locIsEquivRel _ _) _ _ .fun - (pairHyp i j) - - annihilatorHelper : (∀ i j - Σ[ s LP.S i j ] -- s.t. - fst s · (r i · transport refl (f j ^ m)) - · (1r · transport refl ((f i · f j) ^ m)) - fst s · (r j · transport refl (f i ^ m)) - · (1r · transport refl ((f i · f j) ^ m))) - B i [ r i , f i ^ m , m , refl ∣₁ ]) - annihilatorHelper anns = recFin2 isPropB exponentHelper sIsPow - where - -- notation - s : (i j : Fin (suc n)) R - s i j = anns i j .fst .fst - - sIsPow : i j s i j ∈ₚ [ (f i · f j) ⁿ|n≥0] - sIsPow i j = anns i j .fst .snd - - sIsAnn : i j - s i j · r i · f j ^ m · (f i · f j) ^ m - s i j · r j · f i ^ m · (f i · f j) ^ m - sIsAnn i j = - s i j · r i · f j ^ m · (f i · f j) ^ m - ≡⟨ transpHelper _ _ _ _ - s i j · r i · transport refl (f j ^ m) · transport refl ((f i · f j) ^ m) - ≡⟨ useSolver _ _ _ _ - s i j · (r i · transport refl (f j ^ m)) - · (1r · transport refl ((f i · f j) ^ m)) - ≡⟨ anns i j .snd - s i j · (r j · transport refl (f i ^ m)) - · (1r · transport refl ((f i · f j) ^ m)) - ≡⟨ sym (useSolver _ _ _ _) - s i j · r j · transport refl (f i ^ m) · transport refl ((f i · f j) ^ m) - ≡⟨ sym (transpHelper _ _ _ _) - s i j · r j · f i ^ m · (f i · f j) ^ m - where - transpHelper : a b c d a · b · c · d - a · b · transport refl c · transport refl d - transpHelper a b c d i = a · b · transportRefl c (~ i) · transportRefl d (~ i) - useSolver : a b c d a · b · c · d a · (b · c) · (1r · d) - useSolver _ _ _ _ = solve! R' - - exponentHelper : (∀ i j - Σ[ l ] s i j (f i · f j) ^ l) - B i [ r i , f i ^ m , m , refl ∣₁ ]) - exponentHelper pows = baseHyp r m (m +ℕ k) paths - where - -- sᵢⱼ = fᵢfⱼ ^ lᵢⱼ, so need to take max over all of these... - l : (i j : Fin (suc n)) - l i j = pows i j .fst - - k = Max i Max (l i)) - - l≤k : i j l i j k - l≤k i j = ≤-trans (ind≤Max (l i) j) (ind≤Max i Max (l i)) i) - - sPath : i j s i j (f i · f j) ^ l i j - sPath i j = pows i j .snd - - -- the path we get from our assumptions spelled out and cleaned up - assumPath : i j - r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) - r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) - assumPath i j = - r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) - - ≡⟨ cong (r i · f j ^ m ·_) (sym (·-of-^-is-^-of-+ _ _ _)) - - r i · f j ^ m · ((f i · f j) ^ m · (f i · f j) ^ l i j) - - ≡⟨ solve! R' - - (f i · f j) ^ l i j · r i · f j ^ m · (f i · f j) ^ m - - ≡⟨ cong a a · r i · f j ^ m · (f i · f j) ^ m) (sym (sPath i j)) - - s i j · r i · f j ^ m · (f i · f j) ^ m - - ≡⟨ sIsAnn i j - - s i j · r j · f i ^ m · (f i · f j) ^ m +module _ (R' : CommRing ) {n : } (f : FinVec (fst R') n) where + open isMultClosedSubset + open CommRingTheory R' + open RingTheory (CommRing→Ring R') + open Sum (CommRing→Ring R') + open CommIdeal R' + open InvertingElementsBase R' + open Exponentiation R' + open CommRingStr ⦃...⦄ + + private + R = fst R' + ⟨_⟩ : {n : } FinVec R n CommIdeal + V = V ⟩[ R' ] + ⟨f₀,⋯,fₙ⟩ = f ⟩[ R' ] + + instance + _ = R' .snd + + module L i = Loc R' [ f i ⁿ|n≥0] (powersFormMultClosedSubset (f i)) + module U i = S⁻¹RUniversalProp R' [ f i ⁿ|n≥0] (powersFormMultClosedSubset (f i)) + module LP i j = Loc R' [ f i · f j ⁿ|n≥0] (powersFormMultClosedSubset (f i · f j)) + module UP i j = S⁻¹RUniversalProp R' [ f i · f j ⁿ|n≥0] (powersFormMultClosedSubset (f i · f j)) + + -- some syntax to make things readable + 0at : (i : Fin n) R[1/ (f i) ] + 0at i = R[1/ (f i) ]AsCommRing .snd .CommRingStr.0r + + _/1ˢ : R {i : Fin n} R[1/ (f i) ] + (r /1ˢ) {i = i} = U._/1 i r + + _/1ᵖ : R {i j : Fin n} R[1/ (f i) · (f j) ] + (r /1ᵖ) {i = i} {j = j} = UP._/1 i j r + + + -- This lemma proves that if ⟨ f₀ ,..., fₙ ⟩ ≡ R, + -- then we get an exact sequence + -- 0 → R → ∏ᵢ R[1/fᵢ] + -- sending r : R to r/1 in R[1/fᵢ] for each i + injectivityLemma : 1r ⟨f₀,⋯,fₙ⟩ (x : R) (∀ i x /1ˢ 0at i) x 0r + injectivityLemma 1∈⟨f₀,⋯,fₙ⟩ x x/1≡0 = recFin (is-set _ _) annihilatorHelper exAnnihilator + where + exAnnihilator : i ∃[ s L.S i ] (fst s · x · 1r fst s · 0r · 1r) + exAnnihilator i = isEquivRel→TruncIso (L.locIsEquivRel i) _ _ .fun (x/1≡0 i) + + annihilatorHelper : (∀ i Σ[ s L.S i ] (fst s · x · 1r fst s · 0r · 1r)) + x 0r + annihilatorHelper ann = recFin (is-set _ _) exponentHelper uIsPower + where + u : FinVec R n + u i = ann i .fst .fst + + uIsPower : i u i ∈ₚ [ (f i) ⁿ|n≥0] + uIsPower i = ann i .fst .snd + + ux≡0 : i u i · x 0r + ux≡0 i = sym (·IdR _) ann i .snd cong ( 1r) (0RightAnnihilates _) (·IdR _) + + exponentHelper : (∀ i Σ[ m ] u i f i ^ m) + x 0r + exponentHelper pows = PT.rec (is-set _ _) Σhelper (GeneratingPowers.thm R' l _ _ 1∈⟨f₀,⋯,fₙ⟩) + where + m : FinVec n + m i = pows i .fst + + u≡fᵐ : i u i f i ^ m i + u≡fᵐ i = pows i .snd + + l = Max m + + : FinVec R n + i = f i ^ l + + fˡx≡0 : i f i ^ l · x 0r + fˡx≡0 i = + f i ^ l · x ≡⟨ cong k f i ^ k · x) + (sym (≤-∸-+-cancel (ind≤Max m i))) + f i ^ ((l m i) +ℕ m i) · x ≡⟨ cong ( x) (sym (·-of-^-is-^-of-+ _ _ _)) + f i ^ (l m i) · f i ^ m i · x ≡⟨ cong y f i ^ (l m i) · y · x) + (sym (u≡fᵐ i)) + f i ^ (l m i) · u i · x ≡⟨ sym (·Assoc _ _ _) + f i ^ (l m i) · (u i · x) ≡⟨ cong (f i ^ (l m i) ·_) (ux≡0 i) + f i ^ (l m i) · 0r ≡⟨ 0RightAnnihilates _ + 0r + + + Σhelper : Σ[ α FinVec R n ] 1r i α i · f i ^ l) + x 0r + Σhelper (α , 1≡∑αfˡ) = + x ≡⟨ sym (·IdL _) + 1r · x ≡⟨ cong ( x) 1≡∑αfˡ + i α i · f i ^ l) · x ≡⟨ ∑Mulldist _ _ + i α i · f i ^ l · x) ≡⟨ ∑Ext i sym (·Assoc (α i) + (f i ^ l) x)) + i α i · (f i ^ l · x)) ≡⟨ ∑Ext i cong (α i ·_) (fˡx≡0 i)) + i α i · 0r) ≡⟨ ∑Ext i 0RightAnnihilates (α i)) + (replicateFinVec n 0r) ≡⟨ ∑0r n + 0r + + + -- the morphisms into localisations of products from the left/right + -- we need to define them by hand as using RadicalLemma wouldn't compute later + χˡUnique : (i j : Fin n) + ∃![ χ CommRingHom R[1/ f i ]AsCommRing R[1/ f i · f j ]AsCommRing ] + (fst χ) (U._/1 i) (UP._/1 i j) + χˡUnique i j = U.S⁻¹RHasUniversalProp i _ (UP./1AsCommRingHom i j) unitHelper + where + unitHelper : s s ∈ₚ [ (f i) ⁿ|n≥0] s /1ᵖ ∈ₚ (R[1/ f i · f j ]AsCommRing) ˣ + unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᵖ)) + λ m [ f j ^ m , (f i · f j) ^ m , m , refl ∣₁ ] + , eq/ _ _ ((1r , powersFormMultClosedSubset (f i · f j) .containsOne) + , path m) + where + path : (n : ) 1r · (f i ^ n · f j ^ n) · 1r (1r · 1r) · (1r · ((f i · f j) ^ n)) + path n = solve! R' sym (^-ldist-· (f i) (f j) n) solve! R' + + χˡ : (i j : Fin n) CommRingHom R[1/ f i ]AsCommRing R[1/ f i · f j ]AsCommRing + χˡ i j = χˡUnique i j .fst .fst + + χʳUnique : (i j : Fin n) + ∃![ χ CommRingHom R[1/ f j ]AsCommRing R[1/ f i · f j ]AsCommRing ] + (fst χ) (U._/1 j) (UP._/1 i j) + χʳUnique i j = U.S⁻¹RHasUniversalProp j _ (UP./1AsCommRingHom i j) unitHelper + where + unitHelper : s s ∈ₚ [ (f j) ⁿ|n≥0] s /1ᵖ ∈ₚ (R[1/ f i · f j ]AsCommRing) ˣ + unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᵖ)) + λ m [ f i ^ m , (f i · f j) ^ m , m , refl ∣₁ ] + , eq/ _ _ ((1r , powersFormMultClosedSubset (f i · f j) .containsOne) + , path m) + where + path : (n : ) 1r · (f j ^ n · f i ^ n) · 1r (1r · 1r) · (1r · ((f i · f j) ^ n)) + path n = solve! R' sym (^-ldist-· (f i) (f j) n) solve! R' + + χʳ : (i j : Fin n) CommRingHom R[1/ f j ]AsCommRing R[1/ f i · f j ]AsCommRing + χʳ i j = χʳUnique i j .fst .fst + + + + -- super technical stuff, please don't look at it + private + χ≡Elim<Only : (x : (i : Fin n) R[1/ f i ]) + (∀ i j i < j χˡ i j .fst (x i) χʳ i j .fst (x j)) + i j χˡ i j .fst (x i) χʳ i j .fst (x j) + χ≡Elim<Only x <hyp i j = aux (i j) -- doesn't type check in reasonable time using with syntax + where + aux : FinTrichotomy i j χˡ i j .fst (x i) χʳ i j .fst (x j) + aux (lt i<j) = <hyp _ _ i<j + aux (eq i≡j) = subst j' χˡ i j' .fst (x i) χʳ i j' .fst (x j')) i≡j (χId i (x i)) + where + χId : i x χˡ i i .fst x χʳ i i .fst x + χId i = invElPropElim _ squash/ _ _) + r m cong [_] (ΣPathP (refl , Σ≡Prop (∈-isProp _) refl))) + + aux (gt j<i) = + χˡ i j .fst (x i) ≡⟨ χSwapL→R i j (x i) + χʳsubst i j (x i) ≡⟨ cong (subst r R[1/ r ]) (·Comm (f j) (f i))) (sym (<hyp _ _ j<i)) + χˡsubst i j (x j) ≡⟨ sym (χSwapR→L i j (x j)) + χʳ i j .fst (x j) + where + χʳsubst : (i j : Fin n) R[1/ f i ] R[1/ f i · f j ] + χʳsubst i j x = subst r R[1/ r ]) (·Comm (f j) (f i)) (χʳ j i .fst x) + + χSwapL→R : i j x χˡ i j .fst x χʳsubst i j x + χSwapL→R i j = invElPropElim _ squash/ _ _) + λ r m cong [_] (ΣPathP (sym (transportRefl _) , Σ≡Prop (∈-isProp _) + (sym (transportRefl _ cong x 1r · transport refl (x ^ m)) (·Comm _ _))))) + χˡsubst : (i j : Fin n) R[1/ f j ] R[1/ f i · f j ] + χˡsubst i j x = subst r R[1/ r ]) (·Comm (f j) (f i)) (χˡ j i .fst x) + + χSwapR→L : i j x χʳ i j .fst x χˡsubst i j x + χSwapR→L i j = invElPropElim _ squash/ _ _) + λ r m cong [_] (ΣPathP (sym (transportRefl _) , Σ≡Prop (∈-isProp _) + (sym (transportRefl _ cong x 1r · transport refl (x ^ m)) (·Comm _ _))))) + + χ≡PropElim : {B : ((i : Fin n) R[1/ f i ]) Type ℓ''} (isPropB : {x} isProp (B x)) + (∀ (r : FinVec R n) (m l : ) + (∀ i j r i · f j ^ m · (f i · f j) ^ l r j · f i ^ m · (f i · f j) ^ l) + B i [ r i , f i ^ m , m , refl ∣₁ ])) + ------------------------------------------------------------------------------------- + (x : (i : Fin n) R[1/ f i ]) + (∀ i j χˡ i j .fst (x i) χʳ i j .fst (x j)) + B x + χ≡PropElim {B = B} isPropB baseHyp = invElPropElimN n f _ _ isProp→ isPropB) baseCase + where + baseCase : (r : FinVec R n) (m : ) + (∀ i j χˡ i j .fst ([ r i , f i ^ m , m , refl ∣₁ ]) + χʳ i j .fst ([ r j , f j ^ m , m , refl ∣₁ ])) + B i [ r i , f i ^ m , m , refl ∣₁ ]) + baseCase r m pairHyp = recFin2 isPropB annihilatorHelper exAnnihilator + where + -- This computes because we defined the χ by hand + exAnnihilator : i j + ∃[ s LP.S i j ] -- s.t. + fst s · (r i · transport refl (f j ^ m)) + · (1r · transport refl ((f i · f j) ^ m)) + fst s · (r j · transport refl (f i ^ m)) + · (1r · transport refl ((f i · f j) ^ m)) + exAnnihilator i j = isEquivRel→TruncIso (LP.locIsEquivRel _ _) _ _ .fun + (pairHyp i j) + + annihilatorHelper : (∀ i j + Σ[ s LP.S i j ] -- s.t. + fst s · (r i · transport refl (f j ^ m)) + · (1r · transport refl ((f i · f j) ^ m)) + fst s · (r j · transport refl (f i ^ m)) + · (1r · transport refl ((f i · f j) ^ m))) + B i [ r i , f i ^ m , m , refl ∣₁ ]) + annihilatorHelper anns = recFin2 isPropB exponentHelper sIsPow + where + -- notation + s : (i j : Fin n) R + s i j = anns i j .fst .fst + + sIsPow : i j s i j ∈ₚ [ (f i · f j) ⁿ|n≥0] + sIsPow i j = anns i j .fst .snd + + sIsAnn : i j + s i j · r i · f j ^ m · (f i · f j) ^ m + s i j · r j · f i ^ m · (f i · f j) ^ m + sIsAnn i j = + s i j · r i · f j ^ m · (f i · f j) ^ m + ≡⟨ transpHelper _ _ _ _ + s i j · r i · transport refl (f j ^ m) · transport refl ((f i · f j) ^ m) + ≡⟨ useSolver _ _ _ _ + s i j · (r i · transport refl (f j ^ m)) + · (1r · transport refl ((f i · f j) ^ m)) + ≡⟨ anns i j .snd + s i j · (r j · transport refl (f i ^ m)) + · (1r · transport refl ((f i · f j) ^ m)) + ≡⟨ sym (useSolver _ _ _ _) + s i j · r j · transport refl (f i ^ m) · transport refl ((f i · f j) ^ m) + ≡⟨ sym (transpHelper _ _ _ _) + s i j · r j · f i ^ m · (f i · f j) ^ m + where + transpHelper : a b c d a · b · c · d + a · b · transport refl c · transport refl d + transpHelper a b c d i = a · b · transportRefl c (~ i) · transportRefl d (~ i) + useSolver : a b c d a · b · c · d a · (b · c) · (1r · d) + useSolver _ _ _ _ = solve! R' + + exponentHelper : (∀ i j + Σ[ l ] s i j (f i · f j) ^ l) + B i [ r i , f i ^ m , m , refl ∣₁ ]) + exponentHelper pows = baseHyp r m (m +ℕ k) paths + where + -- sᵢⱼ = fᵢfⱼ ^ lᵢⱼ, so need to take max over all of these... + l : (i j : Fin n) + l i j = pows i j .fst + + k = Max i Max (l i)) + + l≤k : i j l i j k + l≤k i j = ≤-trans (ind≤Max (l i) j) (ind≤Max i Max (l i)) i) + + sPath : i j s i j (f i · f j) ^ l i j + sPath i j = pows i j .snd + + -- the path we get from our assumptions spelled out and cleaned up + assumPath : i j + r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) + r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) + assumPath i j = + r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) + + ≡⟨ cong (r i · f j ^ m ·_) (sym (·-of-^-is-^-of-+ _ _ _)) + + r i · f j ^ m · ((f i · f j) ^ m · (f i · f j) ^ l i j) + + ≡⟨ solve! R' + + (f i · f j) ^ l i j · r i · f j ^ m · (f i · f j) ^ m + + ≡⟨ cong a a · r i · f j ^ m · (f i · f j) ^ m) (sym (sPath i j)) + + s i j · r i · f j ^ m · (f i · f j) ^ m + + ≡⟨ sIsAnn i j + + s i j · r j · f i ^ m · (f i · f j) ^ m - ≡⟨ cong a a · r j · f i ^ m · (f i · f j) ^ m) (sPath i j) + ≡⟨ cong a a · r j · f i ^ m · (f i · f j) ^ m) (sPath i j) - (f i · f j) ^ l i j · r j · f i ^ m · (f i · f j) ^ m + (f i · f j) ^ l i j · r j · f i ^ m · (f i · f j) ^ m - ≡⟨ sym (solve! R') + ≡⟨ sym (solve! R') - r j · f i ^ m · ((f i · f j) ^ m · (f i · f j) ^ l i j) + r j · f i ^ m · ((f i · f j) ^ m · (f i · f j) ^ l i j) - ≡⟨ cong (r j · f i ^ m ·_) (·-of-^-is-^-of-+ _ _ _) + ≡⟨ cong (r j · f i ^ m ·_) (·-of-^-is-^-of-+ _ _ _) - r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) + r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) - paths : i j r i · f j ^ m · (f i · f j) ^ (m +ℕ k) - r j · f i ^ m · (f i · f j) ^ (m +ℕ k) - paths i j = - r i · f j ^ m · (f i · f j) ^ (m +ℕ k) + paths : i j r i · f j ^ m · (f i · f j) ^ (m +ℕ k) + r j · f i ^ m · (f i · f j) ^ (m +ℕ k) + paths i j = + r i · f j ^ m · (f i · f j) ^ (m +ℕ k) - ≡⟨ cong x r i · f j ^ m · (f i · f j) ^ (m +ℕ x)) - (sym (≤-∸-+-cancel (l≤k i j))) + ≡⟨ cong x r i · f j ^ m · (f i · f j) ^ (m +ℕ x)) + (sym (≤-∸-+-cancel (l≤k i j))) - r i · f j ^ m · (f i · f j) ^ (m +ℕ (k l i j +ℕ l i j)) + r i · f j ^ m · (f i · f j) ^ (m +ℕ (k l i j +ℕ l i j)) - ≡⟨ cong x r i · f j ^ m · (f i · f j) ^ x) - (cong (m +ℕ_) (+ℕ-comm _ _) +ℕ-assoc _ _ _) + ≡⟨ cong x r i · f j ^ m · (f i · f j) ^ x) + (cong (m +ℕ_) (+ℕ-comm _ _) +ℕ-assoc _ _ _) - r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j +ℕ (k l i j)) + r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j +ℕ (k l i j)) - ≡⟨ cong (r i · f j ^ m ·_) (sym (·-of-^-is-^-of-+ _ _ _)) + ≡⟨ cong (r i · f j ^ m ·_) (sym (·-of-^-is-^-of-+ _ _ _)) - r i · f j ^ m · ((f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j)) + r i · f j ^ m · ((f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j)) - ≡⟨ ·Assoc _ _ _ + ≡⟨ ·Assoc _ _ _ - r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j) + r i · f j ^ m · (f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j) - ≡⟨ cong ( (f i · f j) ^ (k l i j)) (assumPath i j) + ≡⟨ cong ( (f i · f j) ^ (k l i j)) (assumPath i j) - r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j) + r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j) - ≡⟨ sym (·Assoc _ _ _) + ≡⟨ sym (·Assoc _ _ _) - r j · f i ^ m · ((f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j)) + r j · f i ^ m · ((f i · f j) ^ (m +ℕ l i j) · (f i · f j) ^ (k l i j)) - ≡⟨ cong (r j · f i ^ m ·_) (·-of-^-is-^-of-+ _ _ _) + ≡⟨ cong (r j · f i ^ m ·_) (·-of-^-is-^-of-+ _ _ _) - r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j +ℕ (k l i j)) + r j · f i ^ m · (f i · f j) ^ (m +ℕ l i j +ℕ (k l i j)) - ≡⟨ cong x r j · f i ^ m · (f i · f j) ^ x) - (sym (+ℕ-assoc _ _ _) cong (m +ℕ_) (+ℕ-comm _ _)) + ≡⟨ cong x r j · f i ^ m · (f i · f j) ^ x) + (sym (+ℕ-assoc _ _ _) cong (m +ℕ_) (+ℕ-comm _ _)) - r j · f i ^ m · (f i · f j) ^ (m +ℕ (k l i j +ℕ l i j)) + r j · f i ^ m · (f i · f j) ^ (m +ℕ (k l i j +ℕ l i j)) - ≡⟨ cong x r j · f i ^ m · (f i · f j) ^ (m +ℕ x)) - (≤-∸-+-cancel (l≤k i j)) + ≡⟨ cong x r j · f i ^ m · (f i · f j) ^ (m +ℕ x)) + (≤-∸-+-cancel (l≤k i j)) - r j · f i ^ m · (f i · f j) ^ (m +ℕ k) + r j · f i ^ m · (f i · f j) ^ (m +ℕ k) - -- this will do all the heavy lifting - equalizerLemma : 1r ⟨f₀,⋯,fₙ⟩ - (x : (i : Fin (suc n)) R[1/ f i ]) -- s.t. - (∀ i j χˡ i j .fst (x i) χʳ i j .fst (x j)) - ∃![ y R ] (∀ i y /1ˢ x i) - equalizerLemma 1∈⟨f₀,⋯,fₙ⟩ = χ≡PropElim isProp∃! baseCase - where - baseCase : (r : FinVec R (suc n)) (m l : ) - (∀ i j r i · f j ^ m · (f i · f j) ^ l r j · f i ^ m · (f i · f j) ^ l) - ∃![ y R ] (∀ i y /1ˢ [ r i , f i ^ m , m , refl ∣₁ ]) - baseCase r m l <Paths = PT.rec isProp∃! Σhelper (GeneratingPowers.thm R' 2m+l _ _ 1∈⟨f₀,⋯,fₙ⟩) - where - -- critical exponent - 2m+l = m +ℕ (m +ℕ l) + -- this will do all the heavy lifting + equalizerLemma : 1r ⟨f₀,⋯,fₙ⟩ + (x : (i : Fin n) R[1/ f i ]) -- s.t. + (∀ i j χˡ i j .fst (x i) χʳ i j .fst (x j)) + ∃![ y R ] (∀ i y /1ˢ x i) + equalizerLemma 1∈⟨f₀,⋯,fₙ⟩ = χ≡PropElim isProp∃! baseCase + where + baseCase : (r : FinVec R n) (m l : ) + (∀ i j r i · f j ^ m · (f i · f j) ^ l r j · f i ^ m · (f i · f j) ^ l) + ∃![ y R ] (∀ i y /1ˢ [ r i , f i ^ m , m , refl ∣₁ ]) + baseCase r m l <Paths = PT.rec isProp∃! Σhelper (GeneratingPowers.thm R' 2m+l _ _ 1∈⟨f₀,⋯,fₙ⟩) + where + -- critical exponent + 2m+l = m +ℕ (m +ℕ l) - f²ᵐ⁺ˡ : FinVec R (suc n) - f²ᵐ⁺ˡ i = f i ^ 2m+l + f²ᵐ⁺ˡ : FinVec R n + f²ᵐ⁺ˡ i = f i ^ 2m+l - Σhelper : Σ[ α FinVec R (suc n) ] 1r linearCombination R' α f²ᵐ⁺ˡ - ∃![ y R ] (∀ i y /1ˢ [ r i , f i ^ m , m , refl ∣₁ ]) - Σhelper (α , linCombi) = (z , z≡r/fᵐ) - , λ y' Σ≡Prop _ isPropΠ _ squash/ _ _)) (unique _ (y' .snd)) - where - z = λ i α i · r i · f i ^ (m +ℕ l) + Σhelper : Σ[ α FinVec R n ] 1r linearCombination R' α f²ᵐ⁺ˡ + ∃![ y R ] (∀ i y /1ˢ [ r i , f i ^ m , m , refl ∣₁ ]) + Σhelper (α , linCombi) = (z , z≡r/fᵐ) + , λ y' Σ≡Prop _ isPropΠ _ squash/ _ _)) (unique _ (y' .snd)) + where + z = λ i α i · r i · f i ^ (m +ℕ l) - z≡r/fᵐ : i (z /1ˢ) [ r i , f i ^ m , m , refl ∣₁ ] - z≡r/fᵐ i = eq/ _ _ ((f i ^ (m +ℕ l) , m +ℕ l , refl ∣₁) , path) - where - useSolver1 : a b c d e g (a · b) · (c · d · (e · g)) · a - c · (d · a · (b · g)) · (a · e) - useSolver1 a b c d e g = solve! R' + z≡r/fᵐ : i (z /1ˢ) [ r i , f i ^ m , m , refl ∣₁ ] + z≡r/fᵐ i = eq/ _ _ ((f i ^ (m +ℕ l) , m +ℕ l , refl ∣₁) , path) + where + useSolver1 : a b c d e g (a · b) · (c · d · (e · g)) · a + c · (d · a · (b · g)) · (a · e) + useSolver1 a b c d e g = solve! R' - useSolver2 : a b c d e g a · (b · c · (d · e)) · (g · c) - (g · d) · b · (a · (c · (c · e))) - useSolver2 a b c d e g = solve! R' + useSolver2 : a b c d e g a · (b · c · (d · e)) · (g · c) + (g · d) · b · (a · (c · (c · e))) + useSolver2 a b c d e g = solve! R' - path : f i ^ (m +ℕ l) · z · f i ^ m f i ^ (m +ℕ l) · r i · 1r - path = - f i ^ (m +ℕ l) · z · f i ^ m + path : f i ^ (m +ℕ l) · z · f i ^ m f i ^ (m +ℕ l) · r i · 1r + path = + f i ^ (m +ℕ l) · z · f i ^ m - ≡⟨ cong ( f i ^ m) (∑Mulrdist _ _) + ≡⟨ cong ( f i ^ m) (∑Mulrdist _ _) - ( λ j f i ^ (m +ℕ l) · (α j · r j · f j ^ (m +ℕ l))) · f i ^ m + ( λ j f i ^ (m +ℕ l) · (α j · r j · f j ^ (m +ℕ l))) · f i ^ m - ≡⟨ ∑Mulldist _ _ + ≡⟨ ∑Mulldist _ _ - ( λ j f i ^ (m +ℕ l) · (α j · r j · f j ^ (m +ℕ l)) · f i ^ m) + ( λ j f i ^ (m +ℕ l) · (α j · r j · f j ^ (m +ℕ l)) · f i ^ m) - ≡⟨ ∑Ext j cong₂ x y x · (α j · r j · y) · f i ^ m) - (sym (·-of-^-is-^-of-+ (f i) m l)) - (sym (·-of-^-is-^-of-+ (f j) m l))) + ≡⟨ ∑Ext j cong₂ x y x · (α j · r j · y) · f i ^ m) + (sym (·-of-^-is-^-of-+ (f i) m l)) + (sym (·-of-^-is-^-of-+ (f j) m l))) - ( λ j (f i ^ m · f i ^ l) · (α j · r j · (f j ^ m · f j ^ l)) · f i ^ m) + ( λ j (f i ^ m · f i ^ l) · (α j · r j · (f j ^ m · f j ^ l)) · f i ^ m) - ≡⟨ ∑Ext j useSolver1 (f i ^ m) (f i ^ l) (α j) (r j) (f j ^ m) (f j ^ l)) + ≡⟨ ∑Ext j useSolver1 (f i ^ m) (f i ^ l) (α j) (r j) (f j ^ m) (f j ^ l)) - ( λ j α j · (r j · f i ^ m · (f i ^ l · f j ^ l)) · (f i ^ m · f j ^ m)) + ( λ j α j · (r j · f i ^ m · (f i ^ l · f j ^ l)) · (f i ^ m · f j ^ m)) - ≡⟨ ∑Ext j cong₂ x y α j · (r j · f i ^ m · x) · y) - (sym (^-ldist-· (f i) (f j) l)) - (sym (^-ldist-· (f i) (f j) m))) + ≡⟨ ∑Ext j cong₂ x y α j · (r j · f i ^ m · x) · y) + (sym (^-ldist-· (f i) (f j) l)) + (sym (^-ldist-· (f i) (f j) m))) - ( λ j α j · (r j · f i ^ m · (f i · f j) ^ l) · (f i · f j) ^ m) + ( λ j α j · (r j · f i ^ m · (f i · f j) ^ l) · (f i · f j) ^ m) - ≡⟨ ∑Ext j cong x α j · x · (f i · f j) ^ m) (sym (<Paths i j))) + ≡⟨ ∑Ext j cong x α j · x · (f i · f j) ^ m) (sym (<Paths i j))) - ( λ j α j · (r i · f j ^ m · (f i · f j) ^ l) · (f i · f j) ^ m) + ( λ j α j · (r i · f j ^ m · (f i · f j) ^ l) · (f i · f j) ^ m) - ≡⟨ ∑Ext j cong₂ x y α j · (r i · f j ^ m · x) · y) - (^-ldist-· (f i) (f j) l) - (^-ldist-· (f i) (f j) m)) + ≡⟨ ∑Ext j cong₂ x y α j · (r i · f j ^ m · x) · y) + (^-ldist-· (f i) (f j) l) + (^-ldist-· (f i) (f j) m)) - ( λ j α j · (r i · f j ^ m · (f i ^ l · f j ^ l)) · (f i ^ m · f j ^ m)) + ( λ j α j · (r i · f j ^ m · (f i ^ l · f j ^ l)) · (f i ^ m · f j ^ m)) - ≡⟨ ∑Ext j useSolver2 (α j) (r i) (f j ^ m) (f i ^ l) (f j ^ l) (f i ^ m)) + ≡⟨ ∑Ext j useSolver2 (α j) (r i) (f j ^ m) (f i ^ l) (f j ^ l) (f i ^ m)) - ( λ j (f i ^ m · f i ^ l) · r i · (α j · (f j ^ m · (f j ^ m · f j ^ l)))) + ( λ j (f i ^ m · f i ^ l) · r i · (α j · (f j ^ m · (f j ^ m · f j ^ l)))) - ≡⟨ sym (∑Mulrdist _ _) + ≡⟨ sym (∑Mulrdist _ _) - (f i ^ m · f i ^ l) · r i · ( λ j α j · (f j ^ m · (f j ^ m · f j ^ l))) + (f i ^ m · f i ^ l) · r i · ( λ j α j · (f j ^ m · (f j ^ m · f j ^ l))) - ≡⟨ cong₂ x y (x · r i) · y) - (·-of-^-is-^-of-+ (f i) m l) - (∑Ext j cong (α j ·_) - (cong (f j ^ m ·_) (·-of-^-is-^-of-+ (f j) m l) - (·-of-^-is-^-of-+ (f j) m (m +ℕ l))))) + ≡⟨ cong₂ x y (x · r i) · y) + (·-of-^-is-^-of-+ (f i) m l) + (∑Ext j cong (α j ·_) + (cong (f j ^ m ·_) (·-of-^-is-^-of-+ (f j) m l) + (·-of-^-is-^-of-+ (f j) m (m +ℕ l))))) - f i ^ (m +ℕ l) · r i · ( λ j α j · (f j ^ 2m+l)) + f i ^ (m +ℕ l) · r i · ( λ j α j · (f j ^ 2m+l)) - ≡⟨ cong (f i ^ (m +ℕ l) · r i ·_) (sym linCombi) + ≡⟨ cong (f i ^ (m +ℕ l) · r i ·_) (sym linCombi) - f i ^ (m +ℕ l) · r i · 1r + f i ^ (m +ℕ l) · r i · 1r - unique : y (∀ i (y /1ˢ) [ r i , f i ^ m , m , refl ∣₁ ]) z y - unique y y≡r/fᵐ = equalByDifference _ _ (injectivityLemma 1∈⟨f₀,⋯,fₙ⟩ (z - y) [z-y]/1≡0) - where - [z-y]/1≡0 : i (z - y) /1ˢ 0at i - [z-y]/1≡0 i = - (z - y) /1ˢ + unique : y (∀ i (y /1ˢ) [ r i , f i ^ m , m , refl ∣₁ ]) z y + unique y y≡r/fᵐ = equalByDifference _ _ (injectivityLemma 1∈⟨f₀,⋯,fₙ⟩ (z - y) [z-y]/1≡0) + where + [z-y]/1≡0 : i (z - y) /1ˢ 0at i + [z-y]/1≡0 i = + (z - y) /1ˢ - ≡⟨ U./1AsCommRingHom i .snd .pres+ _ _ -- (-a)/1=-(a/1) by refl + ≡⟨ U./1AsCommRingHom i .snd .pres+ _ _ -- (-a)/1=-(a/1) by refl - z /1ˢ - y /1ˢ + z /1ˢ - y /1ˢ - ≡⟨ cong₂ (_-_) (z≡r/fᵐ i) (y≡r/fᵐ i) + ≡⟨ cong₂ (_-_) (z≡r/fᵐ i) (y≡r/fᵐ i) - [ r i , f i ^ m , m , refl ∣₁ ] - [ r i , f i ^ m , m , refl ∣₁ ] + [ r i , f i ^ m , m , refl ∣₁ ] - [ r i , f i ^ m , m , refl ∣₁ ] - ≡⟨ +InvR ([ r i , f i ^ m , m , refl ∣₁ ]) + ≡⟨ +InvR ([ r i , f i ^ m , m , refl ∣₁ ]) - 0at i - where - instance _ = L.S⁻¹RAsCommRing i .snd - open IsRingHom + 0at i + where + instance _ = L.S⁻¹RAsCommRing i .snd + open IsRingHom -{- +{- Putting everything together with the limit machinery: If ⟨ f₁ , ... , fₙ ⟩ = R, then R = lim { R[1/fᵢ] → R[1/fᵢfⱼ] ← R[1/fⱼ] } -} - open Category (CommRingsCategory {}) - open Cone - open Functor - - locDiagram : Functor (DLShfDiag (suc n) ) CommRingsCategory - F-ob locDiagram (sing i) = R[1/ f i ]AsCommRing - F-ob locDiagram (pair i j _) = R[1/ f i · f j ]AsCommRing - F-hom locDiagram idAr = idCommRingHom _ - F-hom locDiagram singPairL = χˡ _ _ - F-hom locDiagram singPairR = χʳ _ _ - F-id locDiagram = refl - F-seq locDiagram idAr _ = sym (⋆IdL _) - F-seq locDiagram singPairL idAr = sym (⋆IdR _) - F-seq locDiagram singPairR idAr = sym (⋆IdR _) - - locCone : Cone locDiagram R' - coneOut locCone (sing i) = U./1AsCommRingHom i - coneOut locCone (pair i j _) = UP./1AsCommRingHom i j - coneOutCommutes locCone idAr = ⋆IdR _ - coneOutCommutes locCone singPairL = RingHom≡ (χˡUnique _ _ .fst .snd) - coneOutCommutes locCone singPairR = RingHom≡ (χʳUnique _ _ .fst .snd) - - isLimConeLocCone : 1r ⟨f₀,⋯,fₙ⟩ isLimCone _ _ locCone - isLimConeLocCone 1∈⟨f₀,⋯,fₙ⟩ A' cᴬ = (ψ , isConeMorψ) , ψUniqueness - where - A = fst A' - instance - _ = snd A' - - φ : (i : Fin (suc n)) CommRingHom A' R[1/ f i ]AsCommRing - φ i = cᴬ .coneOut (sing i) - - applyEqualizerLemma : a ∃![ r R ] i r /1ˢ φ i .fst a - applyEqualizerLemma a = equalizerLemma 1∈⟨f₀,⋯,fₙ⟩ i φ i .fst a) (χ≡Elim<Only _ χφSquare<) - where - χφSquare< : i j i < j χˡ i j .fst (φ i .fst a) χʳ i j .fst (φ j .fst a) - χφSquare< i j i<j = - χˡ i j .fst (φ i .fst a) ≡⟨ cong (_$r a) (cᴬ .coneOutCommutes singPairL) - cᴬ .coneOut (pair i j i<j) .fst a ≡⟨ cong (_$r a) (sym (cᴬ .coneOutCommutes singPairR)) - χʳ i j .fst (φ j .fst a) - - - ψ : CommRingHom A' R' - fst ψ a = applyEqualizerLemma a .fst .fst - snd ψ = makeIsRingHom - (cong fst (applyEqualizerLemma 1r .snd (1r , 1Coh))) - x y cong fst (applyEqualizerLemma (x + y) .snd (_ , +Coh x y))) - λ x y cong fst (applyEqualizerLemma (x · y) .snd (_ , ·Coh x y)) - where - open IsRingHom - 1Coh : i (1r /1ˢ φ i .fst 1r) - 1Coh i = sym (φ i .snd .pres1) - - +Coh : x y i ((fst ψ x + fst ψ y) /1ˢ φ i .fst (x + y)) - +Coh x y i = let instance _ = snd R[1/ f i ]AsCommRing in - U./1AsCommRingHom i .snd .pres+ _ _ - ∙∙ cong₂ _+_ (applyEqualizerLemma x .fst .snd i) (applyEqualizerLemma y .fst .snd i) - ∙∙ sym (φ i .snd .pres+ x y) - - ·Coh : x y i ((fst ψ x · fst ψ y) /1ˢ φ i .fst (x · y)) - ·Coh x y i = let instance _ = snd R[1/ f i ]AsCommRing in - U./1AsCommRingHom i .snd .pres· _ _ - ∙∙ cong₂ _·_ (applyEqualizerLemma x .fst .snd i) (applyEqualizerLemma y .fst .snd i) - ∙∙ sym (φ i .snd .pres· x y) - - -- TODO: Can you use lemma from other PR to eliminate pair case - isConeMorψ : isConeMor cᴬ locCone ψ - isConeMorψ (sing i) = RingHom≡ (funExt a applyEqualizerLemma a .fst .snd i)) - isConeMorψ (pair i j i<j) = - ψ UP./1AsCommRingHom i j ≡⟨ cong (ψ ⋆_) (sym (RingHom≡ (χˡUnique _ _ .fst .snd))) - ψ U./1AsCommRingHom i χˡ i j ≡⟨ sym (⋆Assoc _ _ _) - (ψ U./1AsCommRingHom i) χˡ i j ≡⟨ cong (_⋆ χˡ i j) (isConeMorψ (sing i)) - φ i χˡ i j ≡⟨ coneOutCommutes cᴬ singPairL - coneOut cᴬ (pair i j i<j) - - ψUniqueness : (y : Σ[ θ CommRingHom A' R' ] isConeMor cᴬ locCone θ) (ψ , isConeMorψ) y - ψUniqueness (θ , isConeMorθ) = Σ≡Prop _ isPropIsConeMor _ _ _) - (RingHom≡ (funExt λ a cong fst (applyEqualizerLemma a .snd (θtriple a)))) - where - θtriple : (a : A) Σ[ x R ] i x /1ˢ φ i .fst a - θtriple a = fst θ a , λ i cong (_$r a) (isConeMorθ (sing i)) + open Category (CommRingsCategory {}) + open Cone + open Functor + + locDiagram : Functor (DLShfDiag n ) CommRingsCategory + F-ob locDiagram (sing i) = R[1/ f i ]AsCommRing + F-ob locDiagram (pair i j _) = R[1/ f i · f j ]AsCommRing + F-hom locDiagram idAr = idCommRingHom _ + F-hom locDiagram singPairL = χˡ _ _ + F-hom locDiagram singPairR = χʳ _ _ + F-id locDiagram = refl + F-seq locDiagram idAr _ = sym (⋆IdL _) + F-seq locDiagram singPairL idAr = sym (⋆IdR _) + F-seq locDiagram singPairR idAr = sym (⋆IdR _) + + locCone : Cone locDiagram R' + coneOut locCone (sing i) = U./1AsCommRingHom i + coneOut locCone (pair i j _) = UP./1AsCommRingHom i j + coneOutCommutes locCone idAr = ⋆IdR _ + coneOutCommutes locCone singPairL = RingHom≡ (χˡUnique _ _ .fst .snd) + coneOutCommutes locCone singPairR = RingHom≡ (χʳUnique _ _ .fst .snd) + + isLimConeLocCone : 1r ⟨f₀,⋯,fₙ⟩ isLimCone _ _ locCone + isLimConeLocCone 1∈⟨f₀,⋯,fₙ⟩ A' cᴬ = (ψ , isConeMorψ) , ψUniqueness + where + A = fst A' + instance + _ = snd A' + + φ : (i : Fin n) CommRingHom A' R[1/ f i ]AsCommRing + φ i = cᴬ .coneOut (sing i) + + applyEqualizerLemma : a ∃![ r R ] i r /1ˢ φ i .fst a + applyEqualizerLemma a = equalizerLemma 1∈⟨f₀,⋯,fₙ⟩ i φ i .fst a) (χ≡Elim<Only _ χφSquare<) + where + χφSquare< : i j i < j χˡ i j .fst (φ i .fst a) χʳ i j .fst (φ j .fst a) + χφSquare< i j i<j = + χˡ i j .fst (φ i .fst a) ≡⟨ cong (_$r a) (cᴬ .coneOutCommutes singPairL) + cᴬ .coneOut (pair i j i<j) .fst a ≡⟨ cong (_$r a) (sym (cᴬ .coneOutCommutes singPairR)) + χʳ i j .fst (φ j .fst a) + + + ψ : CommRingHom A' R' + fst ψ a = applyEqualizerLemma a .fst .fst + snd ψ = makeIsRingHom + (cong fst (applyEqualizerLemma 1r .snd (1r , 1Coh))) + x y cong fst (applyEqualizerLemma (x + y) .snd (_ , +Coh x y))) + λ x y cong fst (applyEqualizerLemma (x · y) .snd (_ , ·Coh x y)) + where + open IsRingHom + 1Coh : i (1r /1ˢ φ i .fst 1r) + 1Coh i = sym (φ i .snd .pres1) + + +Coh : x y i ((fst ψ x + fst ψ y) /1ˢ φ i .fst (x + y)) + +Coh x y i = let instance _ = snd R[1/ f i ]AsCommRing in + U./1AsCommRingHom i .snd .pres+ _ _ + ∙∙ cong₂ _+_ (applyEqualizerLemma x .fst .snd i) (applyEqualizerLemma y .fst .snd i) + ∙∙ sym (φ i .snd .pres+ x y) + + ·Coh : x y i ((fst ψ x · fst ψ y) /1ˢ φ i .fst (x · y)) + ·Coh x y i = let instance _ = snd R[1/ f i ]AsCommRing in + U./1AsCommRingHom i .snd .pres· _ _ + ∙∙ cong₂ _·_ (applyEqualizerLemma x .fst .snd i) (applyEqualizerLemma y .fst .snd i) + ∙∙ sym (φ i .snd .pres· x y) + + -- TODO: Can you use lemma from other PR to eliminate pair case + isConeMorψ : isConeMor cᴬ locCone ψ + isConeMorψ (sing i) = RingHom≡ (funExt a applyEqualizerLemma a .fst .snd i)) + isConeMorψ (pair i j i<j) = + ψ UP./1AsCommRingHom i j ≡⟨ cong (ψ ⋆_) (sym (RingHom≡ (χˡUnique _ _ .fst .snd))) + ψ U./1AsCommRingHom i χˡ i j ≡⟨ sym (⋆Assoc _ _ _) + (ψ U./1AsCommRingHom i) χˡ i j ≡⟨ cong (_⋆ χˡ i j) (isConeMorψ (sing i)) + φ i χˡ i j ≡⟨ coneOutCommutes cᴬ singPairL + coneOut cᴬ (pair i j i<j) + + ψUniqueness : (y : Σ[ θ CommRingHom A' R' ] isConeMor cᴬ locCone θ) (ψ , isConeMorψ) y + ψUniqueness (θ , isConeMorθ) = Σ≡Prop _ isPropIsConeMor _ _ _) + (RingHom≡ (funExt λ a cong fst (applyEqualizerLemma a .snd (θtriple a)))) + where + θtriple : (a : A) Σ[ x R ] i x /1ˢ φ i .fst a + θtriple a = fst θ a , λ i cong (_$r a) (isConeMorθ (sing i)) \ No newline at end of file diff --git a/Cubical.Algebra.CommRing.Localisation.PullbackSquare.html b/Cubical.Algebra.CommRing.Localisation.PullbackSquare.html index 013c98d1b5..9023a6cf42 100644 --- a/Cubical.Algebra.CommRing.Localisation.PullbackSquare.html +++ b/Cubical.Algebra.CommRing.Localisation.PullbackSquare.html @@ -127,7 +127,7 @@ χ₁ = R[1/f]HasUniversalProp _ /1ᶠᵍAsCommRingHom unitHelper .fst .fst where unitHelper : s s ∈ₚ [ f ⁿ|n≥0] s /1ᶠᵍ ∈ₚ (R[1/ (f · g) ]AsCommRing) ˣ - unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᶠᵍ)) + unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᶠᵍ)) λ n [ g ^ n , (f · g) ^ n , n , refl ∣₁ ] , eq/ _ _ ((1r , powersFormMultClosedSubset (f · g) .containsOne) , path n) @@ -139,7 +139,7 @@ χ₂ = R[1/g]HasUniversalProp _ /1ᶠᵍAsCommRingHom unitHelper .fst .fst where unitHelper : s s ∈ₚ [ g ⁿ|n≥0] s /1ᶠᵍ ∈ₚ (R[1/ (f · g) ]AsCommRing) ˣ - unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᶠᵍ)) + unitHelper = powersPropElim s Units.inverseUniqueness _ (s /1ᶠᵍ)) λ n [ f ^ n , (f · g) ^ n , n , refl ∣₁ ] , eq/ _ _ ((1r , powersFormMultClosedSubset (f · g) .containsOne) , path n) diff --git a/Cubical.Algebra.ZariskiLattice.StructureSheaf.html b/Cubical.Algebra.ZariskiLattice.StructureSheaf.html index 713f7f68e2..ba09ff90ae 100644 --- a/Cubical.Algebra.ZariskiLattice.StructureSheaf.html +++ b/Cubical.Algebra.ZariskiLattice.StructureSheaf.html @@ -131,7 +131,7 @@ contrHoms f g Df≤Dg = R[1/g]HasAlgUniversalProp R[1/ f ]AsCommAlgebra λ s s∈[gⁿ|n≥0] subst-∈ₚ (R[1/ f ]AsCommRing ˣ) (sym (·IdR (s /1))) --can't apply the lemma directly as we get mult with 1 somewhere - (RadicalLemma.toUnit R' f g f∈√⟨g⟩ s s∈[gⁿ|n≥0]) + (RadicalLemma.toUnit R' f g f∈√⟨g⟩ s s∈[gⁿ|n≥0]) where open AlgLoc R' [ g ⁿ|n≥0] (powersFormMultClosedSubset g) renaming (S⁻¹RHasAlgUniversalProp to R[1/g]HasAlgUniversalProp) @@ -204,7 +204,7 @@ baseSections f = toBasisPath f 𝓞ᴮOb≡ f globalSection : 𝓞 .F-ob (D 1r) R' - globalSection = baseSections 1r invertingUnitsPath _ _ (Units.RˣContainsOne _) + globalSection = baseSections 1r invertingUnitsPath _ _ (Units.RˣContainsOne _) open SheafOnBasis ZariskiLattice (CommRingsCategory { = }) BasicOpens basicOpensAreBasis @@ -212,219 +212,200 @@ private instance _ = snd ZariskiLattice isSheaf𝓞ᴮ : isDLBasisSheaf 𝓞ᴮ - isSheaf𝓞ᴮ {n = zero} α isBO⋁α A cᴬ = uniqueExists - (isTerminal𝓞ᴮ[0] A .fst) - {(sing ()) ; (pair () _ _) }) -- the unique morphism is a cone morphism - (isPropIsConeMor _ _) - λ φ _ isTerminal𝓞ᴮ[0] A .snd φ - where - -- D(0) is not 0 of the Zariski lattice by refl! - p : 𝓞ᴮ .F-ob (0l , isBO⋁α) R[1/ 0r ]AsCommRing - p = 𝓞ᴮ .F-ob (0l , isBO⋁α) - ≡⟨ cong (𝓞ᴮ .F-ob) (Σ≡Prop _ ∈ₚ-isProp _ _) - (eq/ _ _ ((λ ()) , λ {zero 1 , ()) , 0LeftAnnihilates _ ∣₁ ∣₁ }))) - 𝓞ᴮ .F-ob (D 0r , 0r , refl ∣₁) - ≡⟨ 𝓞ᴮOb≡ 0r - R[1/ 0r ]AsCommRing - - isTerminal𝓞ᴮ[0] : isTerminal CommRingsCategory (𝓞ᴮ .F-ob (0l , isBO⋁α)) - isTerminal𝓞ᴮ[0] = subst (isTerminal CommRingsCategory) - (sym (p R[1/0]≡0)) (TerminalCommRing .snd) - - isSheaf𝓞ᴮ {n = suc n} α = curriedHelper (fst α) (snd α) - where - curriedHelper : (𝔞 : FinVec ZL (suc n)) (𝔞∈BO : i 𝔞 i ∈ₚ BasicOpens) - (⋁𝔞∈BO : 𝔞 ∈ₚ BasicOpens) - isLimCone _ _ (F-cone 𝓞ᴮ - (condCone.B⋁Cone i 𝔞 i , 𝔞∈BO i) ⋁𝔞∈BO)) - curriedHelper 𝔞 = PT.elimFin _ isPropΠ _ isPropIsLimCone _ _ _)) - λ x PT.elim _ isPropIsLimCone _ _ _) (Σhelper x) - where - Σhelper : (x : i Σ[ f R ] D f 𝔞 i) - (y : Σ[ g R ] D g 𝔞) - isLimCone _ _ (F-cone 𝓞ᴮ - (condCone.B⋁Cone i 𝔞 i , x i ∣₁) y ∣₁)) - Σhelper x y = toSheaf.toLimCone theSheafCone doubleLocAlgCone - algPaths isLimConeDoubleLocAlgCone - where - f = fst x - h = fst y - Df≡𝔞 = snd x - Dh≡⋁𝔞 = snd y - - open condCone i 𝔞 i , f i , Df≡𝔞 i ∣₁) - theSheafCone = B⋁Cone h , Dh≡⋁𝔞 ∣₁ - - DHelper : D h [ suc n , f ] --⋁ (D ∘ f) - DHelper = Dh≡⋁𝔞 ⋁Ext i sym (Df≡𝔞 i)) ⋁D≡ f - - open Exponentiation R' - open RadicalIdeal R' - open DoubleLoc R' h - open isMultClosedSubset (powersFormMultClosedSubset h) - open S⁻¹RUniversalProp R' [ h ⁿ|n≥0] (powersFormMultClosedSubset h) - open CommIdeal R[1/ h ]AsCommRing using () - renaming (CommIdeal to CommIdealₕ ; _∈_ to _∈ₕ_) - - instance - _ = snd R[1/ h ]AsCommRing - - -- crucial facts about radical ideals - h∈√⟨f⟩ : h f ⟩[ R' ] - h∈√⟨f⟩ = isEquivRel→effectiveIso ∼PropValued ∼EquivRel _ _ .fun DHelper .fst zero - - f∈√⟨h⟩ : i f i h ⟩ₛ - f∈√⟨h⟩ i = isEquivRel→effectiveIso ∼PropValued ∼EquivRel _ _ .fun - (sym DHelper) .fst i - - ff∈√⟨h⟩ : i j f i · f j h ⟩ₛ - ff∈√⟨h⟩ i j = h ⟩ₛ .snd .·Closed (f i) (f∈√⟨h⟩ j) - - f/1 : FinVec (R[1/ h ]) (suc n) - f/1 i = (f i) /1 - - 1∈⟨f/1⟩ : 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] - 1∈⟨f/1⟩ = fromFact h∈√⟨f⟩ - where - fromFact : h f ⟩[ R' ] 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] - fromFact = PT.rec isPropPropTrunc (uncurry helper1) - where - helper1 : (m : ) h ^ m f ⟩[ R' ] 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] - helper1 m = PT.map helper2 - where - helper2 : Σ[ α FinVec R (suc n) ] - h ^ m linearCombination R' α f - Σ[ β FinVec R[1/ h ] (suc n) ] - 1r linearCombination R[1/ h ]AsCommRing β f/1 - helper2 (α , hᵐ≡∑αf) = β , path - where - open Units R[1/ h ]AsCommRing - open Sum (CommRing→Ring R[1/ h ]AsCommRing) - open IsRingHom (snd /1AsCommRingHom) - open SumMap _ _ /1AsCommRingHom - instance - h⁻ᵐ : (h ^ m) /1 ∈ₚ (R[1/ h ]AsCommRing ˣ) - h⁻ᵐ = [ 1r , h ^ m , m , refl ∣₁ ] - , eq/ _ _ ((1r , containsOne) , solve! R') - - β : FinVec R[1/ h ] (suc n) - β i = ((h ^ m) /1) ⁻¹ · α i /1 - - /1Path : (h ^ m) /1 i α i /1 · f i /1) - /1Path = (h ^ m) /1 - ≡⟨ cong (_/1) hᵐ≡∑αf - (linearCombination R' α f) /1 - ≡⟨ ∑Map i α i · f i) - i (α i · f i) /1) - ≡⟨ ∑Ext i pres· (α i) (f i)) - i α i /1 · f i /1) - - path : 1r i β i · f/1 i) - path = 1r - ≡⟨ sym (·-linv ((h ^ m) /1)) - ((h ^ m) /1) ⁻¹ · (h ^ m) /1 - ≡⟨ cong (((h ^ m) /1) ⁻¹ ·_) /1Path - ((h ^ m) /1) ⁻¹ · i α i /1 · f i /1) - ≡⟨ ∑Mulrdist (((h ^ m) /1) ⁻¹) i α i /1 · f i /1) - i ((h ^ m) /1) ⁻¹ · (α i /1 · f i /1)) - ≡⟨ ∑Ext i ·Assoc (((h ^ m) /1) ⁻¹) (α i /1) (f i /1)) - i β i · f/1 i) - - - -- Putting everything together: - -- First, the diagram and limiting cone we get from our lemma - -- in Cubical.Algebra.Localisation.Limit with R=R[1/h] - -- ⟨ f₁/1 , ... , fₙ/1 ⟩ = R[1/h] - -- ⇒ R[1/h] = lim { R[1/h][1/fᵢ] → R[1/h][1/fᵢfⱼ] ← R[1/h][1/fⱼ] } - doubleLocDiag = locDiagram R[1/ h ]AsCommRing f/1 - doubleLocCone = locCone R[1/ h ]AsCommRing f/1 - isLimConeDoubleLocCone : isLimCone _ _ doubleLocCone - isLimConeDoubleLocCone = isLimConeLocCone R[1/ h ]AsCommRing f/1 1∈⟨f/1⟩ - - -- this gives a limiting cone in R-algebras via _/1/1 : R → R[1/h][1/fᵢ] - -- note that the pair case looks more complicated as - -- R[1/h][(fᵢfⱼ)/1/1] =/= R[1/h][(fᵢ/1 · fⱼ/1)/1] - -- definitionally - open Cone - open IsRingHom - - module D i = DoubleLoc R' h (f i) - - /1/1Cone : Cone doubleLocDiag R' - coneOut /1/1Cone (sing i) = D./1/1AsCommRingHom i - fst (coneOut /1/1Cone (pair i j i<j)) r = - [ [ r , 1r , 0 , refl ∣₁ ] , 1r , 0 , refl ∣₁ ] - pres0 (snd (coneOut /1/1Cone (pair i j i<j))) = refl - pres1 (snd (coneOut /1/1Cone (pair i j i<j))) = refl - pres+ (snd (coneOut /1/1Cone (pair i j i<j))) x y = - cong [_] (≡-× (cong [_] (≡-× - (cong₂ _+_ (solve! R') (solve! R')) - (Σ≡Prop _ isPropPropTrunc) (solve! R')))) - (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r)))) - pres· (snd (coneOut /1/1Cone (pair i j i<j))) x y = - cong [_] (≡-× (cong [_] (≡-× refl - (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r))))) - (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r)))) - pres- (snd (coneOut /1/1Cone (pair i j i<j))) _ = refl - coneOutCommutes /1/1Cone idAr = idCompCommRingHom _ - coneOutCommutes /1/1Cone singPairL = RingHom≡ (funExt - x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) - (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) - (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r))))) - coneOutCommutes /1/1Cone singPairR = RingHom≡ (funExt - x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) - (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) - (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r))))) - - open LimitFromCommRing R' R[1/ h ]AsCommRing (DLShfDiag (suc n) ) - doubleLocDiag doubleLocCone /1/1Cone - - -- get the desired cone in algebras: - isConeMor/1 : isConeMor /1/1Cone doubleLocCone /1AsCommRingHom - isConeMor/1 = isConeMorSingLemma /1/1Cone doubleLocCone - _ RingHom≡ (funExt _ refl))) - - doubleLocAlgCone = algCone /1AsCommRingHom isConeMor/1 - isLimConeDoubleLocAlgCone : isLimCone _ _ doubleLocAlgCone - isLimConeDoubleLocAlgCone = reflectsLimits /1AsCommRingHom isConeMor/1 - isLimConeDoubleLocCone - - -- we only give the paths on objects - -- R[1/h][1/fᵢ] ≡ [1/fᵢ] - -- R[1/h][1/fᵢfⱼ] ≡ R[1/fᵢfⱼ] - algPaths : v F-ob algDiag v F-ob (funcComp universalPShf BDiag) v - algPaths (sing i) = doubleLocCancel (f∈√⟨h⟩ i) - where - open DoubleAlgLoc R' h (f i) - algPaths (pair i j i<j) = path doubleLocCancel (ff∈√⟨h⟩ i j) - where - open DoubleAlgLoc R' h (f i · f j) - open CommAlgChar R' - - -- the naive def. - R[1/h][1/fᵢfⱼ]AsCommRingReg = InvertingElementsBase.R[1/_]AsCommRing - R[1/ h ]AsCommRing ((f i · f j) /1) - - path : toCommAlg ( F-ob doubleLocDiag (pair i j i<j) - , coneOut /1/1Cone (pair i j i<j)) - toCommAlg (R[1/h][1/fᵢfⱼ]AsCommRingReg , /1/1AsCommRingHom (f i · f j)) - path = cong toCommAlg (ΣPathP (p , q)) - where - eqInR[1/h] : (f i /1) · (f j /1) (f i · f j) /1 - eqInR[1/h] = sym (/1AsCommRingHom .snd .pres· (f i) (f j)) - - p : F-ob doubleLocDiag (pair i j i<j) R[1/h][1/fᵢfⱼ]AsCommRingReg - p i = InvertingElementsBase.R[1/_]AsCommRing R[1/ h ]AsCommRing (eqInR[1/h] i) - - q : PathP i CommRingHom R' (p i)) (coneOut /1/1Cone (pair i j i<j)) - (/1/1AsCommRingHom (f i · f j)) - q = toPathP (RingHom≡ (funExt ( - λ r cong [_] (≡-× (cong [_] (≡-× (transportRefl _ transportRefl r) - (Σ≡Prop _ isPropPropTrunc) (transportRefl 1r)))) - (Σ≡Prop _ isPropPropTrunc) (transportRefl 1r)))))) - - - -- our main result - isSheaf𝓞 : isDLSheaf _ _ 𝓞 - isSheaf𝓞 = isDLSheafDLRan _ _ isSheaf𝓞ᴮ + isSheaf𝓞ᴮ {n = n} α = curriedHelper (fst α) (snd α) + where + curriedHelper : (𝔞 : FinVec ZL n) (𝔞∈BO : i 𝔞 i ∈ₚ BasicOpens) + (⋁𝔞∈BO : 𝔞 ∈ₚ BasicOpens) + isLimCone _ _ (F-cone 𝓞ᴮ + (condCone.B⋁Cone i 𝔞 i , 𝔞∈BO i) ⋁𝔞∈BO)) + curriedHelper 𝔞 = PT.elimFin _ isPropΠ _ isPropIsLimCone _ _ _)) + λ x PT.elim _ isPropIsLimCone _ _ _) (Σhelper x) + where + Σhelper : (x : i Σ[ f R ] D f 𝔞 i) + (y : Σ[ g R ] D g 𝔞) + isLimCone _ _ (F-cone 𝓞ᴮ + (condCone.B⋁Cone i 𝔞 i , x i ∣₁) y ∣₁)) + Σhelper x y = toSheaf.toLimCone theSheafCone doubleLocAlgCone + algPaths isLimConeDoubleLocAlgCone + where + f = fst x + h = fst y + Df≡𝔞 = snd x + Dh≡⋁𝔞 = snd y + + open condCone i 𝔞 i , f i , Df≡𝔞 i ∣₁) + theSheafCone = B⋁Cone h , Dh≡⋁𝔞 ∣₁ + + DHelper : D h [ n , f ] --⋁ (D ∘ f) + DHelper = Dh≡⋁𝔞 ⋁Ext i sym (Df≡𝔞 i)) ⋁D≡ f + + open Exponentiation R' + open RadicalIdeal R' + open DoubleLoc R' h + open isMultClosedSubset (powersFormMultClosedSubset h) + open S⁻¹RUniversalProp R' [ h ⁿ|n≥0] (powersFormMultClosedSubset h) + open CommIdeal R[1/ h ]AsCommRing using () + renaming (CommIdeal to CommIdealₕ ; _∈_ to _∈ₕ_) + + instance + _ = snd R[1/ h ]AsCommRing + + -- crucial facts about radical ideals + h∈√⟨f⟩ : h f ⟩[ R' ] + h∈√⟨f⟩ = isEquivRel→effectiveIso ∼PropValued ∼EquivRel _ _ .fun DHelper .fst zero + + f∈√⟨h⟩ : i f i h ⟩ₛ + f∈√⟨h⟩ i = isEquivRel→effectiveIso ∼PropValued ∼EquivRel _ _ .fun + (sym DHelper) .fst i + + ff∈√⟨h⟩ : i j f i · f j h ⟩ₛ + ff∈√⟨h⟩ i j = h ⟩ₛ .snd .·Closed (f i) (f∈√⟨h⟩ j) + + f/1 : FinVec (R[1/ h ]) n + f/1 i = (f i) /1 + + 1∈⟨f/1⟩ : 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] + 1∈⟨f/1⟩ = fromFact h∈√⟨f⟩ + where + fromFact : h f ⟩[ R' ] 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] + fromFact = PT.rec isPropPropTrunc (uncurry helper1) + where + helper1 : (m : ) h ^ m f ⟩[ R' ] 1r ∈ₕ f/1 ⟩[ R[1/ h ]AsCommRing ] + helper1 m = PT.map helper2 + where + helper2 : Σ[ α FinVec R n ] + h ^ m linearCombination R' α f + Σ[ β FinVec R[1/ h ] n ] + 1r linearCombination R[1/ h ]AsCommRing β f/1 + helper2 (α , hᵐ≡∑αf) = β , path + where + open Units R[1/ h ]AsCommRing + open Sum (CommRing→Ring R[1/ h ]AsCommRing) + open IsRingHom (snd /1AsCommRingHom) + open SumMap _ _ /1AsCommRingHom + instance + h⁻ᵐ : (h ^ m) /1 ∈ₚ (R[1/ h ]AsCommRing ˣ) + h⁻ᵐ = [ 1r , h ^ m , m , refl ∣₁ ] + , eq/ _ _ ((1r , containsOne) , solve! R') + + β : FinVec R[1/ h ] n + β i = ((h ^ m) /1) ⁻¹ · α i /1 + + /1Path : (h ^ m) /1 i α i /1 · f i /1) + /1Path = (h ^ m) /1 + ≡⟨ cong (_/1) hᵐ≡∑αf + (linearCombination R' α f) /1 + ≡⟨ ∑Map i α i · f i) + i (α i · f i) /1) + ≡⟨ ∑Ext i pres· (α i) (f i)) + i α i /1 · f i /1) + + path : 1r i β i · f/1 i) + path = 1r + ≡⟨ sym (·-linv ((h ^ m) /1)) + ((h ^ m) /1) ⁻¹ · (h ^ m) /1 + ≡⟨ cong (((h ^ m) /1) ⁻¹ ·_) /1Path + ((h ^ m) /1) ⁻¹ · i α i /1 · f i /1) + ≡⟨ ∑Mulrdist (((h ^ m) /1) ⁻¹) i α i /1 · f i /1) + i ((h ^ m) /1) ⁻¹ · (α i /1 · f i /1)) + ≡⟨ ∑Ext i ·Assoc (((h ^ m) /1) ⁻¹) (α i /1) (f i /1)) + i β i · f/1 i) + + + -- Putting everything together: + -- First, the diagram and limiting cone we get from our lemma + -- in Cubical.Algebra.Localisation.Limit with R=R[1/h] + -- ⟨ f₁/1 , ... , fₙ/1 ⟩ = R[1/h] + -- ⇒ R[1/h] = lim { R[1/h][1/fᵢ] → R[1/h][1/fᵢfⱼ] ← R[1/h][1/fⱼ] } + doubleLocDiag = locDiagram R[1/ h ]AsCommRing f/1 + doubleLocCone = locCone R[1/ h ]AsCommRing f/1 + isLimConeDoubleLocCone : isLimCone _ _ doubleLocCone + isLimConeDoubleLocCone = isLimConeLocCone R[1/ h ]AsCommRing f/1 1∈⟨f/1⟩ + + -- this gives a limiting cone in R-algebras via _/1/1 : R → R[1/h][1/fᵢ] + -- note that the pair case looks more complicated as + -- R[1/h][(fᵢfⱼ)/1/1] =/= R[1/h][(fᵢ/1 · fⱼ/1)/1] + -- definitionally + open Cone + open IsRingHom + + module D i = DoubleLoc R' h (f i) + + /1/1Cone : Cone doubleLocDiag R' + coneOut /1/1Cone (sing i) = D./1/1AsCommRingHom i + fst (coneOut /1/1Cone (pair i j i<j)) r = + [ [ r , 1r , 0 , refl ∣₁ ] , 1r , 0 , refl ∣₁ ] + pres0 (snd (coneOut /1/1Cone (pair i j i<j))) = refl + pres1 (snd (coneOut /1/1Cone (pair i j i<j))) = refl + pres+ (snd (coneOut /1/1Cone (pair i j i<j))) x y = + cong [_] (≡-× (cong [_] (≡-× + (cong₂ _+_ (solve! R') (solve! R')) + (Σ≡Prop _ isPropPropTrunc) (solve! R')))) + (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r)))) + pres· (snd (coneOut /1/1Cone (pair i j i<j))) x y = + cong [_] (≡-× (cong [_] (≡-× refl + (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r))))) + (Σ≡Prop _ isPropPropTrunc) (sym (·IdR 1r)))) + pres- (snd (coneOut /1/1Cone (pair i j i<j))) _ = refl + coneOutCommutes /1/1Cone idAr = idCompCommRingHom _ + coneOutCommutes /1/1Cone singPairL = RingHom≡ (funExt + x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) + (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) + (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r))))) + coneOutCommutes /1/1Cone singPairR = RingHom≡ (funExt + x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) + (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) + (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r))))) + + open LimitFromCommRing R' R[1/ h ]AsCommRing (DLShfDiag n ) + doubleLocDiag doubleLocCone /1/1Cone + + -- get the desired cone in algebras: + isConeMor/1 : isConeMor /1/1Cone doubleLocCone /1AsCommRingHom + isConeMor/1 = isConeMorSingLemma /1/1Cone doubleLocCone + _ RingHom≡ (funExt _ refl))) + + doubleLocAlgCone = algCone /1AsCommRingHom isConeMor/1 + isLimConeDoubleLocAlgCone : isLimCone _ _ doubleLocAlgCone + isLimConeDoubleLocAlgCone = reflectsLimits /1AsCommRingHom isConeMor/1 + isLimConeDoubleLocCone + + -- we only give the paths on objects + -- R[1/h][1/fᵢ] ≡ [1/fᵢ] + -- R[1/h][1/fᵢfⱼ] ≡ R[1/fᵢfⱼ] + algPaths : v F-ob algDiag v F-ob (funcComp universalPShf BDiag) v + algPaths (sing i) = doubleLocCancel (f∈√⟨h⟩ i) + where + open DoubleAlgLoc R' h (f i) + algPaths (pair i j i<j) = path doubleLocCancel (ff∈√⟨h⟩ i j) + where + open DoubleAlgLoc R' h (f i · f j) + open CommAlgChar R' + + -- the naive def. + R[1/h][1/fᵢfⱼ]AsCommRingReg = InvertingElementsBase.R[1/_]AsCommRing + R[1/ h ]AsCommRing ((f i · f j) /1) + + path : toCommAlg ( F-ob doubleLocDiag (pair i j i<j) + , coneOut /1/1Cone (pair i j i<j)) + toCommAlg (R[1/h][1/fᵢfⱼ]AsCommRingReg , /1/1AsCommRingHom (f i · f j)) + path = cong toCommAlg (ΣPathP (p , q)) + where + eqInR[1/h] : (f i /1) · (f j /1) (f i · f j) /1 + eqInR[1/h] = sym (/1AsCommRingHom .snd .pres· (f i) (f j)) + + p : F-ob doubleLocDiag (pair i j i<j) R[1/h][1/fᵢfⱼ]AsCommRingReg + p i = InvertingElementsBase.R[1/_]AsCommRing R[1/ h ]AsCommRing (eqInR[1/h] i) + + q : PathP i CommRingHom R' (p i)) (coneOut /1/1Cone (pair i j i<j)) + (/1/1AsCommRingHom (f i · f j)) + q = toPathP (RingHom≡ (funExt ( + λ r cong [_] (≡-× (cong [_] (≡-× (transportRefl _ transportRefl r) + (Σ≡Prop _ isPropPropTrunc) (transportRefl 1r)))) + (Σ≡Prop _ isPropPropTrunc) (transportRefl 1r)))))) + + + -- our main result + isSheaf𝓞 : isDLSheaf _ _ 𝓞 + isSheaf𝓞 = isDLSheafDLRan _ _ isSheaf𝓞ᴮ \ No newline at end of file diff --git a/Cubical.Algebra.ZariskiLattice.StructureSheafPullback.html b/Cubical.Algebra.ZariskiLattice.StructureSheafPullback.html index f7ceb5c192..c880172a26 100644 --- a/Cubical.Algebra.ZariskiLattice.StructureSheafPullback.html +++ b/Cubical.Algebra.ZariskiLattice.StructureSheafPullback.html @@ -152,7 +152,7 @@ contrHoms 𝔞 𝔟 f g p q 𝔞≤𝔟 = R[1/g]HasAlgUniversalProp R[1/ f ]AsCommAlgebra λ s s∈[gⁿ|n≥0] subst-∈ₚ (R[1/ f ]AsCommRing ˣ) (sym (·IdR (s /1))) --can't apply the lemma directly as we get mult with 1 somewhere - (RadicalLemma.toUnit R' f g f∈√⟨g⟩ s s∈[gⁿ|n≥0]) + (RadicalLemma.toUnit R' f g f∈√⟨g⟩ s s∈[gⁿ|n≥0]) where open AlgLoc R' [ g ⁿ|n≥0] (powersFormMultClosedSubset g) renaming (S⁻¹RHasAlgUniversalProp to R[1/g]HasAlgUniversalProp) @@ -264,7 +264,7 @@ open Exponentiation R' open RadicalIdeal R' open InvertingElementsBase R' - open DoubleLoc R' h + open DoubleLoc R' h open S⁻¹RUniversalProp R' [ h ⁿ|n≥0] (powersFormMultClosedSubset h) open CommIdeal R[1/ h ]AsCommRing using () renaming (CommIdeal to CommIdealₕ ; _∈_ to _∈ₕ_) @@ -376,19 +376,19 @@ open Cospan open Pullback open RingHoms - isRHomR[1/h]→R[1/h][1/f] : theRingPullback .pbPr₂ ∘r /1AsCommRingHom /1/1AsCommRingHom f + isRHomR[1/h]→R[1/h][1/f] : theRingPullback .pbPr₂ ∘r /1AsCommRingHom /1/1AsCommRingHom f isRHomR[1/h]→R[1/h][1/f] = RingHom≡ (funExt x refl)) - isRHomR[1/h]→R[1/h][1/g] : theRingPullback .pbPr₁ ∘r /1AsCommRingHom /1/1AsCommRingHom g + isRHomR[1/h]→R[1/h][1/g] : theRingPullback .pbPr₁ ∘r /1AsCommRingHom /1/1AsCommRingHom g isRHomR[1/h]→R[1/h][1/g] = RingHom≡ (funExt x refl)) - isRHomR[1/h][1/f]→R[1/h][1/fg] : theRingCospan .s₂ ∘r /1/1AsCommRingHom f /1/1AsCommRingHomFG + isRHomR[1/h][1/f]→R[1/h][1/fg] : theRingCospan .s₂ ∘r /1/1AsCommRingHom f /1/1AsCommRingHomFG isRHomR[1/h][1/f]→R[1/h][1/fg] = RingHom≡ (funExt x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r))))) - isRHomR[1/h][1/g]→R[1/h][1/fg] : theRingCospan .s₁ ∘r /1/1AsCommRingHom g /1/1AsCommRingHomFG + isRHomR[1/h][1/g]→R[1/h][1/fg] : theRingCospan .s₁ ∘r /1/1AsCommRingHom g /1/1AsCommRingHomFG isRHomR[1/h][1/g]→R[1/h][1/fg] = RingHom≡ (funExt x cong [_] (≡-× (cong [_] (≡-× (cong (x ·_) (transportRefl 1r) ·IdR x) (Σ≡Prop _ isPropPropTrunc) (cong (1r ·_) (transportRefl 1r) ·IdR 1r)))) @@ -396,7 +396,7 @@ open PullbackFromCommRing R' theRingCospan theRingPullback - /1AsCommRingHom (/1/1AsCommRingHom f) (/1/1AsCommRingHom g) /1/1AsCommRingHomFG + /1AsCommRingHom (/1/1AsCommRingHom f) (/1/1AsCommRingHom g) /1/1AsCommRingHomFG theAlgebraCospan = algCospan isRHomR[1/h]→R[1/h][1/f] isRHomR[1/h]→R[1/h][1/g] isRHomR[1/h][1/f]→R[1/h][1/fg] @@ -426,7 +426,7 @@ R[1/h][1/fg]AsCommRing' = InvertingElementsBase.R[1/_]AsCommRing R[1/ h ]AsCommRing ((f · g) /1) path : toCommAlg (R[1/h][1/fg]AsCommRing , /1/1AsCommRingHomFG) - toCommAlg (R[1/h][1/fg]AsCommRing' , /1/1AsCommRingHom (f · g)) + toCommAlg (R[1/h][1/fg]AsCommRing' , /1/1AsCommRingHom (f · g)) path = cong toCommAlg (ΣPathP (p , q)) where eqInR[1/h] : (f /1) · (g /1) (f · g) /1 @@ -435,7 +435,7 @@ p : R[1/h][1/fg]AsCommRing R[1/h][1/fg]AsCommRing' p i = InvertingElementsBase.R[1/_]AsCommRing R[1/ h ]AsCommRing (eqInR[1/h] i) - q : PathP i CommRingHom R' (p i)) /1/1AsCommRingHomFG (/1/1AsCommRingHom (f · g)) + q : PathP i CommRingHom R' (p i)) /1/1AsCommRingHomFG (/1/1AsCommRingHom (f · g)) q = toPathP (RingHom≡ (funExt ( λ x cong [_] (≡-× (cong [_] (≡-× (transportRefl _ transportRefl x) (Σ≡Prop _ isPropPropTrunc) (transportRefl 1r)))) diff --git a/Cubical.Categories.Site.Instances.ZariskiCommRing.html b/Cubical.Categories.Site.Instances.ZariskiCommRing.html index 4dfa0c2d51..56e19362db 100644 --- a/Cubical.Categories.Site.Instances.ZariskiCommRing.html +++ b/Cubical.Categories.Site.Instances.ZariskiCommRing.html @@ -91,19 +91,19 @@ S-arr (snd (snd (covers zariskiCoverage R) um) i) = /1AsCommRingHom where open UniModVec um - open InvertingElementsBase.UniversalProp R (f i) + open InvertingElementsBase.UniversalProp R (f i) pullbackStability zariskiCoverage {c = A} um {d = B} φ = pullbackUniModVec φ um , i i , ψ i , RingHom≡ (sym (ψComm i)) ∣₁) ∣₁ where open UniModVec module A = InvertingElementsBase A module B = InvertingElementsBase B - module AU = A.UniversalProp - module BU = B.UniversalProp + module AU = A.UniversalProp + module BU = B.UniversalProp ψ : (i : Fin (um .n)) CommRingHom A.R[1/ um .f i ]AsCommRing B.R[1/ φ $r um .f i ]AsCommRing - ψ i = uniqInvElemHom φ (um .f i) .fst .fst + ψ i = uniqInvElemHom φ (um .f i) .fst .fst ψComm : i (ψ i .fst) (AU._/1 (um .f i)) (BU._/1 (φ $r um .f i)) φ .fst - ψComm i = uniqInvElemHom φ (um .f i) .fst .snd + ψComm i = uniqInvElemHom φ (um .f i) .fst .snd \ No newline at end of file diff --git a/Cubical.Papers.AffineSchemes.html b/Cubical.Papers.AffineSchemes.html index bf4e018290..fe4ba53c77 100644 --- a/Cubical.Papers.AffineSchemes.html +++ b/Cubical.Papers.AffineSchemes.html @@ -137,10 +137,10 @@ -- Lemma 3 -- 1. -open LocalizationInvEl.DoubleLoc using (R[1/fg]≡R[1/f][1/g]) +open LocalizationInvEl.DoubleLoc using (R[1/fg]≡R[1/f][1/g]) open LocalizationR-Alg.DoubleAlgLoc using (R[1/fg]≡R[1/f][1/g]) -- 2. -open LocalizationInvEl using (invertingUnitsPath) +open LocalizationInvEl using (invertingUnitsPath) -- 3. open LocalizationR-Alg.AlgLocTwoSubsets using (isContrS₁⁻¹R≡S₂⁻¹R) @@ -233,11 +233,11 @@ open StructureSheaf using (globalSection) -- Lemma 15 -open LocalizationLimit using (isLimConeLocCone) +open LocalizationLimit using (isLimConeLocCone) -- Theorem 16 open StructureSheaf using (isSheaf𝓞ᴮ) -- Corollary 17 -open StructureSheaf using (isSheaf𝓞) +open StructureSheaf using (isSheaf𝓞) \ No newline at end of file