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_3
ε : Type u_4
f : α → β → γ
l : List α
l' : List β
n : ℕ
h : l.length = l'.length
⊢ (zipWith f l l').reverse = zipWith f l.reverse l'.reverse
state_after: case nil
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
l' : List β
h : [].length = l'.length
⊢ (zipWith f [] l').reverse = zipWith f [].reverse l'.reverse

case cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
l' : List β
h : (hd :: tl).length = l'.length
⊢ (zipWith f (hd :: tl) l').reverse = zipWith f (hd :: tl).reverse l'.reverse

tactic: simp
state_before: case nil
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
l' : List β
h : [].length = l'.length
⊢ (zipWith f [] l').reverse = zipWith f [].reverse l'.reverse
state_after: no goals

tactic: cases' l' with hd' tl'
state_before: case cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
l' : List β
h : (hd :: tl).length = l'.length
⊢ (zipWith f (hd :: tl) l').reverse = zipWith f (hd :: tl).reverse l'.reverse
state_after: case cons.nil
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
h : (hd :: tl).length = [].length
⊢ (zipWith f (hd :: tl) []).reverse = zipWith f (hd :: tl).reverse [].reverse

case cons.cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
hd' : β
tl' : List β
h : (hd :: tl).length = (hd' :: tl').length
⊢ (zipWith f (hd :: tl) (hd' :: tl')).reverse = zipWith f (hd :: tl).reverse (hd' :: tl').reverse

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

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

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_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
hd' : β
tl' : List β
h : tl.length = tl'.length
⊢ (zipWith f (hd :: tl) (hd' :: tl')).reverse = zipWith f (hd :: tl).reverse (hd' :: tl').reverse
state_after: case cons.cons
α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
f : α → β → γ
n : ℕ
hd : α
tl : List α
hl : ∀ (l' : List β), tl.length = l'.length → (zipWith f tl l').reverse = zipWith f tl.reverse l'.reverse
hd' : β
tl' : List β
h : tl.length = tl'.length
this : tl.reverse.length = tl'.reverse.length
⊢ (zipWith f (hd :: tl) (hd' :: tl')).reverse = zipWith f (hd :: tl).reverse (hd' :: tl').reverse

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

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