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

Proof steps:
state_before: α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
⊢ (s ∪ t).chainHeight = s.chainHeight + t.chainHeight
state_after: case top
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
h : t.chainHeight = ⊤
⊢ (s ∪ t).chainHeight = s.chainHeight + ⊤

case coe
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ (s ∪ t).chainHeight = s.chainHeight + ↑a✝
tactic: cases h : t.chainHeight
state_before: case coe
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ (s ∪ t).chainHeight = s.chainHeight + ↑a✝
state_after: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ (s ∪ t).chainHeight ≤ s.chainHeight + ↑a✝

case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ s.chainHeight + ↑a✝ ≤ (s ∪ t).chainHeight
tactic: apply le_antisymm
state_before: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ s.chainHeight + ↑a✝ ≤ (s ∪ t).chainHeight
state_after: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ ∀ l ∈ s.subchain, ∃ l' ∈ (s ∪ t).subchain, l.length + a✝ ≤ l'.length + 0
tactic: rw [← add_zero (s ∪ t).chainHeight, ← WithTop.coe_zero,
    ENat.some_eq_coe, chainHeight_add_le_chainHeight_add]
state_before: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
⊢ ∀ l ∈ s.subchain, ∃ l' ∈ (s ∪ t).subchain, l.length + a✝ ≤ l'.length + 0
state_after: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
l : List α
hl : l ∈ s.subchain
⊢ ∃ l' ∈ (s ∪ t).subchain, l.length + a✝ ≤ l'.length + 0
tactic: intro l hl
state_before: case coe.a
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
a✝ : ℕ
h : t.chainHeight = ↑a✝
l : List α
hl : l ∈ s.subchain
⊢ ∃ l' ∈ (s ∪ t).subchain, l.length + a✝ ≤ l'.length + 0
state_after: case coe.a.intro.intro
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
l : List α
hl : l ∈ s.subchain
l' : List α
hl' : l' ∈ t.subchain
h : t.chainHeight = ↑l'.length
⊢ ∃ l'_1 ∈ (s ∪ t).subchain, l.length + l'.length ≤ l'_1.length + 0
tactic: obtain ⟨l', hl', rfl⟩ := exists_chain_of_le_chainHeight t h.symm.le
state_before: case coe.a.intro.intro
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
l : List α
hl : l ∈ s.subchain
l' : List α
hl' : l' ∈ t.subchain
h : t.chainHeight = ↑l'.length
⊢ ∃ l'_1 ∈ (s ∪ t).subchain, l.length + l'.length ≤ l'_1.length + 0
state_after: case coe.a.intro.intro.refine_1
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
l : List α
hl : l ∈ s.subchain
l' : List α
hl' : l' ∈ t.subchain
h : t.chainHeight = ↑l'.length
x : α
hx : x ∈ l.getLast?
y : α
hy : y ∈ l'.head?
⊢ x < y

case coe.a.intro.intro.refine_2
α : Type u_1
β : Type u_2
s✝ t✝ : Set α
inst✝ : Preorder α
s t : Set α
H : ∀ a ∈ s, ∀ b ∈ t, a < b
l : List α
hl : l ∈ s.subchain
l' : List α
hl' : l' ∈ t.subchain
h : t.chainHeight = ↑l'.length
i : α
hi : i ∈ l ++ l'
⊢ i ∈ s ∪ t
tactic: refine ⟨l ++ l', ⟨Chain'.append hl.1 hl'.1 fun x hx y hy ↦ ?_, fun i hi ↦ ?_⟩, by simp⟩