Theorem: List.zipWith_distrib_reverse
File: Mathlib/Data/List/Zip.lean

tactic: induction' l with hd tl hl generalizing l'
state_before: α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h : length l = length l'
⊢ reverse (zipWith f l l') = zipWith f (reverse l) (reverse l')

tactic: simp
state_before: case nil
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l'✝ : List β
n : ℕ
h✝ : length l = length l'✝
l' : List β
h : length [] = length l'
⊢ reverse (zipWith f [] l') = zipWith f (reverse []) (reverse l')

tactic: cases' l' with hd' tl'
state_before: case cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l'✝ : List β
n : ℕ
h✝ : length l = length l'✝
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
l' : List β
h : length (hd :: tl) = length l'
⊢ reverse (zipWith f (hd :: tl) l') = zipWith f (reverse (hd :: tl)) (reverse l')

tactic: simp
state_before: case cons.nil
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h✝ : length l = length l'
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
h : length (hd :: tl) = length []
⊢ reverse (zipWith f (hd :: tl) []) = zipWith f (reverse (hd :: tl)) (reverse [])

tactic: simp only [add_left_inj, length] at h
state_before: case cons.cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h✝ : length l = length l'
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
hd' : β
tl' : List β
h : length (hd :: tl) = length (hd' :: tl')
⊢ reverse (zipWith f (hd :: tl) (hd' :: tl')) = zipWith f (reverse (hd :: tl)) (reverse (hd' :: tl'))

tactic: have : tl.reverse.length = tl'.reverse.length := by simp [h]
state_before: case cons.cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h✝ : length l = length l'
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
hd' : β
tl' : List β
h : length tl = length tl'
⊢ reverse (zipWith f (hd :: tl) (hd' :: tl')) = zipWith f (reverse (hd :: tl)) (reverse (hd' :: tl'))

tactic: simp [hl _ h, zipWith_append _ _ _ _ _ this]
state_before: case cons.cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h✝ : length l = length l'
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
hd' : β
tl' : List β
h : length tl = length tl'
this : length (reverse tl) = length (reverse tl')
⊢ reverse (zipWith f (hd :: tl) (hd' :: tl')) = zipWith f (reverse (hd :: tl)) (reverse (hd' :: tl'))

tactic: simp [h]
state_before: α : Type u
β : Type u_1
γ : Type u_2
δ : Type ?u.262855
ε : Type ?u.262858
f : α → β → γ
l : List α
l' : List β
n : ℕ
h✝ : length l = length l'
hd : α
tl : List α
hl : ∀ (l' : List β), length tl = length l' → reverse (zipWith f tl l') = zipWith f (reverse tl) (reverse l')
hd' : β
tl' : List β
h : length tl = length tl'
⊢ length (reverse tl) = length (reverse tl')