Theorem: List.perm_insertNth
File: Mathlib/Data/List/Perm.lean

tactic: induction' l with _ _ l_ih generalizing n
state_before: α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h : n ≤ length l
⊢ insertNth n x l ~ x :: l

tactic: cases n
state_before: case cons
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n✝ : ℕ
h✝ : n✝ ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
n : ℕ
h : n ≤ length (head✝ :: tail✝)
⊢ insertNth n x (head✝ :: tail✝) ~ x :: head✝ :: tail✝

tactic: cases n
state_before: case nil
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n✝ : ℕ
h✝ : n✝ ≤ length l
n : ℕ
h : n ≤ length []
⊢ insertNth n x [] ~ [x]

tactic: rfl
state_before: case nil.zero
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
h : zero ≤ length []
⊢ insertNth zero x [] ~ [x]

case nil.succ
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
n✝ : ℕ
h : succ n✝ ≤ length []
⊢ insertNth (succ n✝) x [] ~ [x]

tactic: cases h
state_before: case nil.succ
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
n✝ : ℕ
h : succ n✝ ≤ length []
⊢ insertNth (succ n✝) x [] ~ [x]

tactic: simp [insertNth]
state_before: case cons.zero
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
h : zero ≤ length (head✝ :: tail✝)
⊢ insertNth zero x (head✝ :: tail✝) ~ x :: head✝ :: tail✝

tactic: simp only [insertNth, modifyNthTail]
state_before: case cons.succ
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
n✝ : ℕ
h : succ n✝ ≤ length (head✝ :: tail✝)
⊢ insertNth (succ n✝) x (head✝ :: tail✝) ~ x :: head✝ :: tail✝

tactic: refine' Perm.trans (Perm.cons _ (l_ih _)) _
state_before: case cons.succ
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
n✝ : ℕ
h : succ n✝ ≤ length (head✝ :: tail✝)
⊢ head✝ :: modifyNthTail (cons x) n✝ tail✝ ~ x :: head✝ :: tail✝

tactic: apply Nat.le_of_succ_le_succ h
state_before: case cons.succ.refine'_1
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
n✝ : ℕ
h : succ n✝ ≤ length (head✝ :: tail✝)
⊢ n✝ ≤ length tail✝

tactic: apply Perm.swap
state_before: case cons.succ.refine'_2
α✝ : Type uu
β : Type vv
l₁ l₂ : List α✝
inst✝ : DecidableEq α✝
α : Type u_1
x : α
l : List α
n : ℕ
h✝ : n ≤ length l
head✝ : α
tail✝ : List α
l_ih : ∀ {n : ℕ}, n ≤ length tail✝ → insertNth n x tail✝ ~ x :: tail✝
n✝ : ℕ
h : succ n✝ ≤ length (head✝ :: tail✝)
⊢ head✝ :: x :: tail✝ ~ x :: head✝ :: tail✝