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 α
⊢ chainHeight (f '' s) = chainHeight s

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 : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ length l = length 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 : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ 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 ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = l

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 : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = l
⊢ ∀ (l : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ length l = length l'

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 : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = l
l : List β
hl : l ∈ subchain (f '' s)
⊢ ∃ l', l' ∈ subchain s ∧ length l = length l'

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 : List β), l ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = l
l' : List α
h₁ : l' ∈ subchain s
hl : map f l' ∈ subchain (f '' s)
⊢ ∃ l'_1, l'_1 ∈ subchain s ∧ length (map f l') = length l'_1

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 α
⊢ [] ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = []

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 ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = xs
⊢ x :: xs ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ 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 ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = xs
h : x :: xs ∈ subchain (f '' s)
⊢ ∃ l', l' ∈ subchain s ∧ 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 ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = xs
h : x ∈ f '' s ∧ xs ∈ subchain (f '' s) ∧ ∀ (b : β), b ∈ head? xs → x < b
⊢ ∃ l', l' ∈ subchain s ∧ map f l' = 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 ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = xs
x : α
hx' : x ∈ s
h₁ : xs ∈ subchain (f '' s)
h₂ : ∀ (b : β), b ∈ head? xs → f x < b
⊢ ∃ l', l' ∈ subchain s ∧ map f l' = f x :: xs

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' ∈ subchain s
hx : map f l' ∈ subchain (f '' s) → ∃ l'_1, l'_1 ∈ subchain s ∧ map f l'_1 = map f l'
h₁ : map f l' ∈ subchain (f '' s)
h₂ : ∀ (b : β), b ∈ head? (map f l') → f x < b
⊢ ∃ l'_1, l'_1 ∈ subchain s ∧ map f l'_1 = f x :: map f l'

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' ∈ subchain s
hx : map f l' ∈ subchain (f '' s) → ∃ l'_1, l'_1 ∈ subchain s ∧ map f l'_1 = map f l'
h₁ : map f l' ∈ subchain (f '' s)
h₂ : ∀ (b : β), b ∈ head? (map f l') → f x < b
⊢ ∀ (b : α), b ∈ head? l' → 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₃ : [] ∈ subchain s
hx : map f [] ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = map f []
h₁ : map f [] ∈ subchain (f '' s)
h₂ : ∀ (b : β), b ∈ head? (map f []) → f x < b
⊢ ∀ (b : α), b ∈ head? [] → x < b

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✝ ∈ subchain s
hx : map f (head✝ :: tail✝) ∈ subchain (f '' s) → ∃ l', l' ∈ subchain s ∧ map f l' = map f (head✝ :: tail✝)
h₁ : map f (head✝ :: tail✝) ∈ subchain (f '' s)
h₂ : ∀ (b : β), b ∈ head? (map f (head✝ :: tail✝)) → f x < b
⊢ ∀ (b : α), b ∈ head? (head✝ :: tail✝) → x < b

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 : List α), l ∈ subchain s → ∃ l', l' ∈ subchain (f '' s) ∧ length l = length l'

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 ∈ subchain s
⊢ ∃ l', l' ∈ subchain (f '' s) ∧ length l = length l'

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 ∈ subchain s
⊢ Chain' (fun x x_1 => x < x_1) (map f 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 ∈ subchain s
⊢ Chain' (fun a b => a < b) l

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 ∈ subchain s
⊢ ∀ (i : β), 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 ∈ subchain s
i✝ : β
e : i✝ ∈ map f l
⊢ i✝ ∈ 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 ∈ subchain s
a : α
ha : a ∈ l
e : f a ∈ map f l
⊢ f a ∈ f '' s

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 ∈ subchain s
⊢ length l = length (map f l)