|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Christian Merten. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Christian Merten |
| 5 | +-/ |
| 6 | +import Mathlib.RingTheory.RingHom.Smooth |
| 7 | +import Mathlib.RingTheory.RingHom.Unramified |
| 8 | + |
| 9 | +/-! |
| 10 | +# Etale ring homomorphisms |
| 11 | +
|
| 12 | +We show the meta properties of étale morphisms. |
| 13 | +-/ |
| 14 | + |
| 15 | +universe u |
| 16 | + |
| 17 | +namespace RingHom |
| 18 | + |
| 19 | +variable {R S : Type u} [CommRing R] [CommRing S] |
| 20 | + |
| 21 | +-- Note: `algebraize` currently does not work here, because it is broken mathlib wide |
| 22 | +/-- A ring hom `R →+* S` is etale, if `S` is an etale `R`-algebra. -/ |
| 23 | +@[algebraize Algebra.Etale.toAlgebra] |
| 24 | +def Etale {R S : Type u} [CommRing R] [CommRing S] (f : R →+* S) : Prop := |
| 25 | + @Algebra.Etale R _ S _ f.toAlgebra |
| 26 | + |
| 27 | +/-- Helper lemma for the `algebraize` tactic -/ |
| 28 | +lemma Etale.toAlgebra {f : R →+* S} (hf : Etale f) : |
| 29 | + @Algebra.Etale R _ S _ f.toAlgebra := hf |
| 30 | + |
| 31 | +variable {R S : Type u} [CommRing R] [CommRing S] (f : R →+* S) |
| 32 | + |
| 33 | +lemma etale_algebraMap [Algebra R S] : (algebraMap R S).Etale ↔ Algebra.Etale R S := by |
| 34 | + simp only [RingHom.Etale] |
| 35 | + congr! |
| 36 | + exact Algebra.algebra_ext _ _ fun _ ↦ rfl |
| 37 | + |
| 38 | +lemma etale_iff_formallyUnramified_and_smooth : f.Etale ↔ f.FormallyUnramified ∧ f.Smooth := by |
| 39 | + algebraize [f] |
| 40 | + simp only [Etale, Smooth, FormallyUnramified] |
| 41 | + refine ⟨fun h ↦ ⟨inferInstance, ?_⟩, fun ⟨h1, h2⟩ ↦ ⟨?_, inferInstance⟩⟩ |
| 42 | + · constructor <;> infer_instance |
| 43 | + · rw [Algebra.FormallyEtale.iff_unramified_and_smooth] |
| 44 | + constructor <;> infer_instance |
| 45 | + |
| 46 | +lemma Etale.eq_formallyUnramified_and_smooth : |
| 47 | + @Etale = fun R S (_ : CommRing R) (_ : CommRing S) f ↦ f.FormallyUnramified ∧ f.Smooth := by |
| 48 | + ext |
| 49 | + rw [etale_iff_formallyUnramified_and_smooth] |
| 50 | + |
| 51 | +lemma Etale.isStableUnderBaseChange : IsStableUnderBaseChange Etale := by |
| 52 | + rw [eq_formallyUnramified_and_smooth] |
| 53 | + exact FormallyUnramified.isStableUnderBaseChange.and Smooth.isStableUnderBaseChange |
| 54 | + |
| 55 | +lemma Etale.propertyIsLocal : PropertyIsLocal Etale := by |
| 56 | + rw [eq_formallyUnramified_and_smooth] |
| 57 | + exact FormallyUnramified.propertyIsLocal.and Smooth.propertyIsLocal |
| 58 | + |
| 59 | +lemma Etale.respectsIso : RespectsIso Etale := |
| 60 | + propertyIsLocal.respectsIso |
| 61 | + |
| 62 | +lemma Etale.ofLocalizationSpanTarget : OfLocalizationSpanTarget Etale := |
| 63 | + propertyIsLocal.ofLocalizationSpanTarget |
| 64 | + |
| 65 | +lemma Etale.ofLocalizationSpan : OfLocalizationSpan Etale := |
| 66 | + propertyIsLocal.ofLocalizationSpan |
| 67 | + |
| 68 | +lemma Etale.stableUnderComposition : StableUnderComposition Etale := by |
| 69 | + rw [eq_formallyUnramified_and_smooth] |
| 70 | + exact FormallyUnramified.stableUnderComposition.and Smooth.stableUnderComposition |
| 71 | + |
| 72 | +end RingHom |
0 commit comments