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

tactic: refine'
  ⟨fun e l h ↦
    le_chainHeight_add_nat_iff.1
      ((add_le_add_right (length_le_chainHeight_of_mem_subchain h) _).trans e),
    fun H ↦ _⟩
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m ↔
    ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m

tactic: by_cases s.chainHeight = ⊤
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: suffices t.chainHeight = ⊤ by
  rw [this, top_add]
  exact le_top
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : chainHeight s = ⊤
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: rw [chainHeight_eq_top_iff] at h⊢
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : chainHeight s = ⊤
⊢ chainHeight t = ⊤

tactic: intro k
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
⊢ ∀ (n : ℕ), ∃ l, l ∈ subchain t ∧ length l = n

tactic: have := (le_chainHeight_TFAE t k).out 1 2
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
k : ℕ
⊢ ∃ l, l ∈ subchain t ∧ length l = k

tactic: rw [this]
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
k : ℕ
this : (∃ l, l ∈ subchain t ∧ length l = k) ↔ ∃ l, l ∈ subchain t ∧ k ≤ length l
⊢ ∃ l, l ∈ subchain t ∧ length l = k

tactic: obtain ⟨l, hs, hl⟩ := h (k + m)
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
k : ℕ
this : (∃ l, l ∈ subchain t ∧ length l = k) ↔ ∃ l, l ∈ subchain t ∧ k ≤ length l
⊢ ∃ l, l ∈ subchain t ∧ k ≤ length l

tactic: obtain ⟨l', ht, hl'⟩ := H l hs
state_before: case pos.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l✝ : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
k : ℕ
this : (∃ l, l ∈ subchain t ∧ length l = k) ↔ ∃ l, l ∈ subchain t ∧ k ≤ length l
l : List α
hs : l ∈ subchain s
hl : length l = k + m
⊢ ∃ l, l ∈ subchain t ∧ k ≤ length l

tactic: exact ⟨l', ht, (add_le_add_iff_right m).1 <| _root_.trans (hl.symm.trans_le le_self_add) hl'⟩
state_before: case pos.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l✝ : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ∀ (n : ℕ), ∃ l, l ∈ subchain s ∧ length l = n
k : ℕ
this : (∃ l, l ∈ subchain t ∧ length l = k) ↔ ∃ l, l ∈ subchain t ∧ k ≤ length l
l : List α
hs : l ∈ subchain s
hl : length l = k + m
l' : List β
ht : l' ∈ subchain t
hl' : length l + n ≤ length l' + m
⊢ ∃ l, l ∈ subchain t ∧ k ≤ length l

tactic: rw [this, top_add]
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : chainHeight s = ⊤
this : chainHeight t = ⊤
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: exact le_top
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : chainHeight s = ⊤
this : chainHeight t = ⊤
⊢ chainHeight s + ↑n ≤ ⊤

tactic: obtain ⟨k, hk⟩ := WithTop.ne_top_iff_exists.1 h
state_before: case neg
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ¬chainHeight s = ⊤
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: obtain ⟨l, hs, hl⟩ := le_chainHeight_iff.1 hk.le
state_before: case neg.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ¬chainHeight s = ⊤
k : ℕ
hk : ↑k = chainHeight s
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: rw [← hk, ← hl]
state_before: case neg.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l✝ : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ¬chainHeight s = ⊤
k : ℕ
hk : ↑k = chainHeight s
l : List α
hs : l ∈ subchain s
hl : length l = k
⊢ chainHeight s + ↑n ≤ chainHeight t + ↑m

tactic: exact le_chainHeight_add_nat_iff.2 (H l hs)
state_before: case neg.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l✝ : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain t ∧ length l + n ≤ length l' + m
h : ¬chainHeight s = ⊤
k : ℕ
hk : ↑k = chainHeight s
l : List α
hs : l ∈ subchain s
hl : length l = k
⊢ ↑(length l) + ↑n ≤ chainHeight t + ↑m