Theorem: isSolvable_of_isScalarTower
File: Mathlib/FieldTheory/Normal.lean

Proof steps:
state_before: F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
⊢ IsSolvable (E ≃ₐ[F] E)
state_after: F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  { toFun := fun ϕ => AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑ϕ.symm) ⋯ ⋯,
    map_one' := ⋯, map_mul' := ⋯ }
⊢ IsSolvable (E ≃ₐ[F] E)
tactic: let f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
    { toFun := fun ϕ =>
        AlgEquiv.ofAlgHom (ϕ.toAlgHom.restrictScalars F) (ϕ.symm.toAlgHom.restrictScalars F)
          (AlgHom.ext fun x => ϕ.apply_symm_apply x) (AlgHom.ext fun x => ϕ.symm_apply_apply x)
      map_one' := AlgEquiv.ext fun _ => rfl
      map_mul' := fun _ _ => AlgEquiv.ext fun _ => rfl }
state_before: F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  { toFun := fun ϕ => AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑ϕ.symm) ⋯ ⋯,
    map_one' := ⋯, map_mul' := ⋯ }
⊢ IsSolvable (E ≃ₐ[F] E)
state_after: F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ✝ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  { toFun := fun ϕ => AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑ϕ.symm) ⋯ ⋯,
    map_one' := ⋯, map_mul' := ⋯ }
ϕ : E ≃ₐ[F] E
hϕ : ϕ ∈ (AlgEquiv.restrictNormalHom K₁).ker
x : K₁
⊢ ϕ.toFun ((algebraMap K₁ E) x) = (algebraMap K₁ E) x
tactic: refine
    solvable_of_ker_le_range f (AlgEquiv.restrictNormalHom K₁) fun ϕ hϕ =>
      ⟨{ ϕ with commutes' := fun x => ?_ }, AlgEquiv.ext fun _ => rfl⟩
state_before: F : Type u_1
K : Type u_2
inst✝¹⁶ : Field F
inst✝¹⁵ : Field K
inst✝¹⁴ : Algebra F K
K₁ : Type u_3
K₂ : Type u_4
K₃ : Type u_5
inst✝¹³ : Field F
inst✝¹² : Field K₁
inst✝¹¹ : Field K₂
inst✝¹⁰ : Field K₃
inst✝⁹ : Algebra F K₁
inst✝⁸ : Algebra F K₂
inst✝⁷ : Algebra F K₃
ϕ✝ : K₁ →ₐ[F] K₂
χ : K₁ ≃ₐ[F] K₂
ψ : K₂ →ₐ[F] K₃
ω : K₂ ≃ₐ[F] K₃
E : Type u_6
inst✝⁶ : Field E
inst✝⁵ : Algebra F E
inst✝⁴ : Algebra K₁ E
inst✝³ : Algebra K₂ E
inst✝² : IsScalarTower F K₁ E
inst✝¹ : IsScalarTower F K₂ E
inst✝ : Normal F K₁
h1 : IsSolvable (K₁ ≃ₐ[F] K₁)
h2 : IsSolvable (E ≃ₐ[K₁] E)
f : (E ≃ₐ[K₁] E) →* E ≃ₐ[F] E :=
  { toFun := fun ϕ => AlgEquiv.ofAlgHom (AlgHom.restrictScalars F ↑ϕ) (AlgHom.restrictScalars F ↑ϕ.symm) ⋯ ⋯,
    map_one' := ⋯, map_mul' := ⋯ }
ϕ : E ≃ₐ[F] E
hϕ : ϕ ∈ (AlgEquiv.restrictNormalHom K₁).ker
x : K₁
⊢ ϕ.toFun ((algebraMap K₁ E) x) = (algebraMap K₁ E) x
state_after: no goals
tactic: exact Eq.trans (ϕ.restrictNormal_commutes K₁ x).symm (congr_arg _ (AlgEquiv.ext_iff.mp hϕ x))