-- Mathlib/GroupTheory/Coxeter/Length.lean
theorem length_inv (w : W) : ℓ (w⁻¹) = ℓ w

Proof state:
case h₂.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
ω : List B
hω : ω.length = cs.length w⁻¹
h'ω : w⁻¹ = cs.wordProd ω
this : cs.length (cs.wordProd ω.reverse) ≤ ω.reverse.length
⊢ cs.length w ≤ cs.length w⁻¹

Tactic:
rwa [wordProd_reverse, length_reverse, ← h'ω, hω, inv_inv] at this

Result:
no goals

Proof state:
case h₁.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
ω : List B
hω : ω.length = cs.length (cs.wordProd ω)
⊢ cs.length (cs.wordProd ω)⁻¹ ≤ cs.length (cs.wordProd ω)

Tactic:
have := cs.length_wordProd_le (List.reverse ω)

Result:
case h₁.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
ω : List B
hω : ω.length = cs.length (cs.wordProd ω)
this : cs.length (cs.wordProd ω.reverse) ≤ ω.reverse.length
⊢ cs.length (cs.wordProd ω)⁻¹ ≤ cs.length (cs.wordProd ω)

Proof state:
case h₂.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
ω : List B
hω : ω.length = cs.length w⁻¹
h'ω : w⁻¹ = cs.wordProd ω
⊢ cs.length w ≤ cs.length w⁻¹

Tactic:
have := cs.length_wordProd_le (List.reverse ω)

Result:
case h₂.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
ω : List B
hω : ω.length = cs.length w⁻¹
h'ω : w⁻¹ = cs.wordProd ω
this : cs.length (cs.wordProd ω.reverse) ≤ ω.reverse.length
⊢ cs.length w ≤ cs.length w⁻¹

Proof state:
case h₁.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
ω : List B
hω : ω.length = cs.length (cs.wordProd ω)
this : cs.length (cs.wordProd ω.reverse) ≤ ω.reverse.length
⊢ cs.length (cs.wordProd ω)⁻¹ ≤ cs.length (cs.wordProd ω)

Tactic:
rwa [wordProd_reverse, length_reverse, hω] at this

Result:
no goals

Proof state:
case h₁
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
⊢ cs.length w⁻¹ ≤ cs.length w

Tactic:
rcases cs.exists_reduced_word w with ⟨ω, hω, rfl⟩

Result:
case h₁.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
ω : List B
hω : ω.length = cs.length (cs.wordProd ω)
⊢ cs.length (cs.wordProd ω)⁻¹ ≤ cs.length (cs.wordProd ω)

Proof state:
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
⊢ cs.length w⁻¹ = cs.length w

Tactic:
apply Nat.le_antisymm

Result:
case h₁
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
⊢ cs.length w⁻¹ ≤ cs.length w

case h₂
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
⊢ cs.length w ≤ cs.length w⁻¹

Proof state:
case h₂
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
⊢ cs.length w ≤ cs.length w⁻¹

Tactic:
rcases cs.exists_reduced_word w⁻¹ with ⟨ω, hω, h'ω⟩

Result:
case h₂.intro.intro
B : Type u_1
W : Type u_2
inst✝ : Group W
M : CoxeterMatrix B
cs : CoxeterSystem M W
w : W
ω : List B
hω : ω.length = cs.length w⁻¹
h'ω : w⁻¹ = cs.wordProd ω
⊢ cs.length w ≤ cs.length w⁻¹