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) → α (↑castSucc i)
i : Fin n
y : α (↑castSucc i)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
⊢ cons a (snoc q b) = snoc (cons a q) b

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
⊢ 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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
⊢ 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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
⊢ 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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
⊢ cons a (snoc q b) i = snoc (cons a q) b i

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
⊢ snoc q b j = snoc (cons a q) b (succ j)

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
h' : ¬↑j < n
⊢ snoc q b j = snoc (cons a q) b (succ j)

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
h' : ¬↑j < n
⊢ snoc q b (last n) = snoc (cons a q) b (last (Nat.succ n))

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : i = 0
⊢ cons a (snoc q b) i = snoc (cons a q) b i

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : i = 0
⊢ cons a (snoc q b) 0 = snoc (cons a q) b 0

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
⊢ i = succ j

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
h' : ↑j < n
⊢ snoc q b j = snoc (cons a q) b (succ j)

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
h' : ↑j < n
k : Fin n := castLT j h'
jk : k = castLT j h'
⊢ snoc q b j = snoc (cons a q) b (succ j)

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this✝ : i = succ j
h' : ↑j < n
k : Fin n := castLT j h'
jk : k = castLT j h'
this : j = ↑castSucc k
⊢ snoc q b j = snoc (cons a q) b (succ j)

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this✝ : i = succ j
h' : ↑j < n
k : Fin n := castLT j h'
jk : k = castLT j h'
this : j = ↑castSucc k
⊢ (if h : ↑(↑castSucc k) < n then
      _root_.cast (_ : (fun x => β) (succ (↑castSucc (castLT (↑castSucc k) h))) = (fun x => β) (succ (↑castSucc k)))
        (q (castLT (↑castSucc k) h))
    else _root_.cast (_ : (fun x => β) (succ (last n)) = (fun x => β) (succ (↑castSucc k))) b) =
    snoc (cons a q) b (↑castSucc (succ k))

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) → α (↑castSucc i)
i✝ : Fin n
y : α (↑castSucc i✝)
z : α (last n)
β : Type u_1
a : β
q : Fin n → β
b : β
i : Fin (Nat.succ n + 1)
h : ¬i = 0
j : Fin (n + 1) := pred i h
ji : j = pred i h
this : i = succ j
h' : ↑j < n
k : Fin n := castLT j h'
jk : k = castLT j h'
⊢ j = ↑castSucc k