Theorem: List.getLast_pmap
File: Mathlib/Data/List/Basic.lean

tactic: induction' l with l_hd l_tl l_ih
state_before: ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l : List α
hl₁ : ∀ (a : α), a ∈ l → p a
hl₂ : l ≠ []
⊢ (pmap f l hl₁).getLast ⋯ = f (l.getLast hl₂) ⋯
state_after: case nil
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
hl₁ : ∀ (a : α), a ∈ [] → p a
hl₂ : [] ≠ []
⊢ (pmap f [] hl₁).getLast ⋯ = f ([].getLast hl₂) ⋯

case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯

tactic: apply (hl₂ rfl).elim
state_before: case nil
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
hl₁ : ∀ (a : α), a ∈ [] → p a
hl₂ : [] ≠ []
⊢ (pmap f [] hl₁).getLast ⋯ = f ([].getLast hl₂) ⋯
state_after: no goals

tactic: by_cases hl_tl : l_tl = []
state_before: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯
state_after: case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : l_tl = []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯

case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯

tactic: simp [hl_tl]
state_before: case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : l_tl = []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯
state_after: no goals

tactic: simp only [pmap]
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ (pmap f (l_hd :: l_tl) hl₁).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯
state_after: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ (f l_hd ⋯ :: pmap f l_tl ⋯).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯

tactic: rw [getLast_cons, l_ih _ hl_tl]
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ (f l_hd ⋯ :: pmap f l_tl ⋯).getLast ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯
state_after: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ f (l_tl.getLast hl_tl) ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯

tactic: simp only [getLast_cons hl_tl]
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
p : α → Prop
f : (a : α) → p a → β
l_hd : α
l_tl : List α
l_ih : ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []), (pmap f l_tl hl₁).getLast ⋯ = f (l_tl.getLast hl₂) ⋯
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : ¬l_tl = []
⊢ f (l_tl.getLast hl_tl) ⋯ = f ((l_hd :: l_tl).getLast hl₂) ⋯
state_after: no goals