Theorem: RootSystem.ext
File: Mathlib/LinearAlgebra/RootSystem/Basic.lean

tactic: suffices ∀ P₁ P₂ : RootSystem ι R M N, P₁.toLin = P₂.toLin → P₁.root = P₂.root →
    range P₁.coroot ⊆ range P₂.coroot by
  have h₁ := this P₁ P₂ he hr
  have h₂ := this P₂ P₁ he.symm hr.symm
  cases' P₁ with P₁
  cases' P₂ with P₂
  congr
  exact RootPairing.ext he hr (le_antisymm h₁ h₂)
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
⊢ P₁ = P₂
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
⊢ ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot

tactic: clear! P₁ P₂
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
⊢ ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
⊢ ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot

tactic: rintro P₁ P₂ he hr - ⟨i, rfl⟩
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
⊢ ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
state_after: case intro
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₁.coroot i ∈ range ⇑P₂.coroot

tactic: use i
state_before: case intro
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₁.coroot i ∈ range ⇑P₂.coroot
state_after: case h
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₂.coroot i = P₁.coroot i

tactic: apply P₁.bijectiveRight.injective
state_before: case h
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₂.coroot i = P₁.coroot i
state_after: case h.a
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₁.toLin.flip (P₂.coroot i) = P₁.toLin.flip (P₁.coroot i)

tactic: apply Dual.eq_of_preReflection_mapsTo (P₁.ne_zero i) (finite_range P₁.root) P₁.span_eq_top
state_before: case h.a
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ P₁.toLin.flip (P₂.coroot i) = P₁.toLin.flip (P₁.coroot i)
state_after: case h.a.hf₁
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ (P₁.toLin.flip (P₂.coroot i)) (P₁.root i) = 2

case h.a.hf₂
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ MapsTo (⇑(preReflection (P₁.root i) (P₁.toLin.flip (P₂.coroot i)))) (range ⇑P₁.root) (range ⇑P₁.root)

case h.a.hg₁
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ (P₁.toLin.flip (P₁.coroot i)) (P₁.root i) = 2

case h.a.hg₂
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ MapsTo (⇑(preReflection (P₁.root i) (P₁.toLin.flip (P₁.coroot i)))) (range ⇑P₁.root) (range ⇑P₁.root)

tactic: have h₁ := this P₁ P₂ he hr
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
⊢ P₁ = P₂
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₁ : range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
⊢ P₁ = P₂

tactic: have h₂ := this P₂ P₁ he.symm hr.symm
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₁ : range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
⊢ P₁ = P₂
state_after: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₁ : range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₂ : range ⇑P₂.coroot ⊆ range ⇑P₁.coroot
⊢ P₁ = P₂

tactic: cases' P₁ with P₁
state_before: ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₁ : range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
h₂ : range ⇑P₂.coroot ⊆ range ⇑P₁.coroot
⊢ P₁ = P₂
state_after: case mk
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₂ : RootSystem ι R M N
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₁.root) = ⊤
he : { toRootPairing := P₁, span_eq_top := span_eq_top✝ }.toLin = P₂.toLin
hr : { toRootPairing := P₁, span_eq_top := span_eq_top✝ }.root = P₂.root
h₁ : range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝ }.coroot ⊆ range ⇑P₂.coroot
h₂ : range ⇑P₂.coroot ⊆ range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝ }.coroot
⊢ { toRootPairing := P₁, span_eq_top := span_eq_top✝ } = P₂

tactic: cases' P₂ with P₂
state_before: case mk
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₂ : RootSystem ι R M N
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₁.root) = ⊤
he : { toRootPairing := P₁, span_eq_top := span_eq_top✝ }.toLin = P₂.toLin
hr : { toRootPairing := P₁, span_eq_top := span_eq_top✝ }.root = P₂.root
h₁ : range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝ }.coroot ⊆ range ⇑P₂.coroot
h₂ : range ⇑P₂.coroot ⊆ range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝ }.coroot
⊢ { toRootPairing := P₁, span_eq_top := span_eq_top✝ } = P₂
state_after: case mk.mk
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝¹ : span R (range ⇑P₁.root) = ⊤
P₂ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₂.root) = ⊤
he :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.toLin =
    { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.toLin
hr :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.root = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.root
h₁ :
  range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot ⊆
    range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot
h₂ :
  range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot ⊆
    range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot
⊢ { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ } = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }

tactic: congr
state_before: case mk.mk
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝¹ : span R (range ⇑P₁.root) = ⊤
P₂ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₂.root) = ⊤
he :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.toLin =
    { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.toLin
hr :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.root = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.root
h₁ :
  range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot ⊆
    range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot
h₂ :
  range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot ⊆
    range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot
⊢ { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ } = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }
state_after: case mk.mk.e_toRootPairing
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝¹ : span R (range ⇑P₁.root) = ⊤
P₂ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₂.root) = ⊤
he :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.toLin =
    { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.toLin
hr :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.root = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.root
h₁ :
  range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot ⊆
    range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot
h₂ :
  range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot ⊆
    range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot
⊢ P₁ = P₂

tactic: exact RootPairing.ext he hr (le_antisymm h₁ h₂)
state_before: case mk.mk.e_toRootPairing
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
this : ∀ (P₁ P₂ : RootSystem ι R M N), P₁.toLin = P₂.toLin → P₁.root = P₂.root → range ⇑P₁.coroot ⊆ range ⇑P₂.coroot
P₁ : RootPairing ι R M N
span_eq_top✝¹ : span R (range ⇑P₁.root) = ⊤
P₂ : RootPairing ι R M N
span_eq_top✝ : span R (range ⇑P₂.root) = ⊤
he :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.toLin =
    { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.toLin
hr :
  { toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.root = { toRootPairing := P₂, span_eq_top := span_eq_top✝ }.root
h₁ :
  range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot ⊆
    range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot
h₂ :
  range ⇑{ toRootPairing := P₂, span_eq_top := span_eq_top✝ }.coroot ⊆
    range ⇑{ toRootPairing := P₁, span_eq_top := span_eq_top✝¹ }.coroot
⊢ P₁ = P₂
state_after: no goals

tactic: exact hr ▸ he ▸ P₂.coroot_root_two i
state_before: case h.a.hf₁
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ (P₁.toLin.flip (P₂.coroot i)) (P₁.root i) = 2
state_after: no goals

tactic: exact hr ▸ he ▸ P₂.mapsTo_reflection_root i
state_before: case h.a.hf₂
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ MapsTo (⇑(preReflection (P₁.root i) (P₁.toLin.flip (P₂.coroot i)))) (range ⇑P₁.root) (range ⇑P₁.root)
state_after: no goals

tactic: exact P₁.coroot_root_two i
state_before: case h.a.hg₁
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ (P₁.toLin.flip (P₁.coroot i)) (P₁.root i) = 2
state_after: no goals

tactic: exact P₁.mapsTo_reflection_root i
state_before: case h.a.hg₂
ι : Type u_1
R : Type u_2
M : Type u_3
N : Type u_4
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : _root_.Finite ι
P : RootSystem ι R M N
inst✝¹ : CharZero R
inst✝ : NoZeroSMulDivisors R M
P₁ P₂ : RootSystem ι R M N
he : P₁.toLin = P₂.toLin
hr : P₁.root = P₂.root
i : ι
⊢ MapsTo (⇑(preReflection (P₁.root i) (P₁.toLin.flip (P₁.coroot i)))) (range ⇑P₁.root) (range ⇑P₁.root)
state_after: no goals