Theorem: Combinatorics.Subspace.exists_mono_in_high_dimension
File: Mathlib/Combinatorics/HalesJewett.lean

Proof steps:
state_before: η✝ : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
⊢ ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
state_after: case intro
η✝ : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
⊢ ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
tactic: cases nonempty_fintype η
state_before: case intro
η✝ : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
⊢ ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
state_after: case intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
tactic: obtain ⟨ι, _, hι⟩ := Line.exists_mono_in_high_dimension (Shrink.{0} η → α) κ
state_before: case intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
state_after: case intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
⊢ ∃ l, IsMono C l
tactic: refine ⟨ι × Shrink η, inferInstance, fun C ↦ ?_⟩
state_before: case intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
⊢ ∃ l, IsMono C l
state_after: case intro.intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
⊢ ∃ l, IsMono C l
tactic: obtain ⟨l, hl⟩ := hι fun x ↦ C fun (i, e) ↦ x i e
state_before: case intro.intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
⊢ ∃ l, IsMono C l
state_after: case intro.intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
⊢ IsMono C (l.toSubspace.reindex (equivShrink η).symm (Equiv.refl α) (Equiv.refl (ι × Shrink.{0, u_7} η)))
tactic: refine ⟨l.toSubspace.reindex (equivShrink.{0} η).symm (Equiv.refl _) (Equiv.refl _), ?_⟩
state_before: case intro.intro.intro.intro
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
⊢ IsMono C (l.toSubspace.reindex (equivShrink η).symm (Equiv.refl α) (Equiv.refl (ι × Shrink.{0, u_7} η)))
state_after: case h.e'_5.h.h.e'_1
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
x✝ : ι × Shrink.{0, u_7} η → α
⊢ x✝ = ⇑(Equiv.refl α).symm ∘ x✝ ∘ ⇑(Equiv.refl (ι × Shrink.{0, u_7} η))
tactic: convert hl.toSubspace.reindex
state_before: case h.e'_5.h.h.e'_1
η✝ : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
α : Type u_5
κ : Type u_6
η : Type u_7
inst✝² : Finite α
inst✝¹ : Finite κ
inst✝ : Finite η
val✝ : Fintype η
ι : Type
w✝ : Fintype ι
hι : ∀ (C : (ι → Shrink.{0, u_7} η → α) → κ), ∃ l, Line.IsMono C l
C : (ι × Shrink.{0, u_7} η → α) → κ
l : Line (Shrink.{0, u_7} η → α) ι
hl :
  Line.IsMono
    (fun x =>
      C fun x_1 =>
        match x_1 with
        | (i, e) => x i e)
    l
x✝ : ι × Shrink.{0, u_7} η → α
⊢ x✝ = ⇑(Equiv.refl α).symm ∘ x✝ ∘ ⇑(Equiv.refl (ι × Shrink.{0, u_7} η))
state_after: no goals
tactic: simp