Theorem: List.Chain.induction
File: Mathlib/Data/List/Chain.lean

tactic: induction' l with _ _ l_ih generalizing a
state_before: α : Type u
β : Type v
R r : α → α → Prop
l✝ l₁ l₂ : List α
a b : α
p : α → Prop
l : List α
h : Chain r a l
hb : (a :: l).getLast ⋯ = b
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
⊢ ∀ (i : α), i ∈ a :: l → p i
state_after: case nil
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
a : α
h : Chain r a []
hb : [a].getLast ⋯ = b
⊢ ∀ (i : α), i ∈ [a] → p i

case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : Chain r a (head✝ :: tail✝)
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i ∈ a :: head✝ :: tail✝ → p i

tactic: cases hb
state_before: case nil
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
a : α
h : Chain r a []
hb : [a].getLast ⋯ = b
⊢ ∀ (i : α), i ∈ [a] → p i
state_after: case nil.refl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
a : α
h : Chain r a []
final : p ([a].getLast ⋯)
⊢ ∀ (i : α), i ∈ [a] → p i

tactic: simpa using final
state_before: case nil.refl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
a : α
h : Chain r a []
final : p ([a].getLast ⋯)
⊢ ∀ (i : α), i ∈ [a] → p i
state_after: no goals

tactic: rw [chain_cons] at h
state_before: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : Chain r a (head✝ :: tail✝)
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i ∈ a :: head✝ :: tail✝ → p i
state_after: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i ∈ a :: head✝ :: tail✝ → p i

tactic: simp only [mem_cons]
state_before: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i ∈ a :: head✝ :: tail✝ → p i
state_after: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i = a ∨ i = head✝ ∨ i ∈ tail✝ → p i

tactic: rintro _ (rfl | H)
state_before: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
⊢ ∀ (i : α), i = a ∨ i = head✝ ∨ i ∈ tail✝ → p i
state_after: case cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
i✝ : α
h : r i✝ head✝ ∧ Chain r head✝ tail✝
hb : (i✝ :: head✝ :: tail✝).getLast ⋯ = b
⊢ p i✝

case cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
i✝ : α
H : i✝ = head✝ ∨ i✝ ∈ tail✝
⊢ p i✝

tactic: apply carries h.1 (l_ih h.2 hb _ (mem_cons.2 (Or.inl rfl)))
state_before: case cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
i✝ : α
h : r i✝ head✝ ∧ Chain r head✝ tail✝
hb : (i✝ :: head✝ :: tail✝).getLast ⋯ = b
⊢ p i✝
state_after: no goals

tactic: apply l_ih h.2 hb _ (mem_cons.2 H)
state_before: case cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
b : α
p : α → Prop
carries : ∀ ⦃x y : α⦄, r x y → p y → p x
final : p b
head✝ : α
tail✝ : List α
l_ih : ∀ {a : α}, Chain r a tail✝ → (a :: tail✝).getLast ⋯ = b → ∀ (i : α), i ∈ a :: tail✝ → p i
a : α
h : r a head✝ ∧ Chain r head✝ tail✝
hb : (a :: head✝ :: tail✝).getLast ⋯ = b
i✝ : α
H : i✝ = head✝ ∨ i✝ ∈ tail✝
⊢ p i✝
state_after: no goals