Theorem: AlgebraicGeometry.isIntegral_of_isOpenImmersion
File: Mathlib/AlgebraicGeometry/Properties.lean

Proof steps:
state_before: X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
⊢ IsIntegral X
state_after: case nonempty
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
⊢ autoParam (Nonempty ↑↑X.toPresheafedSpace) _auto✝

case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
⊢ autoParam (∀ (U : X.Opens) [inst : Nonempty ↑↑(↑U).toPresheafedSpace], IsDomain ↑Γ(X, U)) _auto✝
tactic: constructor
state_before: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
⊢ autoParam (∀ (U : X.Opens) [inst : Nonempty ↑↑(↑U).toPresheafedSpace], IsDomain ↑Γ(X, U)) _auto✝
state_after: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
⊢ IsDomain ↑Γ(X, U)
tactic: intro U hU
state_before: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
⊢ IsDomain ↑Γ(X, U)
state_after: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this : U = f ⁻¹ᵁ f ''ᵁ U
⊢ IsDomain ↑Γ(X, U)
tactic: have : U = f ⁻¹ᵁ f ''ᵁ U := by ext1; exact (Set.preimage_image_eq _ H.base_open.inj).symm
state_before: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this : U = f ⁻¹ᵁ f ''ᵁ U
⊢ IsDomain ↑Γ(X, U)
state_after: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this : U = f ⁻¹ᵁ f ''ᵁ U
⊢ IsDomain ↑Γ(X, f ⁻¹ᵁ f ''ᵁ U)
tactic: rw [this]
state_before: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this : U = f ⁻¹ᵁ f ''ᵁ U
⊢ IsDomain ↑Γ(X, f ⁻¹ᵁ f ''ᵁ U)
state_after: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this✝ : U = f ⁻¹ᵁ f ''ᵁ U
this : IsDomain ↑Γ(Y, f ''ᵁ U)
⊢ IsDomain ↑Γ(X, f ⁻¹ᵁ f ''ᵁ U)
tactic: have : IsDomain Γ(Y, f ''ᵁ U) := by
    apply (config := { allowSynthFailures := true }) IsIntegral.component_integral
    exact ⟨⟨_, _, hU.some.prop, rfl⟩⟩
state_before: case component_integral
X✝ : Scheme
X Y : Scheme
f : X ⟶ Y
H : IsOpenImmersion f
inst✝¹ : IsIntegral Y
inst✝ : Nonempty ↑↑X.toPresheafedSpace
U : X.Opens
hU : Nonempty ↑↑(↑U).toPresheafedSpace
this✝ : U = f ⁻¹ᵁ f ''ᵁ U
this : IsDomain ↑Γ(Y, f ''ᵁ U)
⊢ IsDomain ↑Γ(X, f ⁻¹ᵁ f ''ᵁ U)
state_after: no goals
tactic: exact (asIso <| f.app (f ''ᵁ U) :
    Γ(Y, f ''ᵁ U) ≅ _).symm.commRingCatIsoToRingEquiv.toMulEquiv.isDomain _