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

tactic: rw [← add_zero (insert a s).chainHeight]
state_before: α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
⊢ chainHeight (insert a s) = chainHeight s + 1

tactic: change (insert a s).chainHeight + (0 : ℕ) = s.chainHeight + (1 : ℕ)
state_before: α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
⊢ chainHeight (insert a s) + 0 = chainHeight s + 1

tactic: apply le_antisymm <;> rw [chainHeight_add_le_chainHeight_add]
state_before: α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
⊢ chainHeight (insert a s) + ↑0 = chainHeight s + ↑1

tactic: rintro (_ | ⟨y, ys⟩) h
state_before: case a
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
⊢ ∀ (l : List α), l ∈ subchain (insert a s) → ∃ l', l' ∈ subchain s ∧ length l + 0 ≤ length l' + 1

tactic: exact ⟨[], nil_mem_subchain _, zero_le _⟩
state_before: case a.nil
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
h : [] ∈ subchain (insert a s)
⊢ ∃ l', l' ∈ subchain s ∧ length [] + 0 ≤ length l' + 1

tactic: have h' := cons_mem_subchain_iff.mp h
state_before: case a.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
y : α
ys : List α
h : y :: ys ∈ subchain (insert a s)
⊢ ∃ l', l' ∈ subchain s ∧ length (y :: ys) + 0 ≤ length l' + 1

tactic: refine' ⟨ys, ⟨h'.2.1.1, fun i hi ↦ _⟩, by simp⟩
state_before: case a.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
y : α
ys : List α
h : y :: ys ∈ subchain (insert a s)
h' : y ∈ insert a s ∧ ys ∈ subchain (insert a s) ∧ ∀ (b : α), b ∈ head? ys → y < b
⊢ ∃ l', l' ∈ subchain s ∧ length (y :: ys) + 0 ≤ length l' + 1

tactic: apply (h'.2.1.2 i hi).resolve_left
state_before: case a.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
y : α
ys : List α
h : y :: ys ∈ subchain (insert a s)
h' : y ∈ insert a s ∧ ys ∈ subchain (insert a s) ∧ ∀ (b : α), b ∈ head? ys → y < b
i : α
hi : i ∈ ys
⊢ i ∈ s

tactic: rintro rfl
state_before: case a.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
y : α
ys : List α
h : y :: ys ∈ subchain (insert a s)
h' : y ∈ insert a s ∧ ys ∈ subchain (insert a s) ∧ ∀ (b : α), b ∈ head? ys → y < b
i : α
hi : i ∈ ys
⊢ ¬i = a

tactic: cases' chain'_iff_pairwise.mp h.1 with _ _ hy
state_before: case a.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
y : α
ys : List α
i : α
hi : i ∈ ys
hx : ∀ (b : α), b ∈ s → i < b
h : y :: ys ∈ subchain (insert i s)
h' : y ∈ insert i s ∧ ys ∈ subchain (insert i s) ∧ ∀ (b : α), b ∈ head? ys → y < b
⊢ False

tactic: cases' h'.1 with h' h'
state_before: case a.cons.cons
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
y : α
ys : List α
i : α
hi : i ∈ ys
hx : ∀ (b : α), b ∈ s → i < b
h : y :: ys ∈ subchain (insert i s)
h' : y ∈ insert i s ∧ ys ∈ subchain (insert i s) ∧ ∀ (b : α), b ∈ head? ys → y < b
a✝ : List.Pairwise (fun x x_1 => x < x_1) ys
hy : ∀ (a' : α), a' ∈ ys → y < a'
⊢ False

tactic: exacts [(hy _ hi).ne h', not_le_of_gt (hy _ hi) (hx _ h').le]
state_before: case a.cons.cons.inl
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
y : α
ys : List α
i : α
hi : i ∈ ys
hx : ∀ (b : α), b ∈ s → i < b
h : y :: ys ∈ subchain (insert i s)
h'✝ : y ∈ insert i s ∧ ys ∈ subchain (insert i s) ∧ ∀ (b : α), b ∈ head? ys → y < b
a✝ : List.Pairwise (fun x x_1 => x < x_1) ys
hy : ∀ (a' : α), a' ∈ ys → y < a'
h' : y = i
⊢ False

case a.cons.cons.inr
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
y : α
ys : List α
i : α
hi : i ∈ ys
hx : ∀ (b : α), b ∈ s → i < b
h : y :: ys ∈ subchain (insert i s)
h'✝ : y ∈ insert i s ∧ ys ∈ subchain (insert i s) ∧ ∀ (b : α), b ∈ head? ys → y < b
a✝ : List.Pairwise (fun x x_1 => x < x_1) ys
hy : ∀ (a' : α), a' ∈ ys → y < a'
h' : y ∈ s
⊢ False

tactic: simp
state_before: α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
y : α
ys : List α
h : y :: ys ∈ subchain (insert a s)
h' : y ∈ insert a s ∧ ys ∈ subchain (insert a s) ∧ ∀ (b : α), b ∈ head? ys → y < b
⊢ length (y :: ys) + 0 ≤ length ys + 1

tactic: intro l hl
state_before: case a
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
⊢ ∀ (l : List α), l ∈ subchain s → ∃ l', l' ∈ subchain (insert a s) ∧ length l + 1 ≤ length l' + 0

tactic: refine' ⟨a::l, ⟨_, _⟩, by simp⟩
state_before: case a
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ ∃ l', l' ∈ subchain (insert a s) ∧ length l + 1 ≤ length l' + 0

tactic: simp
state_before: α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ length l + 1 ≤ length (a :: l) + 0

tactic: rw [chain'_cons']
state_before: case a.refine'_1
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ Chain' (fun x x_1 => x < x_1) (a :: l)

tactic: exact ⟨fun y hy ↦ hx _ (hl.2 _ (mem_of_mem_head? hy)), hl.1⟩
state_before: case a.refine'_1
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ (∀ (y : α), y ∈ head? l → a < y) ∧ Chain' (fun x x_1 => x < x_1) l

tactic: rintro x (_ | _)
state_before: case a.refine'_2
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ ∀ (i : α), i ∈ a :: l → i ∈ insert a s

tactic: exacts [Or.inl (Set.mem_singleton a), Or.inr (hl.2 x ‹_›)]
state_before: case a.refine'_2.head
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
⊢ a ∈ insert a s

case a.refine'_2.tail
α : Type u_1
β : Type ?u.34460
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ (b : α), b ∈ s → a < b
l : List α
hl : l ∈ subchain s
x : α
a✝ : Mem x l
⊢ x ∈ insert a s