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

tactic: induction' l with b l ih
state_before: ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a : α
l : List α
⊢ indexOf a l = l.length ↔ ¬a ∈ l
state_after: case nil
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a : α
⊢ indexOf a [] = [].length ↔ ¬a ∈ []

case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ indexOf a (b :: l) = (b :: l).length ↔ ¬a ∈ b :: l

tactic: simp only [length, mem_cons, indexOf_cons, eq_comm]
state_before: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ indexOf a (b :: l) = (b :: l).length ↔ ¬a ∈ b :: l
state_after: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ (bif b == a then 0 else indexOf a l + 1) = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)

tactic: rw [cond_eq_if]
state_before: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ (bif b == a then 0 else indexOf a l + 1) = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)
state_after: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ (if (b == a) = true then 0 else indexOf a l + 1) = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)

tactic: split_ifs with h <;> simp at h
state_before: case cons
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
⊢ (if (b == a) = true then 0 else indexOf a l + 1) = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)
state_after: case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : b = a
⊢ False ↔ ¬(a = b ∨ a ∈ l)

case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)

tactic: exact iff_of_true rfl (not_mem_nil _)
state_before: case nil
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a : α
⊢ indexOf a [] = [].length ↔ ¬a ∈ []
state_after: no goals

tactic: exact iff_of_false (by rintro ⟨⟩) fun H => H <| Or.inl h.symm
state_before: case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : b = a
⊢ False ↔ ¬(a = b ∨ a ∈ l)
state_after: no goals

tactic: rintro ⟨⟩
state_before: ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : b = a
⊢ ¬False
state_after: no goals

tactic: simp only [Ne.symm h, false_or_iff]
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ ¬(a = b ∨ a ∈ l)
state_after: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ ¬a ∈ l

tactic: rw [← ih]
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ ¬a ∈ l
state_after: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ indexOf a l = l.length

tactic: exact succ_inj'
state_before: case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
l₁ l₂ : List α
inst✝ : DecidableEq α
a b : α
l : List α
ih : indexOf a l = l.length ↔ ¬a ∈ l
h : ¬b = a
⊢ indexOf a l + 1 = l.length + 1 ↔ indexOf a l = l.length
state_after: no goals