Theorem: isField_of_isIntegral_of_isField'
File: Mathlib/RingTheory/IntegralClosure.lean

tactic: letI := hR.toField
state_before: R✝ : Type ?u.1647177
A : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
⊢ IsField S

tactic: refine' ⟨⟨0, 1, zero_ne_one⟩, mul_comm, fun {x} hx => _⟩
state_before: R✝ : Type ?u.1647177
A : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this : Field R := IsField.toField hR
⊢ IsField S

tactic: let A := Algebra.adjoin R ({x} : Set S)
state_before: R✝ : Type ?u.1647177
A : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this : Field R := IsField.toField hR
x : S
hx : x ≠ 0
⊢ ∃ b, x * b = 1

tactic: haveI : IsNoetherian R A :=
  isNoetherian_of_fg_of_noetherian (Subalgebra.toSubmodule A)
    (FG_adjoin_singleton_of_integral x (H x))
state_before: R✝ : Type ?u.1647177
A✝ : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A✝
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A✝ B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A✝
inst✝⁴ : IsScalarTower R✝ A✝ B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this : Field R := IsField.toField hR
x : S
hx : x ≠ 0
A : Subalgebra R S := adjoin R {x}
⊢ ∃ b, x * b = 1

tactic: haveI : Module.Finite R A := Module.IsNoetherian.finite R A
state_before: R✝ : Type ?u.1647177
A✝ : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A✝
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A✝ B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A✝
inst✝⁴ : IsScalarTower R✝ A✝ B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this✝ : Field R := IsField.toField hR
x : S
hx : x ≠ 0
A : Subalgebra R S := adjoin R {x}
this : IsNoetherian R { x // x ∈ A }
⊢ ∃ b, x * b = 1

tactic: obtain ⟨y, hy⟩ :=
  LinearMap.surjective_of_injective
    (@LinearMap.mulLeft_injective R A _ _ _ _ ⟨x, subset_adjoin (Set.mem_singleton x)⟩ fun h =>
      hx (Subtype.ext_iff.mp h))
    1
state_before: R✝ : Type ?u.1647177
A✝ : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A✝
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A✝ B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A✝
inst✝⁴ : IsScalarTower R✝ A✝ B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this✝¹ : Field R := IsField.toField hR
x : S
hx : x ≠ 0
A : Subalgebra R S := adjoin R {x}
this✝ : IsNoetherian R { x // x ∈ A }
this : Module.Finite R { x // x ∈ A }
⊢ ∃ b, x * b = 1

tactic: exact ⟨y, Subtype.ext_iff.mp hy⟩
state_before: case intro
R✝ : Type ?u.1647177
A✝ : Type ?u.1647180
B : Type ?u.1647183
S✝ : Type ?u.1647186
T : Type ?u.1647189
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A✝
inst✝¹⁰ : CommRing B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A✝ B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A✝
inst✝⁴ : IsScalarTower R✝ A✝ B
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : Algebra R S
H : Algebra.IsIntegral R S
hR : IsField R
this✝¹ : Field R := IsField.toField hR
x : S
hx : x ≠ 0
A : Subalgebra R S := adjoin R {x}
this✝ : IsNoetherian R { x // x ∈ A }
this : Module.Finite R { x // x ∈ A }
y : { x // x ∈ A }
hy : ↑(LinearMap.mulLeft R { val := x, property := (_ : x ∈ ↑(adjoin R {x})) }) y = 1
⊢ ∃ b, x * b = 1