-- Mathlib/LinearAlgebra/BilinearForm/DualLattice.lean
lemma dualSubmoduleToDual_injective (hB : B.Nondegenerate) [NoZeroSMulDivisors R S]
    (N : Submodule R M) (hN : Submodule.span S (N : Set M) = ⊤) :
    Function.Injective (B.dualSubmoduleToDual N)

Proof state:
case a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ ↑x = ↑y

Tactic:
apply LinearMap.ker_eq_bot.mp hB.ker_eq_bot

Result:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ B ↑x = B ↑y

Proof state:
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ x = y

Tactic:
ext

Result:
case a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ ↑x = ↑y

Proof state:
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
⊢ Function.Injective ⇑(B.dualSubmoduleToDual N)

Tactic:
intro x y e

Result:
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ x = y

Proof state:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ Set.EqOn ⇑(B ↑x) ⇑(B ↑y) ↑N

Tactic:
intro z hz

Result:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
z : M
hz : z ∈ ↑N
⊢ (B ↑x) z = (B ↑y) z

Proof state:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ B ↑x = B ↑y

Tactic:
apply LinearMap.ext_on hN

Result:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
⊢ Set.EqOn ⇑(B ↑x) ⇑(B ↑y) ↑N

Proof state:
case a.a
R : Type u_3
S : Type u_1
M : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : Field S
inst✝⁵ : AddCommGroup M
inst✝⁴ : Algebra R S
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : IsScalarTower R S M
B : BilinForm S M
hB : B.Nondegenerate
inst✝ : NoZeroSMulDivisors R S
N : Submodule R M
hN : Submodule.span S ↑N = ⊤
x y : ↥(B.dualSubmodule N)
e : (B.dualSubmoduleToDual N) x = (B.dualSubmoduleToDual N) y
z : M
hz : z ∈ ↑N
⊢ (B ↑x) z = (B ↑y) z

Tactic:
simpa using congr_arg (algebraMap R S) (LinearMap.congr_fun e ⟨z, hz⟩)

Result:
no goals