Theorem: IntermediateField.isSplittingField_iSup
File: Mathlib/FieldTheory/Adjoin.lean

tactic: let K : IntermediateField F E := ⨆ i ∈ s, t i
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
h : ∀ (i : ι), i ∈ s → IsSplittingField F { x // x ∈ t i } (p i)
⊢ IsSplittingField F { x // x ∈ ⨆ (i : ι) (_ : i ∈ s), t i } (∏ i in s, p i)

tactic: have hK : ∀ i ∈ s, t i ≤ K := fun i hi => le_iSup_of_le i (le_iSup (fun _ => t i) hi)
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
h : ∀ (i : ι), i ∈ s → IsSplittingField F { x // x ∈ t i } (p i)
K : IntermediateField F E := ⨆ (i : ι) (_ : i ∈ s), t i
⊢ IsSplittingField F { x // x ∈ ⨆ (i : ι) (_ : i ∈ s), t i } (∏ i in s, p i)

tactic: simp only [isSplittingField_iff] at h ⊢
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
h : ∀ (i : ι), i ∈ s → IsSplittingField F { x // x ∈ t i } (p i)
K : IntermediateField F E := ⨆ (i : ι) (_ : i ∈ s), t i
hK : ∀ (i : ι), i ∈ s → t i ≤ K
⊢ IsSplittingField F { x // x ∈ ⨆ (i : ι) (_ : i ∈ s), t i } (∏ i in s, p i)

tactic: refine'
  ⟨splits_prod (algebraMap F K) fun i hi =>
      Polynomial.splits_comp_of_splits (algebraMap F (t i)) (inclusion (hK i hi)).toRingHom
        (h i hi).1,
    _⟩
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
K : IntermediateField F E := ⨆ (i : ι) (_ : i ∈ s), t i
hK : ∀ (i : ι), i ∈ s → t i ≤ K
h : ∀ (i : ι), i ∈ s → Splits (algebraMap F { x // x ∈ t i }) (p i) ∧ t i = adjoin F (rootSet (p i) E)
⊢ Splits (algebraMap F { x // x ∈ ⨆ (i : ι) (_ : i ∈ s), t i }) (∏ i in s, p i) ∧
    (⨆ (i : ι) (_ : i ∈ s), t i) = adjoin F (rootSet (∏ i in s, p i) E)

tactic: simp only [rootSet_prod p s h0, ← Set.iSup_eq_iUnion, (@gc F _ E _ _).l_iSup₂]
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
K : IntermediateField F E := ⨆ (i : ι) (_ : i ∈ s), t i
hK : ∀ (i : ι), i ∈ s → t i ≤ K
h : ∀ (i : ι), i ∈ s → Splits (algebraMap F { x // x ∈ t i }) (p i) ∧ t i = adjoin F (rootSet (p i) E)
⊢ (⨆ (i : ι) (_ : i ∈ s), t i) = adjoin F (rootSet (∏ i in s, p i) E)

tactic: exact iSup_congr fun i => iSup_congr fun hi => (h i hi).2
state_before: F : Type u_2
inst✝² : Field F
E : Type u_3
inst✝¹ : Field E
inst✝ : Algebra F E
S : Set E
α : E
ι : Type u_1
t : ι → IntermediateField F E
p : ι → F[X]
s : Finset ι
h0 : ∏ i in s, p i ≠ 0
K : IntermediateField F E := ⨆ (i : ι) (_ : i ∈ s), t i
hK : ∀ (i : ι), i ∈ s → t i ≤ K
h : ∀ (i : ι), i ∈ s → Splits (algebraMap F { x // x ∈ t i }) (p i) ∧ t i = adjoin F (rootSet (p i) E)
⊢ (⨆ (i : ι) (_ : i ∈ s), t i) = ⨆ (i : ι) (_ : i ∈ s), adjoin F (rootSet (p i) E)