import Mathlib import Definitions.Def_AlgebraicGeometry_NeronModelPropertyBundleCarrier set_option autoImplicit false noncomputable section universe u open CategoryTheory CategoryTheory.Limits AlgebraicGeometry namespace NeronModelInfra section ValueFunctoriality variable (R K : Type u) [CommRing R] [Field K] [Algebra R K] variable {X Y Z : Scheme.{u}} theorem genericFibreRestrict_val_eq_id (f : X ⟢ Spec (CommRingCat.of R)) (Ο‡ : SchemeHomOver f f) (hΟ‡ : Ο‡.1 = πŸ™ X) : (genericFibreRestrict R K f f Ο‡).1 = πŸ™ (pullback f (specGenericFibreInclusion R K)) := by apply pullback.hom_ext Β· simp [genericFibreRestrict, hΟ‡] Β· simp [genericFibreRestrict, pullback.lift_snd] theorem genericFibreRestrict_val_eq_comp (f : X ⟢ Spec (CommRingCat.of R)) (g : Y ⟢ Spec (CommRingCat.of R)) (e : Z ⟢ Spec (CommRingCat.of R)) (Ο† : SchemeHomOver g f) (ψ : SchemeHomOver f e) (Ο‡ : SchemeHomOver g e) (hΟ‡ : Ο‡.1 = Ο†.1 ≫ ψ.1) : (genericFibreRestrict R K e g Ο‡).1 = (genericFibreRestrict R K f g Ο†).1 ≫ (genericFibreRestrict R K e f ψ).1 := by apply pullback.hom_ext Β· simp [genericFibreRestrict, hΟ‡, pullback.lift_fst, pullback.lift_fst_assoc] Β· simp [genericFibreRestrict, pullback.lift_snd] end ValueFunctoriality section MinimalModelLemma variable (R K : Type u) [CommRing R] [Field K] [Algebra R K] variable {X : Scheme.{u}} theorem neronModel_end_eq_id_of_restrict_val_eq_id (f : X ⟢ Spec (CommRingCat.of R)) (hN : NeronUniqueExtension R K f) (hsf : Smooth f) (w : SchemeHomOver f f) (hw : (genericFibreRestrict R K f f w).1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) : w.1 = πŸ™ X := by have hres : genericFibreRestrict R K f f w = genericFibreRestrict R K f f βŸ¨πŸ™ X, Category.id_comp f⟩ := by apply Subtype.ext rw [hw, genericFibreRestrict_val_eq_id R K f βŸ¨πŸ™ X, Category.id_comp f⟩ rfl] have hwid : w = (βŸ¨πŸ™ X, Category.id_comp f⟩ : SchemeHomOver f f) := (hN X f hsf).1 hres exact congrArg Subtype.val hwid end MinimalModelLemma section TwoModels variable {R K : Type u} [CommRing R] [Field K] [Algebra R K] variable {X X' : Scheme.{u}} theorem neronTwoModels_extension_unique {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) {u₁ uβ‚‚ : SchemeHomOver f f'} (h : genericFibreRestrict R K f' f u₁ = genericFibreRestrict R K f' f uβ‚‚) : u₁ = uβ‚‚ := (hNf' X f hsf).1 h theorem neronTwoModels_existsUnique_homExtension {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) : βˆƒ! u : SchemeHomOver f f', genericFibreRestrict R K f' f u = uK := (hNf' X f hsf).existsUnique uK theorem neronTwoModels_comp_eq_id {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf : NeronUniqueExtension R K f) (hsf : Smooth f) {uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))} {vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))} (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) {u : SchemeHomOver f f'} {v : SchemeHomOver f' f} (hu : genericFibreRestrict R K f' f u = uK) (hv : genericFibreRestrict R K f f' v = vK) : u.1 ≫ v.1 = πŸ™ X := by have hcomp : (u.1 ≫ v.1) ≫ f = f := by rw [Category.assoc, v.2, u.2] have hval : (genericFibreRestrict R K f f ⟨u.1 ≫ v.1, hcomp⟩).1 = πŸ™ (pullback f (specGenericFibreInclusion R K)) := by rw [genericFibreRestrict_val_eq_comp R K f' f f u v ⟨u.1 ≫ v.1, hcomp⟩ rfl, hu, hv] exact huv exact neronModel_end_eq_id_of_restrict_val_eq_id R K f hNf hsf ⟨u.1 ≫ v.1, hcomp⟩ hval theorem neronTwoModels_exists_isoExtension {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf : NeronUniqueExtension R K f) (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) (hsf' : Smooth f') (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) : βˆƒ (u : SchemeHomOver f f') (v : SchemeHomOver f' f), genericFibreRestrict R K f' f u = uK ∧ genericFibreRestrict R K f f' v = vK ∧ u.1 ≫ v.1 = πŸ™ X ∧ v.1 ≫ u.1 = πŸ™ X' := by obtain ⟨u, hu⟩ := (hNf' X f hsf).2 uK obtain ⟨v, hv⟩ := (hNf X' f' hsf').2 vK exact ⟨u, v, hu, hv, neronTwoModels_comp_eq_id hNf hsf huv hu hv, neronTwoModels_comp_eq_id hNf' hsf' hvu hv hu⟩ theorem neronTwoModels_existsUnique_isoExtension {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf : NeronUniqueExtension R K f) (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) (hsf' : Smooth f') (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) : βˆƒ! u : SchemeHomOver f f', genericFibreRestrict R K f' f u = uK ∧ βˆƒ v : SchemeHomOver f' f, genericFibreRestrict R K f f' v = vK ∧ u.1 ≫ v.1 = πŸ™ X ∧ v.1 ≫ u.1 = πŸ™ X' := by obtain ⟨u, v, hu, hv, huvId, hvuId⟩ := neronTwoModels_exists_isoExtension hNf hNf' hsf hsf' uK vK huv hvu refine ⟨u, ⟨hu, v, hv, huvId, hvuId⟩, ?_⟩ rintro uβ‚‚ ⟨huβ‚‚, -⟩ exact neronTwoModels_extension_unique hNf' hsf (huβ‚‚.trans hu.symm) theorem neronTwoModels_isoExtension_isIso {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf : NeronUniqueExtension R K f) (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) (hsf' : Smooth f') {uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))} (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) {u : SchemeHomOver f f'} (hu : genericFibreRestrict R K f' f u = uK) : IsIso u.1 := by obtain ⟨v, hv⟩ := (hNf X' f' hsf').2 vK exact ⟨⟨v.1, neronTwoModels_comp_eq_id hNf hsf huv hu hv, neronTwoModels_comp_eq_id hNf' hsf' hvu hv hu⟩⟩ theorem neronTwoModels_existsUnique_isoExtension_of_isIso {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} (hNf : NeronUniqueExtension R K f) (hNf' : NeronUniqueExtension R K f') (hsf : Smooth f) (hsf' : Smooth f') (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) [IsIso uK.1] : βˆƒ! u : SchemeHomOver f f', genericFibreRestrict R K f' f u = uK ∧ βˆƒ v : SchemeHomOver f' f, (genericFibreRestrict R K f f' v).1 = inv uK.1 ∧ u.1 ≫ v.1 = πŸ™ X ∧ v.1 ≫ u.1 = πŸ™ X' := by have hvKmem : inv uK.1 ≫ pullback.snd f (specGenericFibreInclusion R K) = pullback.snd f' (specGenericFibreInclusion R K) := (IsIso.inv_comp_eq uK.1).mpr uK.2.symm obtain ⟨u, ⟨hu, v, hv, huvId, hvuId⟩, -⟩ := neronTwoModels_existsUnique_isoExtension hNf hNf' hsf hsf' uK ⟨inv uK.1, hvKmem⟩ (IsIso.hom_inv_id uK.1) (IsIso.inv_hom_id uK.1) refine ⟨u, ⟨hu, v, congrArg Subtype.val hv, huvId, hvuId⟩, ?_⟩ rintro uβ‚‚ ⟨huβ‚‚, -⟩ exact neronTwoModels_extension_unique hNf' hsf (huβ‚‚.trans hu.symm) end TwoModels section BundleForm variable {R K : Type u} [CommRing R] [Field K] [Algebra R K] variable [IsDomain R] [IsDedekindDomain R] [IsFractionRing R K] variable {X X' : Scheme.{u}} variable {f : X ⟢ Spec (CommRingCat.of R)} {f' : X' ⟢ Spec (CommRingCat.of R)} theorem NeronModelPropertyBundle.exists_isoExtension (h : NeronModelPropertyBundle R K f) (h' : NeronModelPropertyBundle R K f') (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) : βˆƒ (u : SchemeHomOver f f') (v : SchemeHomOver f' f), genericFibreRestrict R K f' f u = uK ∧ genericFibreRestrict R K f f' v = vK ∧ u.1 ≫ v.1 = πŸ™ X ∧ v.1 ≫ u.1 = πŸ™ X' := neronTwoModels_exists_isoExtension h.neronMapping h'.neronMapping h.smooth h'.smooth uK vK huv hvu theorem NeronModelPropertyBundle.existsUnique_isoExtension (h : NeronModelPropertyBundle R K f) (h' : NeronModelPropertyBundle R K f') (uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))) (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) : βˆƒ! u : SchemeHomOver f f', genericFibreRestrict R K f' f u = uK ∧ βˆƒ v : SchemeHomOver f' f, genericFibreRestrict R K f f' v = vK ∧ u.1 ≫ v.1 = πŸ™ X ∧ v.1 ≫ u.1 = πŸ™ X' := neronTwoModels_existsUnique_isoExtension h.neronMapping h'.neronMapping h.smooth h'.smooth uK vK huv hvu theorem NeronModelPropertyBundle.isoExtension_isIso (h : NeronModelPropertyBundle R K f) (h' : NeronModelPropertyBundle R K f') {uK : SchemeHomOver (pullback.snd f (specGenericFibreInclusion R K)) (pullback.snd f' (specGenericFibreInclusion R K))} (vK : SchemeHomOver (pullback.snd f' (specGenericFibreInclusion R K)) (pullback.snd f (specGenericFibreInclusion R K))) (huv : uK.1 ≫ vK.1 = πŸ™ (pullback f (specGenericFibreInclusion R K))) (hvu : vK.1 ≫ uK.1 = πŸ™ (pullback f' (specGenericFibreInclusion R K))) {u : SchemeHomOver f f'} (hu : genericFibreRestrict R K f' f u = uK) : IsIso u.1 := neronTwoModels_isoExtension_isIso h.neronMapping h'.neronMapping h.smooth h'.smooth vK huv hvu hu end BundleForm section SatGates theorem gate_neronModel_end_eq_id_trivialGroupScheme_zp (p : β„•) [Fact p.Prime] (w : SchemeHomOver (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (πŸ™ (Spec (CommRingCat.of β„€_[p])))) (hw : (genericFibreRestrict β„€_[p] β„š_[p] (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (πŸ™ (Spec (CommRingCat.of β„€_[p]))) w).1 = πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (specGenericFibreInclusion β„€_[p] β„š_[p]))) : w.1 = πŸ™ (Spec (CommRingCat.of β„€_[p])) := neronModel_end_eq_id_of_restrict_val_eq_id β„€_[p] β„š_[p] (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).neronMapping (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).smooth w hw theorem gate_neronTwoModels_exists_isoExtension_trivialGroupScheme_zp (p : β„•) [Fact p.Prime] : βˆƒ (u v : SchemeHomOver (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (πŸ™ (Spec (CommRingCat.of β„€_[p])))), genericFibreRestrict β„€_[p] β„š_[p] (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (πŸ™ (Spec (CommRingCat.of β„€_[p]))) u = βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (specGenericFibreInclusion β„€_[p] β„š_[p])), Category.id_comp _⟩ ∧ genericFibreRestrict β„€_[p] β„š_[p] (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (πŸ™ (Spec (CommRingCat.of β„€_[p]))) v = βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (specGenericFibreInclusion β„€_[p] β„š_[p])), Category.id_comp _⟩ ∧ u.1 ≫ v.1 = πŸ™ (Spec (CommRingCat.of β„€_[p])) ∧ v.1 ≫ u.1 = πŸ™ (Spec (CommRingCat.of β„€_[p])) := neronTwoModels_exists_isoExtension (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).neronMapping (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).neronMapping (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).smooth (gate_neronModelPropertyBundle_trivialGroupScheme_zp p).smooth βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (specGenericFibreInclusion β„€_[p] β„š_[p])), Category.id_comp _⟩ βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[p]))) (specGenericFibreInclusion β„€_[p] β„š_[p])), Category.id_comp _⟩ (Category.id_comp _) (Category.id_comp _) theorem gate_neronTwoModels_existsUnique_isoExtension_trivialGroupScheme_z3 : βˆƒ! u : SchemeHomOver (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (πŸ™ (Spec (CommRingCat.of β„€_[3]))), genericFibreRestrict β„€_[3] β„š_[3] (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (πŸ™ (Spec (CommRingCat.of β„€_[3]))) u = βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (specGenericFibreInclusion β„€_[3] β„š_[3])), Category.id_comp _⟩ ∧ βˆƒ v : SchemeHomOver (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (πŸ™ (Spec (CommRingCat.of β„€_[3]))), genericFibreRestrict β„€_[3] β„š_[3] (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (πŸ™ (Spec (CommRingCat.of β„€_[3]))) v = βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (specGenericFibreInclusion β„€_[3] β„š_[3])), Category.id_comp _⟩ ∧ u.1 ≫ v.1 = πŸ™ (Spec (CommRingCat.of β„€_[3])) ∧ v.1 ≫ u.1 = πŸ™ (Spec (CommRingCat.of β„€_[3])) := neronTwoModels_existsUnique_isoExtension (gate_neronModelPropertyBundle_trivialGroupScheme_z3).neronMapping (gate_neronModelPropertyBundle_trivialGroupScheme_z3).neronMapping (gate_neronModelPropertyBundle_trivialGroupScheme_z3).smooth (gate_neronModelPropertyBundle_trivialGroupScheme_z3).smooth βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (specGenericFibreInclusion β„€_[3] β„š_[3])), Category.id_comp _⟩ βŸ¨πŸ™ (pullback (πŸ™ (Spec (CommRingCat.of β„€_[3]))) (specGenericFibreInclusion β„€_[3] β„š_[3])), Category.id_comp _⟩ (Category.id_comp _) (Category.id_comp _) end SatGates end NeronModelInfra /-- info: 'NeronModelInfra.genericFibreRestrict_val_eq_id' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.genericFibreRestrict_val_eq_id /-- info: 'NeronModelInfra.genericFibreRestrict_val_eq_comp' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.genericFibreRestrict_val_eq_comp /-- info: 'NeronModelInfra.neronModel_end_eq_id_of_restrict_val_eq_id' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronModel_end_eq_id_of_restrict_val_eq_id /-- info: 'NeronModelInfra.neronTwoModels_extension_unique' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_extension_unique /-- info: 'NeronModelInfra.neronTwoModels_existsUnique_homExtension' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_existsUnique_homExtension /-- info: 'NeronModelInfra.neronTwoModels_comp_eq_id' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_comp_eq_id /-- info: 'NeronModelInfra.neronTwoModels_exists_isoExtension' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_exists_isoExtension /-- info: 'NeronModelInfra.neronTwoModels_existsUnique_isoExtension' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_existsUnique_isoExtension /-- info: 'NeronModelInfra.neronTwoModels_isoExtension_isIso' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_isoExtension_isIso /-- info: 'NeronModelInfra.neronTwoModels_existsUnique_isoExtension_of_isIso' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.neronTwoModels_existsUnique_isoExtension_of_isIso /-- info: 'NeronModelInfra.NeronModelPropertyBundle.exists_isoExtension' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.NeronModelPropertyBundle.exists_isoExtension /-- info: 'NeronModelInfra.NeronModelPropertyBundle.existsUnique_isoExtension' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.NeronModelPropertyBundle.existsUnique_isoExtension /-- info: 'NeronModelInfra.NeronModelPropertyBundle.isoExtension_isIso' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.NeronModelPropertyBundle.isoExtension_isIso /-- info: 'NeronModelInfra.gate_neronModel_end_eq_id_trivialGroupScheme_zp' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.gate_neronModel_end_eq_id_trivialGroupScheme_zp /-- info: 'NeronModelInfra.gate_neronTwoModels_exists_isoExtension_trivialGroupScheme_zp' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.gate_neronTwoModels_exists_isoExtension_trivialGroupScheme_zp /-- info: 'NeronModelInfra.gate_neronTwoModels_existsUnique_isoExtension_trivialGroupScheme_z3' depends on axioms: [propext, Classical.choice, Quot.sound] -/ #guard_msgs in #print axioms NeronModelInfra.gate_neronTwoModels_existsUnique_isoExtension_trivialGroupScheme_z3