Theorem: Matrix.vecAlt1_vecAppend
File: Mathlib/Data/Fin/VecNotation.lean

tactic: ext i
state_before: α : Type u
m n o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (n + 1) → α
⊢ vecAlt1 ⋯ (vecAppend ⋯ v v) = v ∘ bit1
state_after: case h
α : Type u
m n o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (n + 1) → α
i : Fin (n + 1)
⊢ vecAlt1 ⋯ (vecAppend ⋯ v v) i = (v ∘ bit1) i

tactic: simp_rw [Function.comp, vecAlt1, vecAppend_eq_ite]
state_before: case h
α : Type u
m n o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (n + 1) → α
i : Fin (n + 1)
⊢ vecAlt1 ⋯ (vecAppend ⋯ v v) i = (v ∘ bit1) i
state_after: case h
α : Type u
m n o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (n + 1) → α
i : Fin (n + 1)
⊢ (if h : ↑i + ↑i + 1 < n + 1 then v ⟨↑i + ↑i + 1, ⋯⟩ else v ⟨↑i + ↑i + 1 - (n + 1), ⋯⟩) = v (bit1 i)

tactic: cases' i with i hi
state_before: case h.zero
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
i : Fin (0 + 1)
⊢ (if h : ↑i + ↑i + 1 < 0 + 1 then v ⟨↑i + ↑i + 1, ⋯⟩ else v ⟨↑i + ↑i + 1 - (0 + 1), ⋯⟩) = v (bit1 i)
state_after: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
i : ℕ
hi : i < 0 + 1
⊢ (if h : ↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1 < 0 + 1 then v ⟨↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1, ⋯⟩
    else v ⟨↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨i, hi⟩)

tactic: simp only [Nat.zero_eq, Nat.zero_add, Nat.lt_one_iff] at hi
state_before: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
i : ℕ
hi : i < 0 + 1
⊢ (if h : ↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1 < 0 + 1 then v ⟨↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1, ⋯⟩
    else v ⟨↑⟨i, hi⟩ + ↑⟨i, hi⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨i, hi⟩)
state_after: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
i : ℕ
hi✝ : i < 0 + 1
hi : i = 0
⊢ (if h : ↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1 < 0 + 1 then v ⟨↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1, ⋯⟩
    else v ⟨↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨i, hi✝⟩)

tactic: subst i
state_before: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
i : ℕ
hi✝ : i < 0 + 1
hi : i = 0
⊢ (if h : ↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1 < 0 + 1 then v ⟨↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1, ⋯⟩
    else v ⟨↑⟨i, hi✝⟩ + ↑⟨i, hi✝⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨i, hi✝⟩)
state_after: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
hi : 0 < 0 + 1
⊢ (if h : ↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1 < 0 + 1 then v ⟨↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1, ⋯⟩
    else v ⟨↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨0, hi⟩)

tactic: rfl
state_before: case h.zero.mk
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
v : Fin (0 + 1) → α
hi : 0 < 0 + 1
⊢ (if h : ↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1 < 0 + 1 then v ⟨↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1, ⋯⟩
    else v ⟨↑⟨0, hi⟩ + ↑⟨0, hi⟩ + 1 - (0 + 1), ⋯⟩) =
    v (bit1 ⟨0, hi⟩)
state_after: no goals

tactic: split_ifs with h <;> simp_rw [bit1, bit0] <;> congr
state_before: case h.succ
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
⊢ (if h : ↑i + ↑i + 1 < n + 1 + 1 then v ⟨↑i + ↑i + 1, ⋯⟩ else v ⟨↑i + ↑i + 1 - (n + 1 + 1), ⋯⟩) = v (bit1 i)
state_after: case pos.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : ↑i + ↑i + 1 < n + 1 + 1
⊢ ↑i + ↑i + 1 = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)

case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : ¬↑i + ↑i + 1 < n + 1 + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)

tactic: simp [Nat.mod_eq_of_lt, h]
state_before: case pos.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : ↑i + ↑i + 1 < n + 1 + 1
⊢ ↑i + ↑i + 1 = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)
state_after: no goals

tactic: rw [Fin.val_mk, not_lt] at h
state_before: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : ¬↑i + ↑i + 1 < n + 1 + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)
state_after: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)

tactic: simp only [Fin.ext_iff, Fin.val_add, Fin.val_mk, Nat.mod_add_mod, Fin.val_one,
  Nat.mod_eq_sub_mod h, show 1 % (n + 2) = 1 from Nat.mod_eq_of_lt (by omega)]
state_before: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = ((↑i + ↑i) % (n + 1 + 1) + 1 % (n + 1 + 1)) % (n + 1 + 1)
state_after: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = (↑i + ↑i + 1 - (n + 1 + 1)) % (n + 1 + 1)

tactic: refine (Nat.mod_eq_of_lt ?_).symm
state_before: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) = (↑i + ↑i + 1 - (n + 1 + 1)) % (n + 1 + 1)
state_after: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) < n + 1 + 1

tactic: omega
state_before: case neg.e_a.e_val
α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ ↑i + ↑i + 1 - (n + 1 + 1) < n + 1 + 1
state_after: no goals

tactic: omega
state_before: α : Type u
m o : ℕ
m' : Type u_1
n' : Type u_2
o' : Type u_3
n : ℕ
v : Fin (n + 1 + 1) → α
i : Fin (n + 1 + 1)
h : n + 1 + 1 ≤ ↑i + ↑i + 1
⊢ 1 < n + 2
state_after: no goals