Zulip Chat Archive

Stream: Is there code for X?

Topic: cokernel_lift_iso_kernel_desc


Andrew Yang (Feb 20 2022 at 10:32):

Do we have this canonical iso somewhere? Or that this is simply not true?
I don't have a good way to construct the inverse map though.

noncomputable
def cokernel_lift_iso_kernel_desc {V : Type*} [category V] [abelian V]
  {A B C : V} (f : A  B) (g : B  C) (w : f  g = 0) :
  cokernel (kernel.lift g f w)  kernel (cokernel.desc f g w) := sorry

Riccardo Brasca (Feb 20 2022 at 10:33):

This looks very similar to what I've been doing for derived functors. Let me check if it is actually identical.

Riccardo Brasca (Feb 20 2022 at 10:33):

What are you working on?

Andrew Yang (Feb 20 2022 at 10:34):

I'm constructing projective replacements of bounded cochain complexes.

Riccardo Brasca (Feb 20 2022 at 10:43):

I didn't prove this one, but you can have a look here.

Riccardo Brasca (Feb 20 2022 at 10:43):

I think you can do it using pseudoelements

Riccardo Brasca (Feb 20 2022 at 10:43):

You have the morphism in one direction, right?

Riccardo Brasca (Feb 20 2022 at 10:50):

(My file is a mess, I know. I will clean it once it's sorry free)

Andrew Yang (Feb 20 2022 at 10:51):

The morphism is just
cokernel.desc _ (kernel.lift _ (kernel.ι _ ≫ cokernel.π _) (by simp)) (by { ext, simp }).
Yeah, I'm also fiddling with pseudoelements. Not sure if there is a cleaner proof though.

Markus Himmel (Feb 20 2022 at 10:53):

The morphism is also equal to kernel.lift _ (cokernel.desc _ (kernel.ι g ≫ cokernel.π _) (by simp)) (by { ext, simp }), and I think using one way you can show that it is mono, and with the other way that it is epi.

Markus Himmel (Feb 20 2022 at 11:24):

(deleted)

Markus Himmel (Feb 20 2022 at 11:49):

Here's a full proof without pseudoelements:

import category_theory.abelian.basic

noncomputable theory

open category_theory
open category_theory.limits

variables {V : Type*} [category V] [abelian V]
variables {A B C : V} (f : A  B) (g : B  C) (w : f  g = 0)

def cokernel_lift_to_kernel_desc₁ : cokernel (kernel.lift g f w)  kernel (cokernel.desc f g w) :=
kernel.lift _ (cokernel.desc _ (kernel.ι g  cokernel.π _) (by simp)) (by { ext, simp })

def cokernel_lift_to_kernel_desc₂ : cokernel (kernel.lift g f w)  kernel (cokernel.desc f g w) :=
cokernel.desc _ (kernel.lift _ (kernel.ι g  cokernel.π _) (by simp)) (by { ext, simp })

lemma cokernel_lift_to_kernel_desc_eq :
  cokernel_lift_to_kernel_desc₁ f g w = cokernel_lift_to_kernel_desc₂ f g w :=
by { ext, simp [cokernel_lift_to_kernel_desc₁, cokernel_lift_to_kernel_desc₂] }

instance : mono (cokernel.desc (kernel.lift g f w) (kernel.ι g  cokernel.π f) (by simp)) :=
begin
  let x := kernel.lift g f w,
  let t := (cokernel.desc (kernel.lift g f w) (kernel.ι g  cokernel.π f) (by simp)),
  suffices : is_colimit (pushout_cocone.mk t (cokernel.π f) _ : pushout_cocone (cokernel.π x) (kernel.ι g)),
  { exact abelian.mono_inl_of_is_colimit _ _ this,
    simp },
  refine pushout_cocone.is_colimit_aux' _ (λ s, _),
  refine cokernel.desc f s.inr _, _, _, λ m w w', _⟩⟩,
  { rw [ kernel.lift_ι g f w, category.assoc,  s.condition,  category.assoc, cokernel.condition,
      zero_comp] },
  { apply (cancel_epi (cokernel.π x)).1,
    simp only [s.condition, cokernel.π_desc, category.assoc, pushout_cocone.mk_inl,
      cokernel.π_desc_assoc] },
  { simp only [cokernel.π_desc, pushout_cocone.mk_inr] },
  { apply (cancel_epi (cokernel.π f)).1,
    simpa only [cokernel.π_desc] using w' }
end

instance : epi (kernel.lift (cokernel.desc f g w) (kernel.ι g  cokernel.π f) (by simp)) :=
begin
  let x := cokernel.desc f g w,
  let t := (kernel.lift (cokernel.desc f g w) (kernel.ι g  cokernel.π f)
    (by simp only [category.assoc, cokernel.π_desc, kernel.condition])),
  suffices : is_limit (pullback_cone.mk t (kernel.ι g) _ : pullback_cone (kernel.ι x) (cokernel.π f)),
  { exact abelian.epi_fst_of_is_limit _ _ this,
    simp only [kernel.lift_ι] },
  refine pullback_cone.is_limit_aux' _ (λ s, _),
  refine kernel.lift g s.snd _, _, _, λ m w w', _⟩⟩,
  { rw [ cokernel.π_desc f g w,  category.assoc,  s.condition, category.assoc, kernel.condition,
      comp_zero] },
  { apply (cancel_mono (kernel.ι x)).1,
    simp only [s.condition, kernel.lift_ι, category.assoc, pullback_cone.mk_fst,
      kernel.lift_ι_assoc] },
  { simp only [kernel.lift_ι, pullback_cone.mk_snd] },
  { apply (cancel_mono (kernel.ι g)).1,
    simpa only [kernel.lift_ι] using w' }
end

instance mono_cokernel_lift_to_kernel_desc₁ : mono (cokernel_lift_to_kernel_desc₁ f g w) :=
kernel.lift_mono _ _ _

instance epi_cokernel_lift_to_kernel_desc₁ : epi (cokernel_lift_to_kernel_desc₁ f g w) :=
begin
  rw cokernel_lift_to_kernel_desc_eq,
  exact cokernel.desc_epi _ _ _
end

instance : is_iso (cokernel_lift_to_kernel_desc₁ f g w) :=
is_iso_of_mono_of_epi _

noncomputable
def cokernel_lift_iso_kernel_desc {V : Type*} [category V] [abelian V]
  {A B C : V} (f : A  B) (g : B  C) (w : f  g = 0) :
  cokernel (kernel.lift g f w)  kernel (cokernel.desc f g w) :=
as_iso (cokernel_lift_to_kernel_desc₁ f g w)

Adam Topaz (Feb 20 2022 at 14:25):

@Andrew Yang https://leanprover.zulipchat.com/#narrow/stream/267928-condensed-mathematics/topic/LES.20for.20Ext/near/272419447

Adam Topaz (Feb 20 2022 at 15:20):

So is everyone ready to change the definition of homology now?

Riccardo Brasca (Feb 20 2022 at 15:49):

I am in favor of changing it, but we already use quite a lot in the LTE. I don't know how much work a refactor would be

Adam Topaz (Feb 20 2022 at 15:55):

We should at least add the API obtained by identifying it with a cokernel or kernel, similarly to the lemmas in the code under the link I posted

Adam Topaz (Feb 20 2022 at 15:55):

That would make it much more pleasant to work with IMO

Adam Topaz (Feb 20 2022 at 20:42):

This should help: #12171

Riccardo Brasca (Feb 20 2022 at 21:10):

I am adding the file to the LTE (shamelessly of course, but you're listed as the author).

Riccardo Brasca (Feb 20 2022 at 21:32):

I am already lost trying to use your constructions :D Do you see an easy way of providing the following?

def left_derived.zero_to_self_obj_hom [enough_projectives C] {X : C}
  (P : ProjectiveResolution X) : (F.left_derived 0).obj X  F.obj X

Adam Topaz (Feb 20 2022 at 22:07):

Perhaps using homology.desc'? I'm away from my computer, so I can't check

Riccardo Brasca (Feb 20 2022 at 22:09):

I mean, I already have it with the current API, it's just to play with what you did

Adam Topaz (Feb 20 2022 at 22:09):

If you want to map out of homology, you can use homology.desc' and if you want to map into it, use homology.lift

Riccardo Brasca (Feb 21 2022 at 00:00):

Something like

def left_derived.zero_to_self_obj_hom [enough_projectives C] {X : C}
  (P : ProjectiveResolution X) : (F.left_derived 0).obj X  F.obj X :=
(left_derived_obj_iso F 0 P).hom  homology.desc' _ _ _ (kernel.ι _  (F.map (P.π.f 0)))
begin
  { have : (complex_shape.down ).rel 1 0 := rfl,
    rw [kernel.lift_ι_assoc, homological_complex.d_to_eq _ this, map_homological_complex_obj_d,
      category.assoc,  functor.map_comp],
    simp },
end
 F.map (𝟙 _)

works (I don't know if using P is a good idea or not). In any case naturality of this morphism seems a pain. I will have a closer look tomorrow.

Adam Topaz (Feb 21 2022 at 17:41):

@Riccardo Brasca I added the lemmas you asked for in #12171 .
homology.map is pretty clunky to work with. Maybe we should think about (eventually) redefining homology.map to be, e.g.
homology.desc' _ _ _ (homology.lift _ _ _ (kernel.ι _ ≫ β.left ≫ cokernel.π _) _) _.

Adam Topaz (Feb 21 2022 at 17:43):

Note that the proofs that switch between homology.desc' ... (homology.lift ...) and homology.lift ... (homology.desc' ...) are now just a simple ext, simp game.

Adam Topaz (Feb 21 2022 at 17:44):

This should make the naturality of your map pretty simple to prove I think.

Riccardo Brasca (Feb 21 2022 at 17:52):

Thanks!!

Adam Topaz (Feb 21 2022 at 17:54):

Adam Topaz said:

This should make the naturality of your map pretty simple to prove I think.

Assuming you define it using homology.desc', of course!

Riccardo Brasca (Feb 21 2022 at 17:56):

I will do it later, but I agree it should be easy now.

Riccardo Brasca (Feb 21 2022 at 21:08):

I confirm it's now easy


Last updated: Dec 20 2023 at 11:08 UTC