File: Mathlib/GroupTheory/Nilpotent.lean

full_name: upperCentralSeriesStep
code: /-- If `H` is a normal subgroup of `G`, then the set `{x : G | ∀ y : G, x*y*x⁻¹*y⁻¹ ∈ H}`
is a subgroup of `G` (because it is the preimage in `G` of the centre of the
quotient group `G/H`.)
-/
def upperCentralSeriesStep : Subgroup G 
goal: Subgroup G

full_name: mem_upperCentralSeriesStep
code: theorem mem_upperCentralSeriesStep (x : G) :
    x ∈ upperCentralSeriesStep H ↔ ∀ y, x * y * x⁻¹ * y⁻¹ ∈ H 
goal: x ∈ upperCentralSeriesStep H ↔ ∀ (y : G), x * y * x⁻¹ * y⁻¹ ∈ H

full_name: upperCentralSeriesStep_eq_comap_center
code: /-- The proof that `upperCentralSeriesStep H` is the preimage of the centre of `G/H` under
the canonical surjection. -/
theorem upperCentralSeriesStep_eq_comap_center :
    upperCentralSeriesStep H = Subgroup.comap (mk' H) (center (G ⧸ H)) 
goal: upperCentralSeriesStep H = Subgroup.comap (QuotientGroup.mk' H) (Subgroup.center (G ⧸ H))

full_name: instNormalUpperCentralSeriesStep
code: instance : Normal (upperCentralSeriesStep H) 
goal: (upperCentralSeriesStep H).Normal

full_name: upperCentralSeriesAux
code: /-- An auxiliary type-theoretic definition defining both the upper central series of
a group, and a proof that it is normal, all in one go. -/
def upperCentralSeriesAux : ℕ → Σ'H : Subgroup G, Normal H
  
goal: ℕ → (H : Subgroup G) ×' H.Normal

full_name: upperCentralSeries
code: /-- `upperCentralSeries G n` is the `n`th term in the upper central series of `G`. -/
def upperCentralSeries (n : ℕ) : Subgroup G 
goal: Subgroup G

full_name: upperCentralSeries_normal
code: instance upperCentralSeries_normal (n : ℕ) : Normal (upperCentralSeries G n) 
goal: (upperCentralSeries G n).Normal

full_name: upperCentralSeries_zero
code: @[simp]
theorem upperCentralSeries_zero : upperCentralSeries G 0 = ⊥ 
goal: upperCentralSeries G 0 = ⊥

full_name: upperCentralSeries_one
code: @[simp]
theorem upperCentralSeries_one : upperCentralSeries G 1 = center G 
goal: upperCentralSeries G 1 = Subgroup.center G

full_name: mem_upperCentralSeries_succ_iff
code: /-- The `n+1`st term of the upper central series `H i` has underlying set equal to the `x` such
that `⁅x,G⁆ ⊆ H n`-/
theorem mem_upperCentralSeries_succ_iff (n : ℕ) (x : G) :
    x ∈ upperCentralSeries G (n + 1) ↔ ∀ y : G, x * y * x⁻¹ * y⁻¹ ∈ upperCentralSeries G n 
goal: x ∈ upperCentralSeries G (n + 1) ↔ ∀ (y : G), x * y * x⁻¹ * y⁻¹ ∈ upperCentralSeries G n

full_name: Group.IsNilpotent
code: /-- A group `G` is nilpotent if its upper central series is eventually `G`. -/
class Group.IsNilpotent (G : Type*) [Group G] : Prop where
  nilpotent' : ∃ n : ℕ, upperCentralSeries G n = ⊤
goal: Prop

full_name: Group.IsNilpotent.nilpotent'
code: /-- A group `G` is nilpotent if its upper central series is eventually `G`. -/
class Group.IsNilpotent (G : Type*) [Group G] : Prop where
  nilpotent' : ∃ n : ℕ, upperCentralSeries G n = ⊤
goal: ∃ n, upperCentralSeries G n = ⊤

full_name: Group.IsNilpotent.nilpotent
code: lemma Group.IsNilpotent.nilpotent (G : Type*) [Group G] [IsNilpotent G] :
    ∃ n : ℕ, upperCentralSeries G n = ⊤ 
goal: ∃ n, upperCentralSeries G n = ⊤

full_name: IsAscendingCentralSeries
code: /-- A sequence of subgroups of `G` is an ascending central series if `H 0` is trivial and
  `⁅H (n + 1), G⁆ ⊆ H n` for all `n`. Note that we do not require that `H n = G` for some `n`. -/
def IsAscendingCentralSeries (H : ℕ → Subgroup G) : Prop 
goal: Prop

full_name: IsDescendingCentralSeries
code: /-- A sequence of subgroups of `G` is a descending central series if `H 0` is `G` and
  `⁅H n, G⁆ ⊆ H (n + 1)` for all `n`. Note that we do not require that `H n = {1}` for some `n`. -/
def IsDescendingCentralSeries (H : ℕ → Subgroup G) 
goal: Prop

full_name: ascending_central_series_le_upper
code: /-- Any ascending central series for a group is bounded above by the upper central series. -/
theorem ascending_central_series_le_upper (H : ℕ → Subgroup G) (hH : IsAscendingCentralSeries H) :
    ∀ n : ℕ, H n ≤ upperCentralSeries G n
  
goal: H n ≤ upperCentralSeries G n

full_name: upperCentralSeries_isAscendingCentralSeries
code: /-- The upper central series of a group is an ascending central series. -/
theorem upperCentralSeries_isAscendingCentralSeries :
    IsAscendingCentralSeries (upperCentralSeries G) 
goal: IsAscendingCentralSeries (upperCentralSeries G)

full_name: upperCentralSeries_mono
code: theorem upperCentralSeries_mono : Monotone (upperCentralSeries G) 
goal: Monotone (upperCentralSeries G)

full_name: nilpotent_iff_finite_ascending_central_series
code: /-- A group `G` is nilpotent iff there exists an ascending central series which reaches `G` in
  finitely many steps. -/
theorem nilpotent_iff_finite_ascending_central_series :
    IsNilpotent G ↔ ∃ n : ℕ, ∃ H : ℕ → Subgroup G, IsAscendingCentralSeries H ∧ H n = ⊤ 
goal: Group.IsNilpotent G ↔ ∃ n H, IsAscendingCentralSeries H ∧ H n = ⊤

full_name: is_decending_rev_series_of_is_ascending
code: theorem is_decending_rev_series_of_is_ascending {H : ℕ → Subgroup G} {n : ℕ} (hn : H n = ⊤)
    (hasc : IsAscendingCentralSeries H) : IsDescendingCentralSeries fun m : ℕ => H (n - m) 
goal: IsDescendingCentralSeries fun m => H (n - m)

full_name: is_ascending_rev_series_of_is_descending
code: theorem is_ascending_rev_series_of_is_descending {H : ℕ → Subgroup G} {n : ℕ} (hn : H n = ⊥)
    (hdesc : IsDescendingCentralSeries H) : IsAscendingCentralSeries fun m : ℕ => H (n - m) 
goal: IsAscendingCentralSeries fun m => H (n - m)

full_name: nilpotent_iff_finite_descending_central_series
code: /-- A group `G` is nilpotent iff there exists a descending central series which reaches the
  trivial group in a finite time. -/
theorem nilpotent_iff_finite_descending_central_series :
    IsNilpotent G ↔ ∃ n : ℕ, ∃ H : ℕ → Subgroup G, IsDescendingCentralSeries H ∧ H n = ⊥ 
goal: Group.IsNilpotent G ↔ ∃ n H, IsDescendingCentralSeries H ∧ H n = ⊥

full_name: lowerCentralSeries
code: /-- The lower central series of a group `G` is a sequence `H n` of subgroups of `G`, defined
  by `H 0` is all of `G` and for `n≥1`, `H (n + 1) = ⁅H n, G⁆` -/
def lowerCentralSeries (G : Type*) [Group G] : ℕ → Subgroup G
  
goal: ℕ → Subgroup G

full_name: lowerCentralSeries_zero
code: @[simp]
theorem lowerCentralSeries_zero : lowerCentralSeries G 0 = ⊤ 
goal: lowerCentralSeries G 0 = ⊤

full_name: lowerCentralSeries_one
code: @[simp]
theorem lowerCentralSeries_one : lowerCentralSeries G 1 = commutator G 
goal: lowerCentralSeries G 1 = commutator G

full_name: mem_lowerCentralSeries_succ_iff
code: theorem mem_lowerCentralSeries_succ_iff (n : ℕ) (q : G) :
    q ∈ lowerCentralSeries G (n + 1) ↔
    q ∈ closure { x | ∃ p ∈ lowerCentralSeries G n,
                        ∃ q ∈ (⊤ : Subgroup G), p * q * p⁻¹ * q⁻¹ = x } 
goal: q ∈ lowerCentralSeries G (n + 1) ↔
  q ∈ Subgroup.closure {x | ∃ p ∈ lowerCentralSeries G n, ∃ q ∈ ⊤, p * q * p⁻¹ * q⁻¹ = x}

full_name: lowerCentralSeries_succ
code: theorem lowerCentralSeries_succ (n : ℕ) :
    lowerCentralSeries G (n + 1) =
      closure { x | ∃ p ∈ lowerCentralSeries G n, ∃ q ∈ (⊤ : Subgroup G), p * q * p⁻¹ * q⁻¹ = x } 
goal: lowerCentralSeries G (n + 1) = Subgroup.closure {x | ∃ p ∈ lowerCentralSeries G n, ∃ q ∈ ⊤, p * q * p⁻¹ * q⁻¹ = x}

full_name: lowerCentralSeries_normal
code: instance lowerCentralSeries_normal (n : ℕ) : Normal (lowerCentralSeries G n) 
goal: (lowerCentralSeries G n).Normal

full_name: lowerCentralSeries_antitone
code: theorem lowerCentralSeries_antitone : Antitone (lowerCentralSeries G) 
goal: Antitone (lowerCentralSeries G)

full_name: lowerCentralSeries_isDescendingCentralSeries
code: /-- The lower central series of a group is a descending central series. -/
theorem lowerCentralSeries_isDescendingCentralSeries :
    IsDescendingCentralSeries (lowerCentralSeries G) 
goal: IsDescendingCentralSeries (lowerCentralSeries G)

full_name: descending_central_series_ge_lower
code: /-- Any descending central series for a group is bounded below by the lower central series. -/
theorem descending_central_series_ge_lower (H : ℕ → Subgroup G) (hH : IsDescendingCentralSeries H) :
    ∀ n : ℕ, lowerCentralSeries G n ≤ H n
  
goal: lowerCentralSeries G n ≤ H n

full_name: nilpotent_iff_lowerCentralSeries
code: /-- A group is nilpotent if and only if its lower central series eventually reaches
  the trivial subgroup. -/
theorem nilpotent_iff_lowerCentralSeries : IsNilpotent G ↔ ∃ n, lowerCentralSeries G n = ⊥ 
goal: Group.IsNilpotent G ↔ ∃ n, lowerCentralSeries G n = ⊥

full_name: Group.nilpotencyClass
code: /-- The nilpotency class of a nilpotent group is the smallest natural `n` such that
the `n`'th term of the upper central series is `G`. -/
noncomputable def Group.nilpotencyClass : ℕ 
goal: ℕ

full_name: upperCentralSeries_nilpotencyClass
code: @[simp]
theorem upperCentralSeries_nilpotencyClass : upperCentralSeries G (Group.nilpotencyClass G) = ⊤ 
goal: upperCentralSeries G (Group.nilpotencyClass G) = ⊤

full_name: upperCentralSeries_eq_top_iff_nilpotencyClass_le
code: theorem upperCentralSeries_eq_top_iff_nilpotencyClass_le {n : ℕ} :
    upperCentralSeries G n = ⊤ ↔ Group.nilpotencyClass G ≤ n 
goal: upperCentralSeries G n = ⊤ ↔ Group.nilpotencyClass G ≤ n

full_name: least_ascending_central_series_length_eq_nilpotencyClass
code: /-- The nilpotency class of a nilpotent `G` is equal to the smallest `n` for which an ascending
central series reaches `G` in its `n`'th term. -/
theorem least_ascending_central_series_length_eq_nilpotencyClass :
    Nat.find ((nilpotent_iff_finite_ascending_central_series G).mp hG) =
    Group.nilpotencyClass G 
goal: Nat.find ⋯ = Group.nilpotencyClass G

full_name: least_descending_central_series_length_eq_nilpotencyClass
code: /-- The nilpotency class of a nilpotent `G` is equal to the smallest `n` for which the descending
central series reaches `⊥` in its `n`'th term. -/
theorem least_descending_central_series_length_eq_nilpotencyClass :
    Nat.find ((nilpotent_iff_finite_descending_central_series G).mp hG) =
    Group.nilpotencyClass G 
goal: Nat.find ⋯ = Group.nilpotencyClass G

full_name: lowerCentralSeries_length_eq_nilpotencyClass
code: /-- The nilpotency class of a nilpotent `G` is equal to the length of the lower central series. -/
theorem lowerCentralSeries_length_eq_nilpotencyClass :
    Nat.find (nilpotent_iff_lowerCentralSeries.mp hG) = Group.nilpotencyClass (G := G) 
goal: Nat.find ⋯ = Group.nilpotencyClass G

full_name: lowerCentralSeries_nilpotencyClass
code: @[simp]
theorem lowerCentralSeries_nilpotencyClass :
    lowerCentralSeries G (Group.nilpotencyClass G) = ⊥ 
goal: lowerCentralSeries G (Group.nilpotencyClass G) = ⊥

full_name: lowerCentralSeries_eq_bot_iff_nilpotencyClass_le
code: theorem lowerCentralSeries_eq_bot_iff_nilpotencyClass_le {n : ℕ} :
    lowerCentralSeries G n = ⊥ ↔ Group.nilpotencyClass G ≤ n 
goal: lowerCentralSeries G n = ⊥ ↔ Group.nilpotencyClass G ≤ n

full_name: lowerCentralSeries_map_subtype_le
code: theorem lowerCentralSeries_map_subtype_le (H : Subgroup G) (n : ℕ) :
    (lowerCentralSeries H n).map H.subtype ≤ lowerCentralSeries G n 
goal: Subgroup.map H.subtype (lowerCentralSeries (↥H) n) ≤ lowerCentralSeries G n

full_name: Subgroup.isNilpotent
code: /-- A subgroup of a nilpotent group is nilpotent -/
instance Subgroup.isNilpotent (H : Subgroup G) [hG : IsNilpotent G] : IsNilpotent H 
goal: Group.IsNilpotent ↥H

full_name: Subgroup.nilpotencyClass_le
code: /-- The nilpotency class of a subgroup is less or equal to the nilpotency class of the group -/
theorem Subgroup.nilpotencyClass_le (H : Subgroup G) [hG : IsNilpotent G] :
    Group.nilpotencyClass H ≤ Group.nilpotencyClass G 
goal: Group.nilpotencyClass ↥H ≤ Group.nilpotencyClass G

full_name: Group.isNilpotent_of_subsingleton
code: instance (priority := 100) Group.isNilpotent_of_subsingleton [Subsingleton G] : IsNilpotent G 
goal: Group.IsNilpotent G

full_name: upperCentralSeries.map
code: theorem upperCentralSeries.map {H : Type*} [Group H] {f : G →* H} (h : Function.Surjective f)
    (n : ℕ) : Subgroup.map f (upperCentralSeries G n) ≤ upperCentralSeries H n 
goal: Subgroup.map f (upperCentralSeries G n) ≤ upperCentralSeries H n

full_name: lowerCentralSeries.map
code: theorem lowerCentralSeries.map {H : Type*} [Group H] (f : G →* H) (n : ℕ) :
    Subgroup.map f (lowerCentralSeries G n) ≤ lowerCentralSeries H n 
goal: Subgroup.map f (lowerCentralSeries G n) ≤ lowerCentralSeries H n

full_name: lowerCentralSeries_succ_eq_bot
code: theorem lowerCentralSeries_succ_eq_bot {n : ℕ} (h : lowerCentralSeries G n ≤ center G) :
    lowerCentralSeries G (n + 1) = ⊥ 
goal: lowerCentralSeries G (n + 1) = ⊥

full_name: isNilpotent_of_ker_le_center
code: /-- The preimage of a nilpotent group is nilpotent if the kernel of the homomorphism is contained
in the center -/
theorem isNilpotent_of_ker_le_center {H : Type*} [Group H] (f : G →* H) (hf1 : f.ker ≤ center G)
    (hH : IsNilpotent H) : IsNilpotent G 
goal: Group.IsNilpotent G

full_name: nilpotencyClass_le_of_ker_le_center
code: theorem nilpotencyClass_le_of_ker_le_center {H : Type*} [Group H] (f : G →* H)
    (hf1 : f.ker ≤ center G) (hH : IsNilpotent H) :
    Group.nilpotencyClass (hG := isNilpotent_of_ker_le_center f hf1 hH) ≤
      Group.nilpotencyClass H + 1 
goal: Group.nilpotencyClass G ≤ Group.nilpotencyClass H + 1

full_name: nilpotent_of_surjective
code: /-- The range of a surjective homomorphism from a nilpotent group is nilpotent -/
theorem nilpotent_of_surjective {G' : Type*} [Group G'] [h : IsNilpotent G] (f : G →* G')
    (hf : Function.Surjective f) : IsNilpotent G' 
goal: Group.IsNilpotent G'

full_name: nilpotencyClass_le_of_surjective
code: /-- The nilpotency class of the range of a surjective homomorphism from a
nilpotent group is less or equal the nilpotency class of the domain -/
theorem nilpotencyClass_le_of_surjective {G' : Type*} [Group G'] (f : G →* G')
    (hf : Function.Surjective f) [h : IsNilpotent G] :
    Group.nilpotencyClass (hG := nilpotent_of_surjective _ hf) ≤ Group.nilpotencyClass G 
goal: Group.nilpotencyClass G' ≤ Group.nilpotencyClass G

full_name: nilpotent_of_mulEquiv
code: /-- Nilpotency respects isomorphisms -/
theorem nilpotent_of_mulEquiv {G' : Type*} [Group G'] [_h : IsNilpotent G] (f : G ≃* G') :
    IsNilpotent G' 
goal: Group.IsNilpotent G'

full_name: nilpotent_quotient_of_nilpotent
code: /-- A quotient of a nilpotent group is nilpotent -/
instance nilpotent_quotient_of_nilpotent (H : Subgroup G) [H.Normal] [_h : IsNilpotent G] :
    IsNilpotent (G ⧸ H) 
goal: Group.IsNilpotent (G ⧸ H)

full_name: nilpotencyClass_quotient_le
code: /-- The nilpotency class of a quotient of `G` is less or equal the nilpotency class of `G` -/
theorem nilpotencyClass_quotient_le (H : Subgroup G) [H.Normal] [_h : IsNilpotent G] :
    Group.nilpotencyClass (G ⧸ H) ≤ Group.nilpotencyClass G 
goal: Group.nilpotencyClass (G ⧸ H) ≤ Group.nilpotencyClass G

full_name: _private.Mathlib.GroupTheory.Nilpotent.0.comap_center_subst
code: private theorem comap_center_subst {H₁ H₂ : Subgroup G} [Normal H₁] [Normal H₂] (h : H₁ = H₂) :
    comap (mk' H₁) (center (G ⧸ H₁)) = comap (mk' H₂) (center (G ⧸ H₂)) 
goal: Subgroup.comap (QuotientGroup.mk' H₁) (Subgroup.center (G ⧸ H₁)) =
  Subgroup.comap (QuotientGroup.mk' H₂) (Subgroup.center (G ⧸ H₂))

full_name: comap_upperCentralSeries_quotient_center
code: theorem comap_upperCentralSeries_quotient_center (n : ℕ) :
    comap (mk' (center G)) (upperCentralSeries (G ⧸ center G) n) = upperCentralSeries G n.succ 
goal: Subgroup.comap (QuotientGroup.mk' (Subgroup.center G)) (upperCentralSeries (G ⧸ Subgroup.center G) n) =
  upperCentralSeries G n.succ

full_name: nilpotencyClass_zero_iff_subsingleton
code: theorem nilpotencyClass_zero_iff_subsingleton [IsNilpotent G] :
    Group.nilpotencyClass G = 0 ↔ Subsingleton G 
goal: Group.nilpotencyClass G = 0 ↔ Subsingleton G

full_name: nilpotencyClass_quotient_center
code: /-- Quotienting the `center G` reduces the nilpotency class by 1 -/
theorem nilpotencyClass_quotient_center [hH : IsNilpotent G] :
    Group.nilpotencyClass (G ⧸ center G) = Group.nilpotencyClass G - 1 
goal: Group.nilpotencyClass (G ⧸ Subgroup.center G) = Group.nilpotencyClass G - 1

full_name: nilpotencyClass_eq_quotient_center_plus_one
code: /-- The nilpotency class of a non-trivial group is one more than its quotient by the center -/
theorem nilpotencyClass_eq_quotient_center_plus_one [hH : IsNilpotent G] [Nontrivial G] :
    Group.nilpotencyClass G = Group.nilpotencyClass (G ⧸ center G) + 1 
goal: Group.nilpotencyClass G = Group.nilpotencyClass (G ⧸ Subgroup.center G) + 1

full_name: of_quotient_center_nilpotent
code: /-- If the quotient by `center G` is nilpotent, then so is G. -/
theorem of_quotient_center_nilpotent (h : IsNilpotent (G ⧸ center G)) : IsNilpotent G 
goal: Group.IsNilpotent G

full_name: nilpotent_center_quotient_ind
code: /-- A custom induction principle for nilpotent groups. The base case is a trivial group
(`subsingleton G`), and in the induction step, one can assume the hypothesis for
the group quotiented by its center. -/
@[elab_as_elim]
theorem nilpotent_center_quotient_ind {P : ∀ (G) [Group G] [IsNilpotent G], Prop}
    (G : Type*) [Group G] [IsNilpotent G]
    (hbase : ∀ (G) [Group G] [Subsingleton G], P G)
    (hstep : ∀ (G) [Group G] [IsNilpotent G], P (G ⧸ center G) → P G) : P G 
goal: P G

full_name: derived_le_lower_central
code: theorem derived_le_lower_central (n : ℕ) : derivedSeries G n ≤ lowerCentralSeries G n 
goal: derivedSeries G n ≤ lowerCentralSeries G n

full_name: CommGroup.isNilpotent
code: /-- Abelian groups are nilpotent -/
instance (priority := 100) CommGroup.isNilpotent {G : Type*} [CommGroup G] : IsNilpotent G 
goal: Group.IsNilpotent G

full_name: CommGroup.nilpotencyClass_le_one
code: /-- Abelian groups have nilpotency class at most one -/
theorem CommGroup.nilpotencyClass_le_one {G : Type*} [CommGroup G] :
    Group.nilpotencyClass G ≤ 1 
goal: Group.nilpotencyClass G ≤ 1

full_name: commGroupOfNilpotencyClass
code: /-- Groups with nilpotency class at most one are abelian -/
def commGroupOfNilpotencyClass [IsNilpotent G] (h : Group.nilpotencyClass G ≤ 1) : CommGroup G 
goal: CommGroup G

full_name: lowerCentralSeries_prod
code: theorem lowerCentralSeries_prod (n : ℕ) :
    lowerCentralSeries (G₁ × G₂) n = (lowerCentralSeries G₁ n).prod (lowerCentralSeries G₂ n) 
goal: lowerCentralSeries (G₁ × G₂) n = (lowerCentralSeries G₁ n).prod (lowerCentralSeries G₂ n)

full_name: isNilpotent_prod
code: /-- Products of nilpotent groups are nilpotent -/
instance isNilpotent_prod [IsNilpotent G₁] [IsNilpotent G₂] : IsNilpotent (G₁ × G₂) 
goal: Group.IsNilpotent (G₁ × G₂)

full_name: nilpotencyClass_prod
code: /-- The nilpotency class of a product is the max of the nilpotency classes of the factors -/
theorem nilpotencyClass_prod [IsNilpotent G₁] [IsNilpotent G₂] :
    Group.nilpotencyClass (G₁ × G₂) =
    max (Group.nilpotencyClass G₁) (Group.nilpotencyClass G₂) 
goal: Group.nilpotencyClass (G₁ × G₂) = max (Group.nilpotencyClass G₁) (Group.nilpotencyClass G₂)

full_name: lowerCentralSeries_pi_le
code: theorem lowerCentralSeries_pi_le (n : ℕ) :
    lowerCentralSeries (∀ i, Gs i) n ≤ Subgroup.pi Set.univ
      fun i => lowerCentralSeries (Gs i) n 
goal: lowerCentralSeries ((i : η) → Gs i) n ≤ Subgroup.pi Set.univ fun i => lowerCentralSeries (Gs i) n

full_name: isNilpotent_pi_of_bounded_class
code: /-- products of nilpotent groups are nilpotent if their nilpotency class is bounded -/
theorem isNilpotent_pi_of_bounded_class [∀ i, IsNilpotent (Gs i)] (n : ℕ)
    (h : ∀ i, Group.nilpotencyClass (Gs i) ≤ n) : IsNilpotent (∀ i, Gs i) 
goal: Group.IsNilpotent ((i : η) → Gs i)

full_name: lowerCentralSeries_pi_of_finite
code: theorem lowerCentralSeries_pi_of_finite [Finite η] (n : ℕ) :
    lowerCentralSeries (∀ i, Gs i) n = Subgroup.pi Set.univ
      fun i => lowerCentralSeries (Gs i) n 
goal: lowerCentralSeries ((i : η) → Gs i) n = Subgroup.pi Set.univ fun i => lowerCentralSeries (Gs i) n

full_name: isNilpotent_pi
code: /-- n-ary products of nilpotent groups are nilpotent -/
instance isNilpotent_pi [Finite η] [∀ i, IsNilpotent (Gs i)] : IsNilpotent (∀ i, Gs i) 
goal: Group.IsNilpotent ((i : η) → Gs i)

full_name: nilpotencyClass_pi
code: /-- The nilpotency class of an n-ary product is the sup of the nilpotency classes of the factors -/
theorem nilpotencyClass_pi [Fintype η] [∀ i, IsNilpotent (Gs i)] :
    Group.nilpotencyClass (∀ i, Gs i) = Finset.univ.sup fun i => Group.nilpotencyClass (Gs i) 
goal: Group.nilpotencyClass ((i : η) → Gs i) = Finset.univ.sup fun i => Group.nilpotencyClass (Gs i)

full_name: IsNilpotent.to_isSolvable
code: /-- A nilpotent subgroup is solvable -/
instance (priority := 100) IsNilpotent.to_isSolvable [h : IsNilpotent G] : IsSolvable G 
goal: IsSolvable G

full_name: normalizerCondition_of_isNilpotent
code: theorem normalizerCondition_of_isNilpotent [h : IsNilpotent G] : NormalizerCondition G 
goal: NormalizerCondition G

full_name: IsPGroup.isNilpotent
code: /-- A p-group is nilpotent -/
theorem IsPGroup.isNilpotent [Finite G] {p : ℕ} [hp : Fact (Nat.Prime p)] (h : IsPGroup p G) :
    IsNilpotent G 
goal: Group.IsNilpotent G

full_name: isNilpotent_of_product_of_sylow_group
code: /-- If a finite group is the direct product of its Sylow groups, it is nilpotent -/
theorem isNilpotent_of_product_of_sylow_group
    (e : (∀ p : (Nat.card G).primeFactors, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G) :
    IsNilpotent G 
goal: Group.IsNilpotent G

full_name: isNilpotent_of_finite_tfae
code: /-- A finite group is nilpotent iff the normalizer condition holds, and iff all maximal groups are
normal and iff all Sylow groups are normal and iff the group is the direct product of its Sylow
groups. -/
theorem isNilpotent_of_finite_tfae :
    List.TFAE
      [IsNilpotent G, NormalizerCondition G, ∀ H : Subgroup G, IsCoatom H → H.Normal,
        ∀ (p : ℕ) (_hp : Fact p.Prime) (P : Sylow p G), (↑P : Subgroup G).Normal,
        Nonempty
          ((∀ p : (Nat.card G).primeFactors, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G)] 
goal: [Group.IsNilpotent G, NormalizerCondition G, ∀ (H : Subgroup G), IsCoatom H → H.Normal,
    ∀ (p : ℕ), Fact (Nat.Prime p) → ∀ (P : Sylow p G), (↑P).Normal,
    Nonempty (((p : { x // x ∈ (Nat.card G).primeFactors }) → (P : Sylow (↑p) G) → ↥↑P) ≃* G)].TFAE