Theorem: List.IsPrefix.filterMap
File: Mathlib/Data/List/Infix.lean

tactic: induction' l₁ with hd₁ tl₁ hl generalizing l₂
state_before: α : Type u_1
β : Type u_2
l l₁ l₂ l₃ : List α
a b : α
m n : ℕ
h : l₁ <+: l₂
f : α → Option β
⊢ filterMap f l₁ <+: filterMap f l₂
state_after: case nil
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
l₂ : List α
h : [] <+: l₂
⊢ filterMap f [] <+: filterMap f l₂

case cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
l₂ : List α
h : hd₁ :: tl₁ <+: l₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f l₂

tactic: simp only [nil_prefix, filterMap_nil]
state_before: case nil
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
l₂ : List α
h : [] <+: l₂
⊢ filterMap f [] <+: filterMap f l₂
state_after: no goals

tactic: cases' l₂ with hd₂ tl₂
state_before: case cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
l₂ : List α
h : hd₁ :: tl₁ <+: l₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f l₂
state_after: case cons.nil
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
h : hd₁ :: tl₁ <+: []
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f []

case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ :: tl₁ <+: hd₂ :: tl₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f (hd₂ :: tl₂)

tactic: simpa only using eq_nil_of_prefix_nil h
state_before: case cons.nil
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
h : hd₁ :: tl₁ <+: []
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f []
state_after: no goals

tactic: rw [cons_prefix_iff] at h
state_before: case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ :: tl₁ <+: hd₂ :: tl₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f (hd₂ :: tl₂)
state_after: case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ = hd₂ ∧ tl₁ <+: tl₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f (hd₂ :: tl₂)

tactic: rw [← @singleton_append _ hd₁ _, ← @singleton_append _ hd₂ _, filterMap_append,
  filterMap_append, h.left, prefix_append_right_inj]
state_before: case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ = hd₂ ∧ tl₁ <+: tl₂
⊢ filterMap f (hd₁ :: tl₁) <+: filterMap f (hd₂ :: tl₂)
state_after: case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ = hd₂ ∧ tl₁ <+: tl₂
⊢ filterMap f tl₁ <+: filterMap f tl₂

tactic: exact hl h.right
state_before: case cons.cons
α : Type u_1
β : Type u_2
l l₃ : List α
a b : α
m n : ℕ
f : α → Option β
hd₁ : α
tl₁ : List α
hl : ∀ {l₂ : List α}, tl₁ <+: l₂ → filterMap f tl₁ <+: filterMap f l₂
hd₂ : α
tl₂ : List α
h : hd₁ = hd₂ ∧ tl₁ <+: tl₂
⊢ filterMap f tl₁ <+: filterMap f tl₂
state_after: no goals