Zulip Chat Archive
Stream: new members
Topic: Turning bundled homomorphism equalities into pointwise ones
Reed Mullanix (Mar 15 2021 at 04:16):
I'm playing around with some stuff regarding abelian categories, and I'm getting stuck trying to turn a proof that two homs in CommAddGroup
are equal into one that I can apply pointwise. More specifically, I have a proof F.F.map f ≫ α.app Y = α.app X ≫ G.F.map f
in my hands, and I want to be able to turn this into something of the form that (α.app Y) ((F.F.map f) x) = (G.F.map f) ((α.app X) x)
. I've tried congr_fun
, but it yells about some type mismatch with metavariables.
The code in question:
/-
Copyright (c) 2020 Reed Mullanix. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Reed Mullanix
-/
import algebra.category.Group.basic
import algebra.category.Group.abelian
import category_theory.fin_category
import category_theory.full_subcategory
import category_theory.functor_category
import category_theory.limits.shapes.finite_limits
import category_theory.preadditive
import category_theory.abelian.basic
import category_theory.abelian.exact
open AddCommGroup
open category_theory
open category_theory.limits
namespace category_theory.abelian
universes v u₁ u₂
section
variables (C : Type u₁) [category.{v} C]
variables (D : Type u₂) [category.{v} D]
/-
First, let us start by defining left exact functors, and some simple properties
-/
structure left_exact_functor :=
(F : C ⥤ D)
(preserves_finite_limits : Π {J : Type v} [𝒥 : small_category J] [@fin_category J 𝒥], by exactI preserves_limits_of_shape J F)
instance left_exact_functors : category (left_exact_functor C D):=
induced_category.category left_exact_functor.F
end
variables (C : Type u₁) [category.{v} C]
instance : preadditive (left_exact_functor C AddCommGroup.{v}) :=
{hom_group := λ F G,
{ add := λ α β,
{ app := λ X,
{ to_fun := λ g, α.app X g + β.app X g,
map_zero' := by simp,
map_add' := begin
intros x y,
simp,
exact add_add_add_comm (α.app X x) (α.app X y) (β.app X x) (β.app X y)
end
},
naturality' := begin
intros X Y f,
ext,
simp,
-- Stuck right here! This is the proof that I want to make into a pointwise one.
have α_nat := (α.naturality f),
sorry
end
},
add_assoc := _,
zero := _,
zero_add := _,
add_zero := _,
neg := _,
add_left_neg := _,
add_comm := _
},
add_comp' := _,
comp_add' := _ }
end category_theory.abelian
Johan Commelin (Mar 15 2021 at 04:52):
I don't know if there are helper lemmas for this, but you can brute force your way through this by using change
Johan Commelin (Mar 15 2021 at 04:53):
change (a >> b) x = (c >> d) x,
Johan Commelin (Mar 15 2021 at 04:53):
and then rewrite with alpha.naturality
Scott Morrison (Mar 15 2021 at 06:50):
Reed Mullanix (Mar 16 2021 at 01:00):
Managed to prove everything but there is a loooot of change
magic involved to get things to compute nicely. Feels like I'm missing some obvious tool:
/-
Copyright (c) 2020 Reed Mullanix. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Reed Mullanix
-/
import algebra.category.Group.basic
import algebra.category.Group.abelian
import category_theory.fin_category
import category_theory.full_subcategory
import category_theory.functor_category
import category_theory.limits.shapes.finite_limits
import category_theory.preadditive
import category_theory.abelian.basic
import category_theory.abelian.exact
open AddCommGroup
open category_theory
open category_theory.limits
namespace category_theory.abelian
universes v u₁ u₂
section
variables (C : Type u₁) [category.{v} C]
variables (D : Type u₂) [category.{v} D]
/-
First, let us start by defining left exact functors, and some simple properties
-/
structure left_exact_functor :=
(F : C ⥤ D)
(preserves_finite_limits : Π {J : Type v} [𝒥 : small_category J] [@fin_category J 𝒥], by exactI preserves_limits_of_shape J F)
instance left_exact_functors : category (left_exact_functor C D):=
induced_category.category left_exact_functor.F
def natural_transformation_add [preadditive D] {F G : C ⥤ D} (α β : F ⟶ G) : F ⟶ G :=
{ app := λ X, α.app X + β.app X }
end
variables (C : Type u₁) [category.{v} C]
def nat_add {F G : left_exact_functor C AddCommGroup.{v}} (α β : F ⟶ G) : F ⟶ G :=
{ app := λ X,
{ to_fun := λ g, α.app X g + β.app X g,
map_zero' := by simp,
map_add' := begin
intros x y,
simp,
exact add_add_add_comm (α.app X x) (α.app X y) (β.app X x) (β.app X y)
end
},
naturality' := begin
intros X Y f,
ext,
simp,
-- We have to do a bit of a silly dance here to get the naturality proofs to work pointwise.
have α_nat : α.app Y (F.F.map f x) = G.F.map f (α.app X x) := add_monoid_hom.congr_fun (α.naturality f) x,
have β_nat : β.app Y (F.F.map f x) = G.F.map f (β.app X x) := add_monoid_hom.congr_fun (β.naturality f) x,
rw [α_nat, β_nat]
end
}
def nat_zero {F G : left_exact_functor C AddCommGroup.{v}} : F ⟶ G :=
{ app := λ _, 0,
}
def nat_neg {F G : left_exact_functor C AddCommGroup.{v}} (α : F ⟶ G) : F ⟶ G :=
{ app := λ X,
{ to_fun := λ g, - (α.app X g),
map_zero' := by simp,
map_add' := begin
intros g₁ g₂,
simp,
rw [add_comm _ _]
end
},
naturality' := begin
intros X Y f,
ext x,
simp,
-- We have to do a bit of a silly dance here to get the naturality proofs to work pointwise.
have α_nat : α.app Y (F.F.map f x) = G.F.map f (α.app X x) := add_monoid_hom.congr_fun (α.naturality f) x,
exact α_nat
end
}
@[simp] lemma nat_add_homo {F G : left_exact_functor C AddCommGroup.{v}} (α β : F ⟶ G) (X : C) : (nat_add C α β).app X = (α.app X) + (β.app X) := begin
unfold nat_add,
ext,
simp
end
instance : preadditive (left_exact_functor C AddCommGroup.{v}) :=
{ hom_group := λ F G,
{ add := nat_add C,
add_assoc := begin
intros α β γ,
ext X g,
simp,
rw [add_assoc _ _ _]
end,
zero := nat_zero C,
zero_add := begin
intros α,
ext X g,
change (nat_add C (nat_zero C) α).app X g = α.app X g,
simp,
unfold nat_zero,
simp,
end,
add_zero := begin
intros α,
ext X g,
change (nat_add C α (nat_zero C)).app X g = α.app X g,
simp,
unfold nat_zero,
simp
end,
neg := nat_neg C,
add_left_neg := begin
intros α,
ext X g,
change (nat_add C (nat_neg C α) α).app X g = 0,
simp,
unfold nat_neg,
simp
end,
add_comm := begin
intros α β,
ext X g,
change (nat_add C α β).app X g = (nat_add C β α).app X g,
simp,
rw [add_comm _ _]
end
},
add_comp' := begin
intros F G H α β γ,
ext X g,
-- Even more golf to get this to a place where simp can handle it
change γ.app X ((nat_add C α β).app X g) = ((nat_add C (α ≫ γ) (β ≫ γ)).app X) g,
simp,
change γ.app X (α.app X g) + γ.app X (β.app X g) = γ.app X (α.app X g) + γ.app X (β.app X g),
refl
end,
comp_add' := begin
intros F G H α β γ,
ext X g,
change (nat_add C β γ).app X (α.app X g) = (nat_add C (α ≫ β) (α ≫ γ)).app X g,
simp,
change β.app X (α.app X g) + γ.app X (α.app X g) = β.app X (α.app X g) + γ.app X (α.app X g),
refl
end
}
end category_theory.abelian
Scott Morrison (Mar 16 2021 at 01:11):
Likely we can add a lemma (even with @[simp]
) for any category where the morphisms have a function coercion, for the "naturality applied at a point" statement. This may be less painful.
Scott Morrison (Mar 16 2021 at 01:14):
Hmm, maybe you can't make it that general.
Reed Mullanix (Mar 16 2021 at 01:14):
Seems reasonable to me, but I'm pretty inexperienced with exactly how/when lean decides to compute things down.
Reed Mullanix (Mar 16 2021 at 01:15):
Maybe something about concrete categories could work?
Scott Morrison (Mar 16 2021 at 01:15):
In any case, doing it generally is probably best punted until someone works out how to do enriched categories nicely. :-)
Reed Mullanix (Mar 16 2021 at 01:18):
Fair enough :smile: I am a bit confused as to why dsimp
cant handle this, but I can keep throwing change
around blindly so it isn't a blocker
Scott Morrison (Mar 16 2021 at 01:28):
Here is a bit of a simplification up to nat_add
:
/-
Copyright (c) 2020 Reed Mullanix. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Reed Mullanix
-/
import algebra.category.Group.basic
import algebra.category.Group.abelian
import category_theory.fin_category
import category_theory.full_subcategory
import category_theory.functor_category
import category_theory.limits.shapes.finite_limits
import category_theory.preadditive
import category_theory.abelian.basic
import category_theory.abelian.exact
open AddCommGroup
open category_theory
open category_theory.limits
universes v u₁ u₂
namespace category_theory.nat_trans
variables {C : Type u₁} [category.{v} C]
-- TODO generalize this to any concrete category?
@[simp]
lemma naturality_apply
{F G : C ⥤ AddCommGroup} (α : F ⟶ G) ⦃X Y : C⦄ (f : X ⟶ Y) (x : F.obj X) :
α.app Y (F.map f x) = G.map f (α.app X x) :=
add_monoid_hom.congr_fun (α.naturality f) x
end category_theory.nat_trans
open category_theory
namespace category_theory.abelian
section
variables (C : Type u₁) [category.{v} C]
variables (D : Type u₂) [category.{v} D]
/-
First, let us start by defining left exact functors, and some simple properties
-/
structure left_exact_functor :=
(F : C ⥤ D)
(preserves_finite_limits : Π {J : Type v} [𝒥 : small_category J] [@fin_category J 𝒥], by exactI preserves_limits_of_shape J F)
instance left_exact_functors : category (left_exact_functor C D):=
induced_category.category left_exact_functor.F
def natural_transformation_add [preadditive D] {F G : C ⥤ D} (α β : F ⟶ G) : F ⟶ G :=
{ app := λ X, α.app X + β.app X }
end
variables (C : Type u₁) [category.{v} C]
def nat_add {F G : left_exact_functor C AddCommGroup.{v}} (α β : F ⟶ G) : F ⟶ G :=
{ app := λ X,
{ to_fun := λ g, α.app X g + β.app X g,
map_zero' := by simp,
map_add' := begin
intros x y,
simp [add_add_add_comm],
end
},
naturality' := begin
intros X Y f,
ext,
simp,
end
}
def nat_zero {F G : left_exact_functor C AddCommGroup.{v}} : F ⟶ G :=
{ app := λ _, 0,
}
def nat_neg {F G : left_exact_functor C AddCommGroup.{v}} (α : F ⟶ G) : F ⟶ G :=
{ app := λ X,
{ to_fun := λ g, - (α.app X g),
map_zero' := by simp,
map_add' := begin
intros g₁ g₂,
simp,
rw [add_comm _ _]
end
},
naturality' := begin
intros X Y f,
ext x,
simp,
-- We have to do a bit of a silly dance here to get the naturality proofs to work pointwise.
have α_nat : α.app Y (F.F.map f x) = G.F.map f (α.app X x) := add_monoid_hom.congr_fun (α.naturality f) x,
exact α_nat
end
}
@[simp] lemma nat_add_homo {F G : left_exact_functor C AddCommGroup.{v}} (α β : F ⟶ G) (X : C) : (nat_add C α β).app X = (α.app X) + (β.app X) := begin
unfold nat_add,
ext,
simp
end
instance : preadditive (left_exact_functor C AddCommGroup.{v}) :=
{ hom_group := λ F G,
{ add := nat_add C,
add_assoc := begin
intros α β γ,
ext X g,
simp,
rw [add_assoc _ _ _]
end,
zero := nat_zero C,
zero_add := begin
intros α,
ext X g,
change (nat_add C (nat_zero C) α).app X g = α.app X g,
simp,
unfold nat_zero,
simp,
end,
add_zero := begin
intros α,
ext X g,
change (nat_add C α (nat_zero C)).app X g = α.app X g,
simp,
unfold nat_zero,
simp
end,
neg := nat_neg C,
add_left_neg := begin
intros α,
ext X g,
change (nat_add C (nat_neg C α) α).app X g = 0,
simp,
unfold nat_neg,
simp
end,
add_comm := begin
intros α β,
ext X g,
change (nat_add C α β).app X g = (nat_add C β α).app X g,
simp,
rw [add_comm _ _]
end
},
add_comp' := begin
intros F G H α β γ,
ext X g,
-- Even more golf to get this to a place where simp can handle it
change γ.app X ((nat_add C α β).app X g) = ((nat_add C (α ≫ γ) (β ≫ γ)).app X) g,
simp,
change γ.app X (α.app X g) + γ.app X (β.app X g) = γ.app X (α.app X g) + γ.app X (β.app X g),
refl
end,
comp_add' := begin
intros F G H α β γ,
ext X g,
change (nat_add C β γ).app X (α.app X g) = (nat_add C (α ≫ β) (α ≫ γ)).app X g,
simp,
change β.app X (α.app X g) + γ.app X (α.app X g) = β.app X (α.app X g) + γ.app X (α.app X g),
refl
end
}
end category_theory.abelian
Scott Morrison (Mar 16 2021 at 01:30):
I get a timeout on the last instance: you should break it into smaller pieces.
Scott Morrison (Mar 16 2021 at 01:31):
Ah, so the basic problem is that you are making def
s without corresponding simp lemmas.
Scott Morrison (Mar 16 2021 at 01:31):
Just try sticking @[simps]
on nat_add
and nat_zero
.
Scott Morrison (Mar 16 2021 at 01:31):
Everything will be infinitely easier. :-)
Scott Morrison (Mar 16 2021 at 01:33):
Anytime you find yourself using change
or unfold
, you should be thinking "how could I have got dsimp
or simp
to do this itself", and the answer is nearly always "write more @[simp]
lemmas.
Reed Mullanix (Mar 16 2021 at 06:09):
Welp, adding @[simps]
seems to be the magic ingredient I was missing! Breaking up the preadditive instance is a good call, bad habit of mine.
Last updated: Dec 20 2023 at 11:08 UTC