Theorem: Algebra.IsAlgebraic.isNormalClosure_normalClosure
File: Mathlib/FieldTheory/NormalClosure.lean

Proof steps:
state_before: F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ IsNormalClosure F K ↥(normalClosure F K L)
state_after: F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ (∀ (x : K), Splits (algebraMap F ↥(normalClosure F K L)) (minpoly F x)) ∧ normalClosure F K ↥(normalClosure F K L) = ⊤
tactic: rw [isNormalClosure_iff]
state_before: F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ (∀ (x : K), Splits (algebraMap F ↥(normalClosure F K L)) (minpoly F x)) ∧ normalClosure F K ↥(normalClosure F K L) = ⊤
state_after: case left
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ ∀ (x : K), Splits (algebraMap F ↥(normalClosure F K L)) (minpoly F x)

case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ normalClosure F K ↥(normalClosure F K L) = ⊤
tactic: constructor
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ normalClosure F K ↥(normalClosure F K L) = ⊤
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ ⊤ ≤ ⨆ f, f.fieldRange
tactic: simp_rw [normalClosure, ← top_le_iff]
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
⊢ ⊤ ≤ ⨆ f, f.fieldRange
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ (⨆ f, f.fieldRange).val.toRingHom x ∈ ⇑(⨆ f, f.fieldRange).val.toRingHom '' ↑(⨆ f, f.fieldRange)
tactic: refine fun x _ ↦ (IntermediateField.val _).injective.mem_set_image.mp ?_
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ (⨆ f, f.fieldRange).val.toRingHom x ∈ ⇑(⨆ f, f.fieldRange).val.toRingHom '' ↑(⨆ f, f.fieldRange)
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ ↑x ∈ IntermediateField.map (⨆ f, f.fieldRange).val (⨆ f, f.fieldRange)
tactic: change x.val ∈ IntermediateField.map (IntermediateField.val _) _
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ ↑x ∈ IntermediateField.map (⨆ f, f.fieldRange).val (⨆ f, f.fieldRange)
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ ↑x ∈ ⨆ i, IntermediateField.map (⨆ f, f.fieldRange).val i.fieldRange
tactic: rw [IntermediateField.map_iSup]
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
⊢ ↑x ∈ ⨆ i, IntermediateField.map (⨆ f, f.fieldRange).val i.fieldRange
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
f : K →ₐ[F] L
⊢ f.fieldRange ≤ ⨆ i, IntermediateField.map (⨆ f, f.fieldRange).val i.fieldRange
tactic: refine (iSup_le fun f ↦ ?_ : normalClosure F K L ≤ _) x.2
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
f : K →ₐ[F] L
⊢ f.fieldRange ≤ ⨆ i, IntermediateField.map (⨆ f, f.fieldRange).val i.fieldRange
state_after: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
f : K →ₐ[F] L
⊢ f.fieldRange ≤
    IntermediateField.map (⨆ f, f.fieldRange).val (f.codRestrict (⨆ f, f.fieldRange).toSubalgebra ⋯).fieldRange
tactic: refine le_iSup_of_le (f.codRestrict _ fun x ↦ f.fieldRange_le_normalClosure ⟨x, rfl⟩) ?_
state_before: case right
F : Type u_1
K : Type u_2
L : Type u_3
inst✝⁵ : Field F
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Algebra F K
inst✝¹ : Algebra F L
inst✝ : Algebra.IsAlgebraic F K
splits : ∀ (x : K), Splits (algebraMap F L) (minpoly F x)
x : ↥(⨆ f, f.fieldRange)
x✝ : x ∈ ⊤
f : K →ₐ[F] L
⊢ f.fieldRange ≤
    IntermediateField.map (⨆ f, f.fieldRange).val (f.codRestrict (⨆ f, f.fieldRange).toSubalgebra ⋯).fieldRange
state_after: no goals
tactic: rw [AlgHom.map_fieldRange, val, AlgHom.val_comp_codRestrict]