Theorem: Fin.inv_partialProd_mul_eq_contractNth
File: Mathlib/Algebra/BigOperators/Fin.lean

tactic: rcases lt_trichotomy (k : ℕ) j with (h | h | h)
state_before: α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
⊢ (partialProd g (↑(succAbove (succ j)) (↑castSucc k)))⁻¹ * partialProd g (succ (↑(succAbove j) k)) =
    contractNth j (fun x x_1 => x * x_1) g k

tactic: rwa [succAbove_below, succAbove_below, partialProd_right_inv, contractNth_apply_of_lt]
state_before: case inl
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k < ↑j
⊢ (partialProd g (↑(succAbove (succ j)) (↑castSucc k)))⁻¹ * partialProd g (succ (↑(succAbove j) k)) =
    contractNth j (fun x x_1 => x * x_1) g k

tactic: assumption
state_before: case inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k < ↑j
⊢ ↑castSucc k < j

tactic: rw [castSucc_lt_iff_succ_le, succ_le_succ_iff, le_iff_val_le_val]
state_before: case inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k < ↑j
⊢ ↑castSucc (↑castSucc k) < succ j

tactic: exact le_of_lt h
state_before: case inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k < ↑j
⊢ ↑(↑castSucc k) ≤ ↑j

tactic: rwa [succAbove_below, succAbove_above, partialProd_succ, castSucc_fin_succ, ← mul_assoc,
  partialProd_right_inv, contractNth_apply_of_eq]
state_before: case inr.inl
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k = ↑j
⊢ (partialProd g (↑(succAbove (succ j)) (↑castSucc k)))⁻¹ * partialProd g (succ (↑(succAbove j) k)) =
    contractNth j (fun x x_1 => x * x_1) g k

tactic: simp [le_iff_val_le_val, ← h]
state_before: case inr.inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k = ↑j
⊢ j ≤ ↑castSucc k

tactic: rw [castSucc_lt_iff_succ_le, succ_le_succ_iff, le_iff_val_le_val]
state_before: case inr.inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k = ↑j
⊢ ↑castSucc (↑castSucc k) < succ j

tactic: exact le_of_eq h
state_before: case inr.inl.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑k = ↑j
⊢ ↑(↑castSucc k) ≤ ↑j

tactic: rwa [succAbove_above, succAbove_above, partialProd_succ, partialProd_succ,
  castSucc_fin_succ, partialProd_succ, inv_mul_cancel_left, contractNth_apply_of_gt]
state_before: case inr.inr
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑j < ↑k
⊢ (partialProd g (↑(succAbove (succ j)) (↑castSucc k)))⁻¹ * partialProd g (succ (↑(succAbove j) k)) =
    contractNth j (fun x x_1 => x * x_1) g k

tactic: exact le_iff_val_le_val.2 (le_of_lt h)
state_before: case inr.inr.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑j < ↑k
⊢ j ≤ ↑castSucc k

tactic: rw [le_iff_val_le_val, val_succ]
state_before: case inr.inr.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑j < ↑k
⊢ succ j ≤ ↑castSucc (↑castSucc k)

tactic: exact Nat.succ_le_of_lt h
state_before: case inr.inr.h
α : Type ?u.123864
β : Type ?u.123867
inst✝¹ : Monoid α
n : ℕ
G : Type u_1
inst✝ : Group G
g : Fin (n + 1) → G
j : Fin (n + 1)
k : Fin n
h : ↑j < ↑k
⊢ ↑j + 1 ≤ ↑(↑castSucc (↑castSucc k))