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

tactic: ext j
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)
⊢ snoc (update p i y) x = update (snoc p x) (↑castSucc i) y

tactic: by_cases h : j.val < n
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)
j : Fin (n + 1)
⊢ snoc (update p i y) x j = update (snoc p x) (↑castSucc i) y j

tactic: rw [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)
j : Fin (n + 1)
h : ↑j < n
⊢ snoc (update p i y) x j = update (snoc p x) (↑castSucc i) y j

tactic: simp only [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)
j : Fin (n + 1)
h : ↑j < n
⊢ (if h : ↑j < n then _root_.cast (_ : α (↑castSucc (castLT j h)) = α j) (update p i y (castLT j h))
    else _root_.cast (_ : α (last n) = α j) x) =
    update (snoc p x) (↑castSucc i) y j

tactic: simp only [dif_pos]
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)
j : Fin (n + 1)
h : ↑j < n
⊢ (if h_1 : True then
      _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n)))
    else _root_.cast (_ : α (last n) = α j) x) =
    update (snoc p x) (↑castSucc i) y j

tactic: by_cases h' : j = castSucc i
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)
j : Fin (n + 1)
h : ↑j < n
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: have C1 : α (castSucc i) = α j := by 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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: have C2 : α (castSucc i) = α (castSucc (castLT j h)) := by rw [castSucc_castLT, 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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: rw [E1, E2]
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
E2 : update p i y (castLT j h) = _root_.cast C2 y
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: exact eq_rec_compose (Eq.trans C2.symm C1) C2 y
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
E2 : update p i y (castLT j h) = _root_.cast C2 y
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (_root_.cast C2 y) = _root_.cast C1 y

tactic: rw [h']
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
⊢ α (↑castSucc i) = α j

tactic: have : update (snoc p x) j (_root_.cast C1 y) j = _root_.cast C1 y := by simp
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
⊢ update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y

tactic: convert this
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
this : update (snoc p x) j (_root_.cast C1 y) j = _root_.cast C1 y
⊢ update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y

tactic: simp
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
⊢ update (snoc p x) j (_root_.cast C1 y) j = _root_.cast C1 y

tactic: exact h'.symm
state_before: case h.e'_2.h.e'_5
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
this : update (snoc p x) j (_root_.cast C1 y) j = _root_.cast C1 y
⊢ ↑castSucc i = j

tactic: exact heq_of_cast_eq (congr_arg α (Eq.symm h')) rfl
state_before: case h.e'_2.h.e'_6
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
this : update (snoc p x) j (_root_.cast C1 y) j = _root_.cast C1 y
e_5✝ : ↑castSucc i = j
⊢ HEq y (_root_.cast C1 y)

tactic: rw [castSucc_castLT, h']
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
⊢ α (↑castSucc i) = α (↑castSucc (castLT j h))

tactic: have : update p (castLT j h) (_root_.cast C2 y) (castLT j h) = _root_.cast C2 y := by simp
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
⊢ update p i y (castLT j h) = _root_.cast C2 y

tactic: convert this
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
this : update p (castLT j h) (_root_.cast C2 y) (castLT j h) = _root_.cast C2 y
⊢ update p i y (castLT j h) = _root_.cast C2 y

tactic: simp
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
⊢ update p (castLT j h) (_root_.cast C2 y) (castLT j h) = _root_.cast C2 y

tactic: simp [h, h']
state_before: case h.e'_2.h.e'_5
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
this : update p (castLT j h) (_root_.cast C2 y) (castLT j h) = _root_.cast C2 y
⊢ i = castLT j h

tactic: exact heq_of_cast_eq C2 rfl
state_before: case h.e'_2.h.e'_6
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)
j : Fin (n + 1)
h : ↑j < n
h' : j = ↑castSucc i
C1 : α (↑castSucc i) = α j
E1 : update (snoc p x) (↑castSucc i) y j = _root_.cast C1 y
C2 : α (↑castSucc i) = α (↑castSucc (castLT j h))
this : update p (castLT j h) (_root_.cast C2 y) (castLT j h) = _root_.cast C2 y
e_5✝ : i = castLT j h
⊢ HEq y (_root_.cast C2 y)

tactic: have : ¬castLT j h = i := by
  intro E
  apply h'
  rw [← E, castSucc_castLT]
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)
j : Fin (n + 1)
h : ↑j < n
h' : ¬j = ↑castSucc i
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: simp [h', this, snoc, h]
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)
j : Fin (n + 1)
h : ↑j < n
h' : ¬j = ↑castSucc i
this : ¬castLT j h = i
⊢ _root_.cast (_ : α (↑castSucc (castLT j (_ : ↑j < n))) = α j) (update p i y (castLT j (_ : ↑j < n))) =
    update (snoc p x) (↑castSucc i) y j

tactic: intro E
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)
j : Fin (n + 1)
h : ↑j < n
h' : ¬j = ↑castSucc i
⊢ ¬castLT j h = i

tactic: apply h'
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)
j : Fin (n + 1)
h : ↑j < n
h' : ¬j = ↑castSucc i
E : castLT j h = i
⊢ False

tactic: rw [← E, 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)
j : Fin (n + 1)
h : ↑j < n
h' : ¬j = ↑castSucc i
E : castLT j h = i
⊢ j = ↑castSucc i

tactic: rw [eq_last_of_not_lt h]
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)
j : Fin (n + 1)
h : ¬↑j < n
⊢ snoc (update p i y) x j = update (snoc p x) (↑castSucc i) y j

tactic: simp [Ne.symm (ne_of_lt (castSucc_lt_last i))]
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)
j : Fin (n + 1)
h : ¬↑j < n
⊢ snoc (update p i y) x (last n) = update (snoc p x) (↑castSucc i) y (last n)