Theorem: Set.exists_chain_of_le_chainHeight
File: Mathlib/Order/Height.lean

tactic: rcases (le_top : s.chainHeight ≤ ⊤).eq_or_lt with ha | ha <;>
  rw [chainHeight_eq_iSup_subtype] at ha
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: case inl
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length = ⊤
⊢ ∃ l ∈ s.subchain, l.length = n

case inr
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length < ⊤
⊢ ∃ l ∈ s.subchain, l.length = n

tactic: obtain ⟨_, ⟨⟨l, h₁, h₂⟩, rfl⟩, h₃⟩ :=
  not_bddAbove_iff'.mp (WithTop.iSup_coe_eq_top.1 ha) n
state_before: case inl
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length = ⊤
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: case inl.intro.intro.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length = ⊤
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
h₃ : ¬(fun x => ↑(↑x).length) ⟨l, ⋯⟩ ≤ n
⊢ ∃ l ∈ s.subchain, l.length = n

tactic: exact ⟨l.take n, ⟨h₁.take _, fun x h ↦ h₂ _ <| take_subset _ _ h⟩,
  (l.length_take n).trans <| min_eq_left <| le_of_not_ge h₃⟩
state_before: case inl.intro.intro.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length = ⊤
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
h₃ : ¬(fun x => ↑(↑x).length) ⟨l, ⋯⟩ ≤ n
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: no goals

tactic: rw [ENat.iSup_coe_lt_top] at ha
state_before: case inr
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : ⨆ l, ↑(↑l).length < ⊤
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: case inr
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
⊢ ∃ l ∈ s.subchain, l.length = n

tactic: obtain ⟨⟨l, h₁, h₂⟩, e : l.length = _⟩ := Nat.sSup_mem (Set.range_nonempty _) ha
state_before: case inr
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: case inr.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
e : l.length = sSup (range fun l => (↑l).length)
⊢ ∃ l ∈ s.subchain, l.length = n

tactic: refine
  ⟨l.take n, ⟨h₁.take _, fun x h ↦ h₂ _ <| take_subset _ _ h⟩,
    (l.length_take n).trans <| min_eq_left <| ?_⟩
state_before: case inr.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
e : l.length = sSup (range fun l => (↑l).length)
⊢ ∃ l ∈ s.subchain, l.length = n
state_after: case inr.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
e : l.length = sSup (range fun l => (↑l).length)
⊢ n ≤ l.length

tactic: rwa [e, ← Nat.cast_le (α := ℕ∞), sSup_range, ENat.coe_iSup ha, ← chainHeight_eq_iSup_subtype]
state_before: case inr.intro.mk.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s t : Set α
l✝ : List α
a : α
n : ℕ
hn : ↑n ≤ s.chainHeight
ha : BddAbove (range fun l => (↑l).length)
l : List α
h₁ : Chain' (fun x x_1 => x < x_1) l
h₂ : ∀ i ∈ l, i ∈ s
e : l.length = sSup (range fun l => (↑l).length)
⊢ n ≤ l.length
state_after: no goals