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

tactic: apply le_antisymm <;> rw [chainHeight_le_chainHeight_iff]
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ (f '' s).chainHeight = s.chainHeight
state_after: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, l.length = l'.length

case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ s.subchain, ∃ l' ∈ (f '' s).subchain, l.length = l'.length

tactic: suffices ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l by
  intro l hl
  obtain ⟨l', h₁, rfl⟩ := this l hl
  exact ⟨l', h₁, length_map _ _⟩
state_before: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, l.length = l'.length
state_after: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l

tactic: intro l
state_before: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
state_after: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List β
⊢ l ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = l

tactic: induction' l with x xs hx
state_before: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List β
⊢ l ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = l
state_after: case a.nil
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ [] ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = []

case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
⊢ x :: xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = x :: xs

tactic: intro l hl
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
this : ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
⊢ ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, l.length = l'.length
state_after: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
this : ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
l : List β
hl : l ∈ (f '' s).subchain
⊢ ∃ l' ∈ s.subchain, l.length = l'.length

tactic: obtain ⟨l', h₁, rfl⟩ := this l hl
state_before: α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
this : ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
l : List β
hl : l ∈ (f '' s).subchain
⊢ ∃ l' ∈ s.subchain, l.length = l'.length
state_after: case intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
this : ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
l' : List α
h₁ : l' ∈ s.subchain
hl : map f l' ∈ (f '' s).subchain
⊢ ∃ l'_1 ∈ s.subchain, (map f l').length = l'_1.length

tactic: exact ⟨l', h₁, length_map _ _⟩
state_before: case intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
this : ∀ l ∈ (f '' s).subchain, ∃ l' ∈ s.subchain, map f l' = l
l' : List α
h₁ : l' ∈ s.subchain
hl : map f l' ∈ (f '' s).subchain
⊢ ∃ l'_1 ∈ s.subchain, (map f l').length = l'_1.length
state_after: no goals

tactic: exact fun _ ↦ ⟨nil, ⟨trivial, fun x h ↦ (not_mem_nil x h).elim⟩, rfl⟩
state_before: case a.nil
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ [] ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = []
state_after: no goals

tactic: intro h
state_before: case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
⊢ x :: xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = x :: xs
state_after: case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
h : x :: xs ∈ (f '' s).subchain
⊢ ∃ l' ∈ s.subchain, map f l' = x :: xs

tactic: rw [cons_mem_subchain_iff] at h
state_before: case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
h : x :: xs ∈ (f '' s).subchain
⊢ ∃ l' ∈ s.subchain, map f l' = x :: xs
state_after: case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
h : x ∈ f '' s ∧ xs ∈ (f '' s).subchain ∧ ∀ b ∈ xs.head?, x < b
⊢ ∃ l' ∈ s.subchain, map f l' = x :: xs

tactic: obtain ⟨⟨x, hx', rfl⟩, h₁, h₂⟩ := h
state_before: case a.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : β
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
h : x ∈ f '' s ∧ xs ∈ (f '' s).subchain ∧ ∀ b ∈ xs.head?, x < b
⊢ ∃ l' ∈ s.subchain, map f l' = x :: xs
state_after: case a.cons.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
x : α
hx' : x ∈ s
h₁ : xs ∈ (f '' s).subchain
h₂ : ∀ b ∈ xs.head?, f x < b
⊢ ∃ l' ∈ s.subchain, map f l' = f x :: xs

tactic: obtain ⟨l', h₃, rfl⟩ := hx h₁
state_before: case a.cons.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
xs : List β
hx : xs ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = xs
x : α
hx' : x ∈ s
h₁ : xs ∈ (f '' s).subchain
h₂ : ∀ b ∈ xs.head?, f x < b
⊢ ∃ l' ∈ s.subchain, map f l' = f x :: xs
state_after: case a.cons.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
l' : List α
h₃ : l' ∈ s.subchain
hx : map f l' ∈ (f '' s).subchain → ∃ l'_1 ∈ s.subchain, map f l'_1 = map f l'
h₁ : map f l' ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f l').head?, f x < b
⊢ ∃ l'_1 ∈ s.subchain, map f l'_1 = f x :: map f l'

tactic: refine ⟨x::l', Set.cons_mem_subchain_iff.mpr ⟨hx', h₃, ?_⟩, rfl⟩
state_before: case a.cons.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
l' : List α
h₃ : l' ∈ s.subchain
hx : map f l' ∈ (f '' s).subchain → ∃ l'_1 ∈ s.subchain, map f l'_1 = map f l'
h₁ : map f l' ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f l').head?, f x < b
⊢ ∃ l'_1 ∈ s.subchain, map f l'_1 = f x :: map f l'
state_after: case a.cons.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
l' : List α
h₃ : l' ∈ s.subchain
hx : map f l' ∈ (f '' s).subchain → ∃ l'_1 ∈ s.subchain, map f l'_1 = map f l'
h₁ : map f l' ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f l').head?, f x < b
⊢ ∀ b ∈ l'.head?, x < b

tactic: cases l'
state_before: case a.cons.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
l' : List α
h₃ : l' ∈ s.subchain
hx : map f l' ∈ (f '' s).subchain → ∃ l'_1 ∈ s.subchain, map f l'_1 = map f l'
h₁ : map f l' ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f l').head?, f x < b
⊢ ∀ b ∈ l'.head?, x < b
state_after: case a.cons.intro.intro.intro.intro.intro.intro.nil
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
h₃ : [] ∈ s.subchain
hx : map f [] ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = map f []
h₁ : map f [] ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f []).head?, f x < b
⊢ ∀ b ∈ [].head?, x < b

case a.cons.intro.intro.intro.intro.intro.intro.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
head✝ : α
tail✝ : List α
h₃ : head✝ :: tail✝ ∈ s.subchain
hx : map f (head✝ :: tail✝) ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = map f (head✝ :: tail✝)
h₁ : map f (head✝ :: tail✝) ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f (head✝ :: tail✝)).head?, f x < b
⊢ ∀ b ∈ (head✝ :: tail✝).head?, x < b

tactic: simp
state_before: case a.cons.intro.intro.intro.intro.intro.intro.nil
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
h₃ : [] ∈ s.subchain
hx : map f [] ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = map f []
h₁ : map f [] ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f []).head?, f x < b
⊢ ∀ b ∈ [].head?, x < b
state_after: no goals

tactic: simpa [← hf] using h₂
state_before: case a.cons.intro.intro.intro.intro.intro.intro.cons
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
x : α
hx' : x ∈ s
head✝ : α
tail✝ : List α
h₃ : head✝ :: tail✝ ∈ s.subchain
hx : map f (head✝ :: tail✝) ∈ (f '' s).subchain → ∃ l' ∈ s.subchain, map f l' = map f (head✝ :: tail✝)
h₁ : map f (head✝ :: tail✝) ∈ (f '' s).subchain
h₂ : ∀ b ∈ (map f (head✝ :: tail✝)).head?, f x < b
⊢ ∀ b ∈ (head✝ :: tail✝).head?, x < b
state_after: no goals

tactic: intro l hl
state_before: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
⊢ ∀ l ∈ s.subchain, ∃ l' ∈ (f '' s).subchain, l.length = l'.length
state_after: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ ∃ l' ∈ (f '' s).subchain, l.length = l'.length

tactic: refine ⟨l.map f, ⟨?_, ?_⟩, ?_⟩
state_before: case a
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ ∃ l' ∈ (f '' s).subchain, l.length = l'.length
state_after: case a.refine_1
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun x x_1 => x < x_1) (map f l)

case a.refine_2
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ ∀ i ∈ map f l, i ∈ f '' s

case a.refine_3
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ l.length = (map f l).length

tactic: simp_rw [chain'_map, ← hf]
state_before: case a.refine_1
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun x x_1 => x < x_1) (map f l)
state_after: case a.refine_1
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun a b => a < b) l

tactic: exact hl.1
state_before: case a.refine_1
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ Chain' (fun a b => a < b) l
state_after: no goals

tactic: intro _ e
state_before: case a.refine_2
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ ∀ i ∈ map f l, i ∈ f '' s
state_after: case a.refine_2
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
i✝ : β
e : i✝ ∈ map f l
⊢ i✝ ∈ f '' s

tactic: obtain ⟨a, ha, rfl⟩ := mem_map.mp e
state_before: case a.refine_2
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
i✝ : β
e : i✝ ∈ map f l
⊢ i✝ ∈ f '' s
state_after: case a.refine_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a✝ : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
a : α
ha : a ∈ l
e : f a ∈ map f l
⊢ f a ∈ f '' s

tactic: exact Set.mem_image_of_mem _ (hl.2 _ ha)
state_before: case a.refine_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a✝ : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
a : α
ha : a ∈ l
e : f a ∈ map f l
⊢ f a ∈ f '' s
state_after: no goals

tactic: rw [length_map]
state_before: case a.refine_3
α : Type u_1
β : Type u_2
inst✝¹ : LT α
inst✝ : LT β
s✝ t : Set α
l✝ : List α
a : α
f : α → β
hf : ∀ {x y : α}, x < y ↔ f x < f y
s : Set α
l : List α
hl : l ∈ s.subchain
⊢ l.length = (map f l).length
state_after: no goals