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

tactic: cases h : t.chainHeight
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: apply le_antisymm
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: 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✝
⊢ 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: 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 ∈ 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: obtain ⟨l', hl', rfl⟩ := exists_chain_of_le_chainHeight t h.symm.le
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: refine ⟨l ++ l', ⟨Chain'.append hl.1 hl'.1 fun x hx y hy ↦ ?_, fun i hi ↦ ?_⟩, by simp⟩
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: rw [add_top, eq_top_iff, ← h]
state_before: 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 + ⊤
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 = ⊤
⊢ t.chainHeight ≤ (s ∪ t).chainHeight

tactic: exact Set.chainHeight_mono subset_union_right
state_before: 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 = ⊤
⊢ t.chainHeight ≤ (s ∪ t).chainHeight
state_after: no goals

tactic: rw [← h]
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 ∪ 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 + t.chainHeight

tactic: exact chainHeight_union_le
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 ∪ t).chainHeight ≤ s.chainHeight + t.chainHeight
state_after: no goals

tactic: simp
state_before: α : 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.length + l'.length ≤ (l ++ l').length + 0
state_after: no goals

tactic: exact H x (hl.2 _ <| mem_of_mem_getLast? hx) y (hl'.2 _ <| mem_of_mem_head? hy)
state_before: 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
state_after: no goals

tactic: rw [mem_append] at hi
state_before: 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
state_after: 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 ∨ i ∈ l'
⊢ i ∈ s ∪ t

tactic: cases' hi with hi hi
state_before: 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 ∨ i ∈ l'
⊢ i ∈ s ∪ t
state_after: case coe.a.intro.intro.refine_2.inl
α : 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
⊢ i ∈ s ∪ t

case coe.a.intro.intro.refine_2.inr
α : 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'
⊢ i ∈ s ∪ t

tactic: exacts [Or.inl (hl.2 _ hi), Or.inr (hl'.2 _ hi)]
state_before: case coe.a.intro.intro.refine_2.inl
α : 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
⊢ i ∈ s ∪ t

case coe.a.intro.intro.refine_2.inr
α : 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'
⊢ i ∈ s ∪ t
state_after: no goals