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 : ℕ
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m ↔ ∀ l ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
state_after: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ l ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m

tactic: by_cases h : 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
⊢ t.chainHeight = ⊤

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
⊢ t.chainHeight = ⊤
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
⊢ ∀ (n : ℕ), ∃ l ∈ t.subchain, l.length = n

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
⊢ ∀ (n : ℕ), ∃ l ∈ t.subchain, l.length = n
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
⊢ ∃ l ∈ t.subchain, l.length = k

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
⊢ ∃ l ∈ t.subchain, l.length = k
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
⊢ ∃ l ∈ t.subchain, l.length = 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
⊢ ∃ l ∈ t.subchain, l.length = k
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
⊢ ∃ l ∈ t.subchain, k ≤ l.length

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
⊢ ∃ l ∈ t.subchain, k ≤ l.length
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
l : List α
hs : l ∈ s.subchain
hl : l.length = k + m
⊢ ∃ l ∈ t.subchain, k ≤ l.length

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
l : List α
hs : l ∈ s.subchain
hl : l.length = k + m
⊢ ∃ l ∈ t.subchain, k ≤ l.length
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
l : List α
hs : l ∈ s.subchain
hl : l.length = k + m
l' : List β
ht : l' ∈ t.subchain
hl' : l.length + n ≤ l'.length + m
⊢ ∃ l ∈ t.subchain, k ≤ l.length

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ∀ (n : ℕ), ∃ l ∈ s.subchain, l.length = n
k : ℕ
this : (∃ l ∈ t.subchain, l.length = k) ↔ ∃ l ∈ t.subchain, k ≤ l.length
l : List α
hs : l ∈ s.subchain
hl : l.length = k + m
l' : List β
ht : l' ∈ t.subchain
hl' : l.length + n ≤ l'.length + m
⊢ ∃ l ∈ t.subchain, k ≤ l.length
state_after: no goals

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
this : t.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t✝ : Set α
l : List α
a : α
s : Set α
t : Set β
n m : ℕ
H : ∀ l ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
this : t.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ ⊤

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : s.chainHeight = ⊤
this : t.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ ⊤
state_after: no goals

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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
l : List α
hs : l ∈ s.subchain
hl : l.length = k
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
l : List α
hs : l ∈ s.subchain
hl : l.length = k
⊢ s.chainHeight + ↑n ≤ t.chainHeight + ↑m
state_after: 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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
l : List α
hs : l ∈ s.subchain
hl : l.length = k
⊢ ↑l.length + ↑n ≤ t.chainHeight + ↑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 ∈ s.subchain, ∃ l' ∈ t.subchain, l.length + n ≤ l'.length + m
h : ¬s.chainHeight = ⊤
k : ℕ
hk : ↑k = s.chainHeight
l : List α
hs : l ∈ s.subchain
hl : l.length = k
⊢ ↑l.length + ↑n ≤ t.chainHeight + ↑m
state_after: no goals