Theorem: LinearMap.ker_noncommProd_eq_of_supIndep_ker
File: Mathlib/LinearAlgebra/FiniteDimensional.lean

tactic: induction' s using Finset.induction_on with i s hi ih
state_before: K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
s : Finset ι
comm : (↑s).Pairwise fun a b => Commute (f a) (f b)
h : s.SupIndep fun i => ker (f i)
⊢ ker (s.noncommProd f comm) = ⨆ i ∈ s, ker (f i)
state_after: case empty
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
comm : (↑∅).Pairwise fun a b => Commute (f a) (f b)
h : ∅.SupIndep fun i => ker (f i)
⊢ ker (∅.noncommProd f comm) = ⨆ i ∈ ∅, ker (f i)

case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
ih :
  ∀ (comm : (↑s).Pairwise fun a b => Commute (f a) (f b)),
    (s.SupIndep fun i => ker (f i)) → ker (s.noncommProd f comm) = ⨆ i ∈ s, ker (f i)
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
⊢ ker ((insert i s).noncommProd f comm) = ⨆ i_1 ∈ insert i s, ker (f i_1)

tactic: replace ih : ker (Finset.noncommProd s f <| Set.Pairwise.mono (s.subset_insert i) comm) =
    ⨆ x ∈ s, ker (f x) := ih _ (h.subset (s.subset_insert i))
state_before: case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
ih :
  ∀ (comm : (↑s).Pairwise fun a b => Commute (f a) (f b)),
    (s.SupIndep fun i => ker (f i)) → ker (s.noncommProd f comm) = ⨆ i ∈ s, ker (f i)
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
⊢ ker ((insert i s).noncommProd f comm) = ⨆ i_1 ∈ insert i s, ker (f i_1)
state_after: case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ ker ((insert i s).noncommProd f comm) = ⨆ i_1 ∈ insert i s, ker (f i_1)

tactic: rw [Finset.noncommProd_insert_of_not_mem _ _ _ _ hi, mul_eq_comp,
  ker_comp_eq_of_commute_of_disjoint_ker]
state_before: case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ ker ((insert i s).noncommProd f comm) = ⨆ i_1 ∈ insert i s, ker (f i_1)
state_after: case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ ker (f i) ⊔ ker (s.noncommProd f ⋯) = ⨆ i_1 ∈ insert i s, ker (f i_1)

case insert.h
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ Commute (f i) (s.noncommProd f ⋯)

case insert.h'
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ Disjoint (ker (f i)) (ker (s.noncommProd f ⋯))

tactic: set_option tactic.skipAssignedInstances false in
simpa using LinearMap.ker_id
state_before: case empty
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
comm : (↑∅).Pairwise fun a b => Commute (f a) (f b)
h : ∅.SupIndep fun i => ker (f i)
⊢ ker (∅.noncommProd f comm) = ⨆ i ∈ ∅, ker (f i)
state_after: no goals

tactic: simpa using LinearMap.ker_id
state_before: case empty
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
comm : (↑∅).Pairwise fun a b => Commute (f a) (f b)
h : ∅.SupIndep fun i => ker (f i)
⊢ ker (∅.noncommProd f comm) = ⨆ i ∈ ∅, ker (f i)
state_after: no goals

tactic: simp_rw [Finset.mem_insert_coe, iSup_insert, Finset.mem_coe, ih]
state_before: case insert
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ ker (f i) ⊔ ker (s.noncommProd f ⋯) = ⨆ i_1 ∈ insert i s, ker (f i_1)
state_after: no goals

tactic: exact s.noncommProd_commute _ _ _ fun j hj ↦
  comm (s.mem_insert_self i) (Finset.mem_insert_of_mem hj) (by aesop)
state_before: case insert.h
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ Commute (f i) (s.noncommProd f ⋯)
state_after: no goals

tactic: aesop
state_before: K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
j : ι
hj : j ∈ s
⊢ i ≠ j
state_after: no goals

tactic: replace h := Finset.supIndep_iff_disjoint_erase.mp h i (s.mem_insert_self i)
state_before: case insert.h'
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
h : (insert i s).SupIndep fun i => ker (f i)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
⊢ Disjoint (ker (f i)) (ker (s.noncommProd f ⋯))
state_after: case insert.h'
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
h : Disjoint (ker (f i)) (((insert i s).erase i).sup fun i => ker (f i))
⊢ Disjoint (ker (f i)) (ker (s.noncommProd f ⋯))

tactic: simpa [ih, hi, Finset.sup_eq_iSup] using h
state_before: case insert.h'
K : Type u
V : Type v
inst✝⁵ : DivisionRing K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
V₂ : Type v'
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V
ι : Type u_1
f : ι → V →ₗ[K] V
i : ι
s : Finset ι
hi : i ∉ s
comm : (↑(insert i s)).Pairwise fun a b => Commute (f a) (f b)
ih : ker (s.noncommProd f ⋯) = ⨆ x ∈ s, ker (f x)
h : Disjoint (ker (f i)) (((insert i s).erase i).sup fun i => ker (f i))
⊢ Disjoint (ker (f i)) (ker (s.noncommProd f ⋯))
state_after: no goals