Theorem: LinearMap.range_dualMap_eq_dualAnnihilator_ker_of_subtype_range_surjective
File: Mathlib/LinearAlgebra/Dual.lean

tactic: have rr_surj : Function.Surjective f.rangeRestrict := by
  rw [← LinearMap.range_eq_top, LinearMap.range_rangeRestrict]
state_before: R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
⊢ range (dualMap f) = dualAnnihilator (ker f)

tactic: have := range_dualMap_eq_dualAnnihilator_ker_of_surjective f.rangeRestrict rr_surj
state_before: R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
⊢ range (dualMap f) = dualAnnihilator (ker f)

tactic: convert this using 1
state_before: R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ range (dualMap f) = dualAnnihilator (ker f)

tactic: rw [← LinearMap.range_eq_top, LinearMap.range_rangeRestrict]
state_before: R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
⊢ Function.Surjective ↑(rangeRestrict f)

tactic: change LinearMap.range
  ((Submodule.subtype <| LinearMap.range f).comp f.rangeRestrict).dualMap = _
state_before: case h.e'_2
R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ range (dualMap f) = range (dualMap (rangeRestrict f))

tactic: rw [← LinearMap.dualMap_comp_dualMap, LinearMap.range_comp_of_range_eq_top]
state_before: case h.e'_2
R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ range (dualMap (comp (Submodule.subtype (range f)) (rangeRestrict f))) = range (dualMap (rangeRestrict f))

tactic: rwa [LinearMap.range_eq_top]
state_before: case h.e'_2.hf
R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ range (dualMap (Submodule.subtype (range f))) = ⊤

tactic: apply congr_arg
state_before: case h.e'_3
R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ dualAnnihilator (ker f) = dualAnnihilator (ker (rangeRestrict f))

tactic: exact (LinearMap.ker_rangeRestrict f).symm
state_before: case h.e'_3.h
R : Type u_1
M : Type u_2
M' : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup M'
inst✝ : Module R M'
f : M →ₗ[R] M'
hf : Function.Surjective ↑(dualMap (Submodule.subtype (range f)))
rr_surj : Function.Surjective ↑(rangeRestrict f)
this : range (dualMap (rangeRestrict f)) = dualAnnihilator (ker (rangeRestrict f))
⊢ ker f = ker (rangeRestrict f)