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 [← range_eq_top, 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 ⇑(range f).subtype.dualMap
⊢ range f.dualMap = (ker f).dualAnnihilator
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
⊢ range f.dualMap = (ker f).dualAnnihilator

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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
⊢ range f.dualMap = (ker f).dualAnnihilator
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range f.dualMap = (ker f).dualAnnihilator

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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range f.dualMap = (ker f).dualAnnihilator
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range f.dualMap = range f.rangeRestrict.dualMap

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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ (ker f).dualAnnihilator = (ker f.rangeRestrict).dualAnnihilator

tactic: rw [← range_eq_top, 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 ⇑(range f).subtype.dualMap
⊢ Function.Surjective ⇑f.rangeRestrict
state_after: no goals

tactic: calc
  _ = range ((range f).subtype.comp f.rangeRestrict).dualMap := by simp
  _ = _ := ?_
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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range f.dualMap = range f.rangeRestrict.dualMap
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range ((range f).subtype ∘ₗ f.rangeRestrict).dualMap = range f.rangeRestrict.dualMap

tactic: rw [← dualMap_comp_dualMap, 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range ((range f).subtype ∘ₗ f.rangeRestrict).dualMap = range f.rangeRestrict.dualMap
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range (range f).subtype.dualMap = ⊤

tactic: rwa [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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range (range f).subtype.dualMap = ⊤
state_after: no goals

tactic: simp
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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ range f.dualMap = range ((range f).subtype ∘ₗ f.rangeRestrict).dualMap
state_after: no goals

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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ (ker f).dualAnnihilator = (ker f.rangeRestrict).dualAnnihilator
state_after: 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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ ker f = ker f.rangeRestrict

tactic: exact (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 ⇑(range f).subtype.dualMap
rr_surj : Function.Surjective ⇑f.rangeRestrict
this : range f.rangeRestrict.dualMap = (ker f.rangeRestrict).dualAnnihilator
⊢ ker f = ker f.rangeRestrict
state_after: no goals