Theorem: _private.Mathlib.Combinatorics.HalesJewett.0.Combinatorics.Line.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
l✝ : Line α✝ ι✝
i : ι✝
a x✝² : α✝
α α' : Type u
e : α ≃ α'
κ : Type (max v u)
x✝¹ : Finite κ
ι : Type
x✝ : Fintype ι
h : ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
C : (ι → α') → κ
l : Line α ι
c : κ
lc : ∀ (x : α), (fun v => C (⇑e ∘ v)) ((fun x i => (l.idxFun i).getD x) x) = c
x : α
⊢ C ((fun x i => ((map (⇑e) l).idxFun i).getD x) (e x)) = c
state_after: no goals
tactic: rw [← lc x, Line.map_apply]
state_before: η : Type u_1
α : Type u_2
ι : Type u_3
κ : Type u_4
l : Line α ι
i : ι
a x : α
⊢ ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → PEmpty.{u + 1}) → κ), ∃ l, IsMono C l
state_after: η : Type u_1
α : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α ι
i : ι
a x : α
κ : Type (max v u)
inst✝ : Finite κ
⊢ ∃ ι x, ∀ (C : (ι → PEmpty.{u + 1}) → κ), ∃ l, IsMono C l
tactic: intro κ _
state_before: η : Type u_1
α : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α ι
i : ι
a x : α
κ : Type (max v u)
inst✝ : Finite κ
⊢ ∃ ι x, ∀ (C : (ι → PEmpty.{u + 1}) → κ), ∃ l, IsMono C l
state_after: case pos
η : Type u_1
α : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α ι
i : ι
a x : α
κ : Type (max v u)
inst✝ : Finite κ
h : Nonempty κ
⊢ ∃ ι x, ∀ (C : (ι → PEmpty.{u + 1}) → κ), ∃ l, IsMono C l

case neg
η : Type u_1
α : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α ι
i : ι
a x : α
κ : Type (max v u)
inst✝ : Finite κ
h : ¬Nonempty κ
⊢ ∃ ι x, ∀ (C : (ι → PEmpty.{u + 1}) → κ), ∃ l, IsMono C l
tactic: by_cases h : Nonempty κ
state_before: η : Type u_1
α : Type u_2
ι : Type u_3
κ : Type u_4
l : Line α ι
i : ι
a x : α
⊢ ∀ {α : Type u} [inst : Fintype α],
    (∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l) →
      ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
state_after: η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
tactic: intro α _ ihα κ _
state_before: η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
state_after: case intro
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
tactic: cases nonempty_fintype κ
state_before: case intro
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
state_after: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l

case neg
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : ¬Nonempty α
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
tactic: by_cases h : Nonempty α
state_before: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), ∃ l, IsMono C l
state_after: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
⊢ ∀ (r : ℕ), ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
tactic: suffices key :
      ∀ r : ℕ,
        ∃ (ι : Type) (_ : Fintype ι),
          ∀ C : (ι → Option α) → κ,
            (∃ s : ColorFocused C, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l by
      -- Given the key claim, we simply take `r = |κ| + 1`. We cannot have this many distinct colors
      -- so we must be in the second case, where there is a monochromatic line.
      obtain ⟨ι, _inst, hι⟩ := key (Fintype.card κ + 1)
      refine ⟨ι, _inst, fun C => (hι C).resolve_left ?_⟩
      rintro ⟨s, sr⟩
      apply Nat.not_succ_le_self (Fintype.card κ)
      rw [← Nat.add_one, ← sr, ← Multiset.card_map, ← Finset.card_mk]
      exact Finset.card_le_univ ⟨_, s.distinct_colors⟩
state_before: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
⊢ ∀ (r : ℕ), ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
state_after: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
tactic: intro r
state_before: case pos
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
state_after: case pos.zero
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = 0) ∨ ∃ l, IsMono C l

case pos.succ
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ihr : ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: induction' r with r ihr
state_before: case pos.succ
η : Type u_1
α✝ : Type u_2
ι : Type u_3
κ✝ : Type u_4
l : Line α✝ ι
i : ι
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ihr : ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: obtain ⟨ι, _inst, hι⟩ := ihr
state_before: case pos.succ.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
ihα : ∀ (κ : Type (max v u)) [inst : Finite κ], ∃ ι x, ∀ (C : (ι → α) → κ), ∃ l, IsMono C l
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ihα : ∃ ι_1 x, ∀ (C : (ι_1 → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: specialize ihα ((ι → Option α) → κ)
state_before: case pos.succ.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ihα : ∃ ι_1 x, ∀ (C : (ι_1 → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: obtain ⟨ι', _inst, hι'⟩ := ihα
state_before: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∃ ι x, ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∀ (C : (ι ⊕ ι' → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: refine ⟨ι ⊕ ι', inferInstance, ?_⟩
state_before: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
⊢ ∀ (C : (ι ⊕ ι' → Option α) → κ), (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
C : (ι ⊕ ι' → Option α) → κ
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: intro C
state_before: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
hι' : ∀ (C : (ι' → α) → (ι → Option α) → κ), ∃ l, IsMono C l
C : (ι ⊕ ι' → Option α) → κ
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
hι' : ∃ l, IsMono (fun v' v => C (Sum.elim v (some ∘ v'))) l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: specialize hι' fun v' v => C (Sum.elim v (some ∘ v'))
state_before: case pos.succ.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
hι' : ∃ l, IsMono (fun v' v => C (Sum.elim v (some ∘ v'))) l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: obtain ⟨l', C', hl'⟩ := hι'
state_before: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: have mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l := by
      rintro ⟨l, c, hl⟩
      refine ⟨l.horizontal (some ∘ l' (Classical.arbitrary α)), c, fun x => ?_⟩
      rw [Line.horizontal_apply, ← hl, ← hl']
state_before: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
hι : ∀ (C : (ι → Option α) → κ), (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C l
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
hι : (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C' l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: specialize hι C'
state_before: case pos.succ.intro.intro.intro.intro.intro.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
hι : (∃ s, Multiset.card s.lines = r) ∨ ∃ l, IsMono C' l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro.intro.intro.inl.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l

case pos.succ.intro.intro.intro.intro.intro.intro.inr
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
h : ∃ l, IsMono C' l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: rcases hι with (⟨s, sr⟩ | h)
state_before: case pos.succ.intro.intro.intro.intro.intro.intro.inl.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l

case pos.succ.intro.intro.intro.intro.intro.intro.inr
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
h : ∃ l, IsMono C' l
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos.succ.intro.intro.intro.intro.intro.intro.inl.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: on_goal 2 => exact Or.inr (mono_of_mono h)
state_before: case pos.succ.intro.intro.intro.intro.intro.intro.inl.intro
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case pos
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ∃ p ∈ s.lines, p.color = C' s.focus
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l

case neg
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
tactic: by_cases h : ∃ p ∈ s.lines, (p : AlmostMono _).color = C' s.focus
state_before: case neg
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ (∃ s, Multiset.card s.lines = r + 1) ∨ ∃ l, IsMono C l
state_after: case neg.refine_1
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ AlmostMono C' → AlmostMono C

case neg.refine_2
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x✝ : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
x : α
⊢ C ((fun x i => ((vertical s.focus (map some l')).idxFun i).getD x) (some x)) = C' s.focus

case neg.refine_3
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ ∀
    p ∈
      { line := vertical s.focus (map some l'), color := C' s.focus, has_color := ⋯ } ::ₘ
        Multiset.map ?neg.refine_1✝ s.lines,
    (fun x i => (p.line.idxFun i).getD x) none = Sum.elim s.focus ((fun x i => ((map some l').idxFun i).getD x) none)

case neg.refine_4
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ (Multiset.map AlmostMono.color
      ({ line := vertical s.focus (map some l'), color := C' s.focus, has_color := ⋯ } ::ₘ
        Multiset.map ?neg.refine_1✝ s.lines)).Nodup

case neg.refine_5
η : Type u_1
α✝ : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
l : Line α✝ ι✝
i : ι✝
a x : α✝
α : Type u
inst✝¹ : Fintype α
κ : Type (max v u)
inst✝ : Finite κ
val✝ : Fintype κ
h✝ : Nonempty α
r : ℕ
ι : Type
_inst✝ : Fintype ι
ι' : Type
_inst : Fintype ι'
C : (ι ⊕ ι' → Option α) → κ
l' : Line α ι'
C' : (ι → Option α) → κ
hl' : ∀ (x : α), (fun v' v => C (Sum.elim v (some ∘ v'))) ((fun x i => (l'.idxFun i).getD x) x) = C'
mono_of_mono : (∃ l, IsMono C' l) → ∃ l, IsMono C l
s : ColorFocused C'
sr : Multiset.card s.lines = r
h : ¬∃ p ∈ s.lines, p.color = C' s.focus
⊢ Multiset.card
      {
          lines :=
            { line := vertical s.focus (map some l'), color := C' s.focus, has_color := ⋯ } ::ₘ
              Multiset.map ?neg.refine_1✝ s.lines,
          focus := Sum.elim s.focus ((fun x i => ((map some l').idxFun i).getD x) none), is_focused := ?neg.refine_3✝,
          distinct_colors := ?neg.refine_4✝ }.lines =
    r + 1
tactic: refine Or.inl ⟨⟨(s.lines.map ?_).cons ⟨(l'.map some).vertical s.focus, C' s.focus, fun x => ?_⟩,
            Sum.elim s.focus (l'.map some none), ?_, ?_⟩, ?_⟩