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_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ (insert a s).chainHeight = s.chainHeight + 1
state_after: α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ (insert a s).chainHeight + 0 = s.chainHeight + 1

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

tactic: apply le_antisymm <;> rw [chainHeight_add_le_chainHeight_add]
state_before: α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ (insert a s).chainHeight + ↑0 = s.chainHeight + ↑1
state_after: case a
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ ∀ l ∈ (insert a s).subchain, ∃ l' ∈ s.subchain, l.length + 0 ≤ l'.length + 1

case a
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ ∀ l ∈ s.subchain, ∃ l' ∈ (insert a s).subchain, l.length + 1 ≤ l'.length + 0

tactic: rintro (_ | ⟨y, ys⟩) h
state_before: case a
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
⊢ ∀ l ∈ (insert a s).subchain, ∃ l' ∈ s.subchain, l.length + 0 ≤ l'.length + 1
state_after: case a.nil
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
h : [] ∈ (insert a s).subchain
⊢ ∃ l' ∈ s.subchain, [].length + 0 ≤ l'.length + 1

case a.cons
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
y : α
ys : List α
h : y :: ys ∈ (insert a s).subchain
⊢ ∃ l' ∈ s.subchain, (y :: ys).length + 0 ≤ l'.length + 1

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

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

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

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

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

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

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

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

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

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

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

tactic: refine ⟨a::l, ⟨?_, ?_⟩, by simp⟩
state_before: case a
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ ∃ l' ∈ (insert a s).subchain, l.length + 1 ≤ l'.length + 0
state_after: case a.refine_1
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun x x_1 => x < x_1) (a :: l)

case a.refine_2
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ ∀ i ∈ a :: l, i ∈ insert a s

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

tactic: rw [chain'_cons']
state_before: case a.refine_1
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun x x_1 => x < x_1) (a :: l)
state_after: case a.refine_1
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ (∀ y ∈ l.head?, a < y) ∧ Chain' (fun x x_1 => x < x_1) 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_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ (∀ y ∈ l.head?, a < y) ∧ Chain' (fun x x_1 => x < x_1) l
state_after: no goals

tactic: rintro x (_ | _)
state_before: case a.refine_2
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ ∀ i ∈ a :: l, i ∈ insert a s
state_after: case a.refine_2.head
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ a ∈ insert a s

case a.refine_2.tail
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
x : α
a✝ : Mem x l
⊢ x ∈ 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_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
⊢ a ∈ insert a s

case a.refine_2.tail
α : Type u_1
β : Type u_2
s t : Set α
inst✝ : Preorder α
a : α
hx : ∀ b ∈ s, a < b
l : List α
hl : l ∈ s.subchain
x : α
a✝ : Mem x l
⊢ x ∈ insert a s
state_after: no goals