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

tactic: induction' l with l_hd l_tl l_ih
state_before: ι : Type ?u.331190
α✝ : Type u
β✝ : Type v
γ : Type w
δ : Type x
l₁ l₂ : List α✝
α : Type u_1
β : Type u_2
p : α → Prop
f : (a : α) → p a → β
l : List α
hl₁ : ∀ (a : α), a ∈ l → p a
hl₂ : l ≠ []
⊢ getLast (pmap f l hl₁) (_ : ¬pmap f l hl₁ = []) = f (getLast l hl₂) (_ : p (getLast l hl₂))

tactic: apply (hl₂ rfl).elim
state_before: case nil
ι : Type ?u.331190
α✝ : Type u
β✝ : Type v
γ : Type w
δ : Type x
l₁ l₂ : List α✝
α : Type u_1
β : Type u_2
p : α → Prop
f : (a : α) → p a → β
l : List α
hl₁✝ : ∀ (a : α), a ∈ l → p a
hl₂✝ : l ≠ []
hl₁ : ∀ (a : α), a ∈ [] → p a
hl₂ : [] ≠ []
⊢ getLast (pmap f [] hl₁) (_ : ¬pmap f [] hl₁ = []) = f (getLast [] hl₂) (_ : p (getLast [] hl₂))

tactic: by_cases hl_tl : l_tl = []
state_before: case cons
ι : Type ?u.331190
α✝ : Type u
β✝ : Type v
γ : Type w
δ : Type x
l₁ l₂ : List α✝
α : Type u_1
β : Type u_2
p : α → Prop
f : (a : α) → p a → β
l : List α
hl₁✝ : ∀ (a : α), a ∈ l → p a
hl₂✝ : l ≠ []
l_hd : α
l_tl : List α
l_ih :
  ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []),
    getLast (pmap f l_tl hl₁) (_ : ¬pmap f l_tl hl₁ = []) = f (getLast l_tl hl₂) (_ : p (getLast l_tl hl₂))
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
⊢ getLast (pmap f (l_hd :: l_tl) hl₁) (_ : ¬pmap f (l_hd :: l_tl) hl₁ = []) =
    f (getLast (l_hd :: l_tl) hl₂) (_ : p (getLast (l_hd :: l_tl) hl₂))

tactic: simp [hl_tl]
state_before: case pos
ι : Type ?u.331190
α✝ : Type u
β✝ : Type v
γ : Type w
δ : Type x
l₁ l₂ : List α✝
α : Type u_1
β : Type u_2
p : α → Prop
f : (a : α) → p a → β
l : List α
hl₁✝ : ∀ (a : α), a ∈ l → p a
hl₂✝ : l ≠ []
l_hd : α
l_tl : List α
l_ih :
  ∀ (hl₁ : ∀ (a : α), a ∈ l_tl → p a) (hl₂ : l_tl ≠ []),
    getLast (pmap f l_tl hl₁) (_ : ¬pmap f l_tl hl₁ = []) = f (getLast l_tl hl₂) (_ : p (getLast l_tl hl₂))
hl₁ : ∀ (a : α), a ∈ l_hd :: l_tl → p a
hl₂ : l_hd :: l_tl ≠ []
hl_tl : l_tl = []
⊢ getLast (pmap f (l_hd :: l_tl) hl₁) (_ : ¬pmap f (l_hd :: l_tl) hl₁ = []) =
    f (getLast (l_hd :: l_tl) hl₂) (_ : p (getLast (l_hd :: l_tl) hl₂))

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

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

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