File: Mathlib/Algebra/Exact.lean

full_name: Function.Exact
code: /-- The maps `f` and `g` form an exact pair :
  `g y = 0` iff `y` belongs to the image of `f` -/
def Exact [Zero P] : Prop 
goal: Prop

full_name: Function.Exact.apply_apply_eq_zero
code: lemma apply_apply_eq_zero [Zero P] (h : Exact f g) (x : M) :
    g (f x) = 0 
goal: g (f x) = 0

full_name: Function.Exact.comp_eq_zero
code: lemma comp_eq_zero [Zero P] (h : Exact f g) : g.comp f = 0 
goal: g ∘ f = 0

full_name: Function.Exact.of_comp_of_mem_range
code: lemma of_comp_of_mem_range [Zero P] (h1 : g ∘ f = 0)
    (h2 : ∀ x, g x = 0 → x ∈ Set.range f) : Exact f g 
goal: Function.Exact f g

full_name: Function.Exact.comp_injective
code: lemma comp_injective [Zero P] [Zero P'] (exact : Exact f g)
    (inj : Function.Injective g') (h0 : g' 0 = 0) :
    Exact f (g' ∘ g) 
goal: Function.Exact f (g' ∘ g)

full_name: Function.Exact.of_comp_eq_zero_of_ker_in_range
code: lemma of_comp_eq_zero_of_ker_in_range [Zero P] (hc : g.comp f = 0)
    (hr : ∀ y, g y = 0 → y ∈ Set.range f) :
    Exact f g 
goal: Function.Exact f g

full_name: AddMonoidHom.exact_iff
code: lemma exact_iff :
    Exact f g ↔ ker g = range f 
goal: Function.Exact ⇑f ⇑g ↔ g.ker = f.range

full_name: AddMonoidHom.exact_of_comp_eq_zero_of_ker_le_range
code: lemma exact_of_comp_eq_zero_of_ker_le_range
    (h1 : g.comp f = 0) (h2 : ker g ≤ range f) : Exact f g 
goal: Function.Exact ⇑f ⇑g

full_name: AddMonoidHom.exact_of_comp_of_mem_range
code: lemma exact_of_comp_of_mem_range
    (h1 : g.comp f = 0) (h2 : ∀ x, g x = 0 → x ∈ range f) : Exact f g 
goal: Function.Exact ⇑f ⇑g

full_name: Function.Exact.addMonoidHom_ker_eq
code: lemma addMonoidHom_ker_eq (hfg : Exact f g) :
    ker g = range f 
goal: g.ker = f.range

full_name: Function.Exact.addMonoidHom_comp_eq_zero
code: lemma addMonoidHom_comp_eq_zero (h : Exact f g) : g.comp f = 0 
goal: g.comp f = 0

full_name: Function.Exact.of_ladder_addEquiv_of_exact
code: lemma of_ladder_addEquiv_of_exact (comm₁₂ : g₁₂.comp e₁ = AddMonoidHom.comp e₂ f₁₂)
    (comm₂₃ : g₂₃.comp e₂ = AddMonoidHom.comp e₃ f₂₃) (H : Exact f₁₂ f₂₃) : Exact g₁₂ g₂₃ 
goal: Function.Exact ⇑g₁₂ ⇑g₂₃

full_name: Function.Exact.of_ladder_addEquiv_of_exact'
code: lemma of_ladder_addEquiv_of_exact' (comm₁₂ : g₁₂.comp e₁ = AddMonoidHom.comp e₂ f₁₂)
    (comm₂₃ : g₂₃.comp e₂ = AddMonoidHom.comp e₃ f₂₃) (H : Exact g₁₂ g₂₃) : Exact f₁₂ f₂₃ 
goal: Function.Exact ⇑f₁₂ ⇑f₂₃

full_name: Function.Exact.iff_of_ladder_addEquiv
code: lemma iff_of_ladder_addEquiv (comm₁₂ : g₁₂.comp e₁ = AddMonoidHom.comp e₂ f₁₂)
    (comm₂₃ : g₂₃.comp e₂ = AddMonoidHom.comp e₃ f₂₃) : Exact g₁₂ g₂₃ ↔ Exact f₁₂ f₂₃ 
goal: Function.Exact ⇑g₁₂ ⇑g₂₃ ↔ Function.Exact ⇑f₁₂ ⇑f₂₃

full_name: LinearMap.exact_iff
code: lemma exact_iff :
    Exact f g ↔ LinearMap.ker g = LinearMap.range f 
goal: Function.Exact ⇑f ⇑g ↔ LinearMap.ker g = LinearMap.range f

full_name: LinearMap.exact_of_comp_eq_zero_of_ker_le_range
code: lemma exact_of_comp_eq_zero_of_ker_le_range
    (h1 : g ∘ₗ f = 0) (h2 : ker g ≤ range f) : Exact f g 
goal: Function.Exact ⇑f ⇑g

full_name: LinearMap.exact_of_comp_of_mem_range
code: lemma exact_of_comp_of_mem_range
    (h1 : g ∘ₗ f = 0) (h2 : ∀ x, g x = 0 → x ∈ range f) : Exact f g 
goal: Function.Exact ⇑f ⇑g

full_name: LinearMap.exact_subtype_mkQ
code: lemma exact_subtype_mkQ (Q : Submodule R N) :
    Exact (Submodule.subtype Q) (Submodule.mkQ Q) 
goal: Function.Exact ⇑Q.subtype ⇑Q.mkQ

full_name: LinearMap.exact_map_mkQ_range
code: lemma exact_map_mkQ_range (f : M →ₗ[R] N) :
    Exact f (Submodule.mkQ (range f)) 
goal: Function.Exact ⇑f ⇑(LinearMap.range f).mkQ

full_name: LinearMap.exact_subtype_ker_map
code: lemma exact_subtype_ker_map (g : N →ₗ[R] P) :
    Exact (Submodule.subtype (ker g)) g 
goal: Function.Exact ⇑(LinearMap.ker g).subtype ⇑g

full_name: LinearEquiv.conj_exact_iff_exact
code: lemma LinearEquiv.conj_exact_iff_exact (e : N ≃ₗ[R] N') :
    Function.Exact (e ∘ₗ f) (g ∘ₗ (e.symm : N' →ₗ[R] N)) ↔ Exact f g 
goal: Function.Exact ⇑(↑e ∘ₗ f) ⇑(g ∘ₗ ↑e.symm) ↔ Function.Exact ⇑f ⇑g

full_name: Function.Exact.linearMap_ker_eq
code: lemma Exact.linearMap_ker_eq (hfg : Exact f g) : ker g = range f 
goal: LinearMap.ker g = LinearMap.range f

full_name: Function.Exact.linearMap_comp_eq_zero
code: lemma Exact.linearMap_comp_eq_zero (h : Exact f g) : g.comp f = 0 
goal: g ∘ₗ f = 0

full_name: Function.Surjective.comp_exact_iff_exact
code: lemma Surjective.comp_exact_iff_exact {p : M' →ₗ[R] M} (h : Surjective p) :
    Exact (f ∘ₗ p) g ↔ Exact f g 
goal: Function.Exact ⇑(f ∘ₗ p) ⇑g ↔ Function.Exact ⇑f ⇑g

full_name: Function.Injective.comp_exact_iff_exact
code: lemma Injective.comp_exact_iff_exact {i : P →ₗ[R] P'} (h : Injective i) :
    Exact f (i ∘ₗ g) ↔ Exact f g 
goal: Function.Exact ⇑f ⇑(i ∘ₗ g) ↔ Function.Exact ⇑f ⇑g

full_name: Function.Exact.iff_of_ladder_linearEquiv
code: lemma Exact.iff_of_ladder_linearEquiv
    (h₁₂ : g₁₂ ∘ₗ e₁ = e₂ ∘ₗ f₁₂) (h₂₃ : g₂₃ ∘ₗ e₂ = e₃ ∘ₗ f₂₃) :
    Exact g₁₂ g₂₃ ↔ Exact f₁₂ f₂₃ 
goal: Function.Exact ⇑g₁₂ ⇑g₂₃ ↔ Function.Exact ⇑f₁₂ ⇑f₂₃

full_name: Function.Exact.of_ladder_linearEquiv_of_exact
code: lemma Exact.of_ladder_linearEquiv_of_exact
    (h₁₂ : g₁₂ ∘ₗ e₁ = e₂ ∘ₗ f₁₂) (h₂₃ : g₂₃ ∘ₗ e₂ = e₃ ∘ₗ f₂₃)
    (H : Exact f₁₂ f₂₃) : Exact g₁₂ g₂₃ 
goal: Function.Exact ⇑g₁₂ ⇑g₂₃

full_name: Function.Exact.splitSurjectiveEquiv
code: /-- Given an exact sequence `0 → M → N → P`, giving a section `P → N` is equivalent to giving a
splitting `N ≃ M × P`. -/
noncomputable
def Exact.splitSurjectiveEquiv (h : Function.Exact f g) (hf : Function.Injective f) :
    { l // g ∘ₗ l = .id } ≃
      { e : N ≃ₗ[R] M × P // f = e.symm ∘ₗ inl R M P ∧ g = snd R M P ∘ₗ e } 
goal: { l // g ∘ₗ l = LinearMap.id } ≃ { e // f = ↑e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ ↑e }

full_name: Function.Exact.splitInjectiveEquiv
code: /-- Given an exact sequence `M → N → P → 0`, giving a retraction `N → M` is equivalent to giving a
splitting `N ≃ M × P`. -/
noncomputable
def Exact.splitInjectiveEquiv
    {R M N P} [Semiring R] [AddCommGroup M] [AddCommGroup N]
    [AddCommGroup P] [Module R M] [Module R N] [Module R P] {f : M →ₗ[R] N} {g : N →ₗ[R] P}
    (h : Function.Exact f g) (hg : Function.Surjective g) :
    { l // l ∘ₗ f = .id } ≃
      { e : N ≃ₗ[R] M × P // f = e.symm ∘ₗ inl R M P ∧ g = snd R M P ∘ₗ e } 
goal: { l // l ∘ₗ f = LinearMap.id } ≃ { e // f = ↑e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ ↑e }

full_name: Function.Exact.split_tfae'
code: theorem Exact.split_tfae' (h : Function.Exact f g) :
    List.TFAE [
      Function.Injective f ∧ ∃ l, g ∘ₗ l = LinearMap.id,
      Function.Surjective g ∧ ∃ l, l ∘ₗ f = LinearMap.id,
      ∃ e : N ≃ₗ[R] M × P, f = e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ e] 
goal: [Function.Injective ⇑f ∧ ∃ l, g ∘ₗ l = LinearMap.id, Function.Surjective ⇑g ∧ ∃ l, l ∘ₗ f = LinearMap.id,
    ∃ e, f = ↑e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ ↑e].TFAE

full_name: Function.Exact.split_tfae
code: /-- Equivalent characterizations of split exact sequences. Also known as the **Splitting lemma**. -/
theorem Exact.split_tfae
    {R M N P} [Semiring R] [AddCommGroup M] [AddCommGroup N]
    [AddCommGroup P] [Module R M] [Module R N] [Module R P] {f : M →ₗ[R] N} {g : N →ₗ[R] P}
    (h : Function.Exact f g) (hf : Function.Injective f) (hg : Function.Surjective g) :
    List.TFAE [
      ∃ l, g ∘ₗ l = LinearMap.id,
      ∃ l, l ∘ₗ f = LinearMap.id,
      ∃ e : N ≃ₗ[R] M × P, f = e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ e] 
goal: [∃ l, g ∘ₗ l = LinearMap.id, ∃ l, l ∘ₗ f = LinearMap.id,
    ∃ e, f = ↑e.symm ∘ₗ LinearMap.inl R M P ∧ g = LinearMap.snd R M P ∘ₗ ↑e].TFAE

full_name: Function.Exact.inr_fst
code: lemma Exact.inr_fst : Function.Exact (LinearMap.inr R M N) (LinearMap.fst R M N) 
goal: Function.Exact ⇑(LinearMap.inr R M N) ⇑(LinearMap.fst R M N)

full_name: Function.Exact.inl_snd
code: lemma Exact.inl_snd : Function.Exact (LinearMap.inl R M N) (LinearMap.snd R M N) 
goal: Function.Exact ⇑(LinearMap.inl R M N) ⇑(LinearMap.snd R M N)

full_name: Function.Exact.exact_mapQ_iff
code: /-- A necessary and sufficient condition for an exact sequence to descend to a quotient. -/
lemma Exact.exact_mapQ_iff {f : M →ₗ[R] N} {g : N →ₗ[R] P}
    (hfg : Exact f g) {p q r} (hpq : p ≤ comap f q) (hqr : q ≤ comap g r) :
    Exact (mapQ p q f hpq) (mapQ q r g hqr) ↔ range g ⊓ r ≤ map g q 
goal: Function.Exact ⇑(p.mapQ q f hpq) ⇑(q.mapQ r g hqr) ↔ LinearMap.range g ⊓ r ≤ Submodule.map g q