Theorem: Module.Baer.of_injective
File: Mathlib/Algebra/Module/Injective.lean

Proof steps:
state_before: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
⊢ Baer R Q
state_after: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
tactic: intro I g
state_before: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
state_after: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
tactic: let eI := Shrink.linearEquiv I R
state_before: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
state_after: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
eR : Shrink.{v, u} R ≃ₗ[R] R := Shrink.linearEquiv R R
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
tactic: let eR := Shrink.linearEquiv R R
state_before: R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
eR : Shrink.{v, u} R ≃ₗ[R] R := Shrink.linearEquiv R R
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
state_after: case intro
R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
eR : Shrink.{v, u} R ≃ₗ[R] R := Shrink.linearEquiv R R
g' : Shrink.{v, u} R →ₗ[R] Q
hg' : ∀ (x : Shrink.{v, u} ↥I), g' ((↑eR.symm ∘ₗ Submodule.subtype I ∘ₗ ↑eI) x) = (g ∘ₗ ↑eI) x
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
tactic: obtain ⟨g', hg'⟩ := Module.Injective.out (eR.symm.toLinearMap ∘ₗ I.subtype ∘ₗ eI.toLinearMap)
    (eR.symm.injective.comp <| Subtype.val_injective.comp eI.injective) (g ∘ₗ eI.toLinearMap)
state_before: case intro
R : Type u
inst✝⁸ : Ring R
Q : Type v
inst✝⁷ : AddCommGroup Q
inst✝⁶ : Module R Q
M : Type u_1
N : Type u_2
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R M
inst✝² : Module R N
i : M →ₗ[R] N
f : M →ₗ[R] Q
inst✝¹ : Fact (Function.Injective ⇑i)
inst✝ : Small.{v, u} R
inj : Injective R Q
I : Ideal R
g : ↥I →ₗ[R] Q
eI : Shrink.{v, u} ↥I ≃ₗ[R] ↥I := Shrink.linearEquiv (↥I) R
eR : Shrink.{v, u} R ≃ₗ[R] R := Shrink.linearEquiv R R
g' : Shrink.{v, u} R →ₗ[R] Q
hg' : ∀ (x : Shrink.{v, u} ↥I), g' ((↑eR.symm ∘ₗ Submodule.subtype I ∘ₗ ↑eI) x) = (g ∘ₗ ↑eI) x
⊢ ∃ g', ∀ (x : R) (mem : x ∈ I), g' x = g ⟨x, mem⟩
state_after: no goals
tactic: exact ⟨g' ∘ₗ eR.symm.toLinearMap, fun x mx ↦ by simpa [eI, eR] using hg' (equivShrink I ⟨x, mx⟩)⟩