Theorem: Fin.cons_snoc_eq_snoc_cons
File: Mathlib/Data/Fin/Tuple/Basic.lean

tactic: ext i
state_before: m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i : Fin n
y : α i.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
⊢ cons a (snoc q b) = snoc (cons a q) b
state_after: case h
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
⊢ cons a (snoc q b) i = snoc (cons a q) b i

tactic: by_cases h : i = 0
state_before: case h
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
⊢ cons a (snoc q b) i = snoc (cons a q) b i
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : i = 0
⊢ cons a (snoc q b) i = snoc (cons a q) b i

case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
⊢ cons a (snoc q b) i = snoc (cons a q) b i

tactic: set j := pred i h with ji
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
⊢ cons a (snoc q b) i = snoc (cons a q) b i
state_after: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
⊢ cons a (snoc q b) i = snoc (cons a q) b i

tactic: have : i = j.succ := by rw [ji, succ_pred]
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
⊢ cons a (snoc q b) i = snoc (cons a q) b i
state_after: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
⊢ cons a (snoc q b) i = snoc (cons a q) b i

tactic: rw [this, cons_succ]
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
⊢ cons a (snoc q b) i = snoc (cons a q) b i
state_after: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
⊢ snoc q b j = snoc (cons a q) b j.succ

tactic: by_cases h' : j.val < n
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
⊢ snoc q b j = snoc (cons a q) b j.succ
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ↑j < n
⊢ snoc q b j = snoc (cons a q) b j.succ

case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ¬↑j < n
⊢ snoc q b j = snoc (cons a q) b j.succ

tactic: rw [eq_last_of_not_lt h', succ_last]
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ¬↑j < n
⊢ snoc q b j = snoc (cons a q) b j.succ
state_after: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ¬↑j < n
⊢ snoc q b (last n) = snoc (cons a q) b (last n.succ)

tactic: simp
state_before: case neg
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ¬↑j < n
⊢ snoc q b (last n) = snoc (cons a q) b (last n.succ)
state_after: no goals

tactic: rw [h]
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : i = 0
⊢ cons a (snoc q b) i = snoc (cons a q) b i
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : i = 0
⊢ cons a (snoc q b) 0 = snoc (cons a q) b 0

tactic: simp [snoc, castLT]
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : i = 0
⊢ cons a (snoc q b) 0 = snoc (cons a q) b 0
state_after: no goals

tactic: rw [ji, succ_pred]
state_before: m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
⊢ i = j.succ
state_after: no goals

tactic: set k := castLT j h' with jk
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ↑j < n
⊢ snoc q b j = snoc (cons a q) b j.succ
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
⊢ snoc q b j = snoc (cons a q) b j.succ

tactic: have : j = castSucc k := by rw [jk, castSucc_castLT]
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
⊢ snoc q b j = snoc (cons a q) b j.succ
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this✝ : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
this : j = k.castSucc
⊢ snoc q b j = snoc (cons a q) b j.succ

tactic: rw [this, ← castSucc_fin_succ, snoc]
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this✝ : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
this : j = k.castSucc
⊢ snoc q b j = snoc (cons a q) b j.succ
state_after: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this✝ : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
this : j = k.castSucc
⊢ (if h : ↑k.castSucc < n then _root_.cast ⋯ (q (k.castSucc.castLT h)) else _root_.cast ⋯ b) =
    snoc (cons a q) b k.succ.castSucc

tactic: simp [pred, snoc, cons]
state_before: case pos
m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this✝ : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
this : j = k.castSucc
⊢ (if h : ↑k.castSucc < n then _root_.cast ⋯ (q (k.castSucc.castLT h)) else _root_.cast ⋯ b) =
    snoc (cons a q) b k.succ.castSucc
state_after: no goals

tactic: rw [jk, castSucc_castLT]
state_before: m n : ℕ
α : Fin (n + 1) → Type u
x : α (last n)
q✝ : (i : Fin (n + 1)) → α i
p : (i : Fin n) → α i.castSucc
i✝ : Fin n
y : α i✝.castSucc
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (n.succ + 1)
h : ¬i = 0
j : Fin (n + 1) := i.pred h
ji : j = i.pred h
this : i = j.succ
h' : ↑j < n
k : Fin n := j.castLT h'
jk : k = j.castLT h'
⊢ j = k.castSucc
state_after: no goals