Zulip Chat Archive
Stream: mathlib4
Topic: FintypeCat API
Christian Merten (Feb 10 2024 at 18:27):
I am wondering what parts of the API for types should be mirrored for FintypeCat
. Certainly its preferable to create the API for ConcreteCategory
instead, but I can't make this specialize to FintypeCat
. Example:
import Mathlib
open CategoryTheory
variable {C D : Type*} [Category C] [Category D] [ConcreteCategory D] (F : C ⥤ D)
{X Y : C} (f : X ≅ Y)
attribute [local instance] ConcreteCategory.hasCoeToSort
attribute [local instance] ConcreteCategory.instFunLike
@[simp]
lemma FunctorToConcrete.map_inv_map_hom_apply (x : F.obj X) :
⇑(F.map f.inv) (⇑(F.map f.hom) x) = x := by
rw [← comp_apply]
show ⇑((F.mapIso f).hom ≫ (F.mapIso f).inv) x = x
rw [Iso.hom_inv_id, id_apply]
example (F : C ⥤ FintypeCat) {X Y : C} (f : X ≅ Y) (x : F.obj X) :
F.map f.inv (F.map f.hom x) = x := by
-- erw [FunctorToConcrete.map_inv_map_hom_apply F f x] fails
-- rw [FunctorToConcrete.map_inv_map_hom_apply F f x] fails
-- simp only [FunctorToConcrete.map_inv_map_hom_apply F f x] fails
-- simp does not make progress
exact FunctorToConcrete.map_inv_map_hom_apply F f x
Is this expected? Can I make this work?
Adam Topaz (Feb 10 2024 at 18:31):
I’m not sure what you mean about this not specializing to FintypeCat….
Adam Topaz (Feb 10 2024 at 18:31):
Do these lemmas not work when D is FintypeCat?
Christian Merten (Feb 10 2024 at 18:32):
The lemma works, but the general simp lemma, stated for concrete categories, is not applied by simp
when D
is FintypeCat
, note that even explicitly using it with simp only [..]
does not work.
Adam Topaz (Feb 10 2024 at 18:33):
That’s annoying…
Adam Topaz (Feb 10 2024 at 18:33):
Can you trace the simp to see why it fails?
Christian Merten (Feb 10 2024 at 18:33):
That's what I tried to demonstrate with the example
above.
Christian Merten (Feb 10 2024 at 18:33):
Adam Topaz said:
Can you trace the simp to see why it fails?
How do I do this?
Adam Topaz (Feb 10 2024 at 18:37):
set_option trace.Meta.Simp true (if i remember the name of the option correctly… I’m on mobile right now)
Christian Merten (Feb 10 2024 at 18:46):
I found it: Its set_option trace.Meta.Tactic.simp true
.
The following code:
set_option trace.Meta.Tactic.simp true
example (F : C ⥤ FintypeCat) {X Y : C} (f : X ≅ Y) (x : F.obj X) :
F.map f.inv (F.map f.hom x) = x := by
simp only [FunctorToConcrete.map_inv_map_hom_apply F f x]
yields
▶ 45:3-45:60: error:
simp made no progress
▶ 45:3-45:60: information:
[Meta.Tactic.simp.unify] @eq_self:1000, failed to unify
?a = ?a
with
F.toPrefunctor.map f.inv (F.toPrefunctor.map f.hom x) = x
Christian Merten (Feb 10 2024 at 18:51):
I guess that means the only thing simp
tried is rfl
?
Adam Topaz (Feb 10 2024 at 18:52):
Hmmm…
Adam Topaz (Feb 10 2024 at 18:52):
What happens if you explicitly specify universes?
Adam Topaz (Feb 10 2024 at 18:53):
docs#CategoryTheory.ConcreteCategory
Christian Merten (Feb 10 2024 at 18:57):
Same result:
#check FunctorToConcrete.map_inv_map_hom_apply
CategoryTheory.FunctorToConcrete.map_inv_map_hom_apply.{u_5, u_4, u_3, u_2, u_1} {C : Type u_1} {D : Type u_2}
[inst✝ : Category.{u_5, u_1} C] [inst✝¹ : Category.{u_3, u_2} D] [inst✝² : ConcreteCategory D] (F : C ⥤ D) {X Y : C}
(f : X ≅ Y) (x : (forget D).toPrefunctor.obj (F.toPrefunctor.obj X)) :
(F.toPrefunctor.map f.inv) ((F.toPrefunctor.map f.hom) x) = x
Specifiyng all universes:
example (F : C ⥤ FintypeCat.{w}) {X Y : C} (f : X ≅ Y) (x : F.obj X) :
F.map f.inv (F.map f.hom x) = x := by
-- exact FunctorToConcrete.map_inv_map_hom_apply.{u₂, w, w, w+1, u₁} F f x works
simp only [FunctorToConcrete.map_inv_map_hom_apply.{u₂, w, w, w+1, u₁} F f x]
yields the same trace.
Adam Topaz (Feb 10 2024 at 19:01):
Does lean even find the concrete category instance?
Christian Merten (Feb 10 2024 at 19:02):
Yes:
#synth ConcreteCategory.{w, w, w+1} FintypeCat.{w}
▶ 45:1-45:51: information:
FintypeCat.concreteCategoryFintype
Christian Merten (Feb 10 2024 at 19:19):
It must be related to the function coercions: Even when replacing every occurence of D
in the simp lemma with FintypeCat
, it still does not work:
@[simp]
lemma FintypeCat.map_inv_map_hom_apply (F : C ⥤ FintypeCat.{w}) {X Y : C} (f : X ≅ Y)
(x : F.obj X) : ⇑(F.map f.inv) (⇑(F.map f.hom) x) = x := by
rw [← comp_apply]
show ⇑((F.mapIso f).hom ≫ (F.mapIso f).inv) x = x
rw [Iso.hom_inv_id, id_apply]
example (F : C ⥤ FintypeCat.{w}) {X Y : C} (f : X ≅ Y) (x : F.obj X) :
F.map f.inv (F.map f.hom x) = x := by
simp only [FintypeCat.map_inv_map_hom_apply F f x] -- fails with the same trace
When removing the explicit ⇑
coercions (which are not needed in the FintypeCat
case), it works. But for general concrete categories the simp lemma can't be stated without ⇑
(or at least I did not succeed in doing so).
Christian Merten (Feb 10 2024 at 19:32):
This is a bit minimized:
import Mathlib
variable {X Y : FintypeCat} (f g : X ⟶ Y) (h : ⇑f = ⇑g)
example (x : X) : f x = g x := by
simp only [h] --fails
Probably this is expected, but it makes working in FintypeCat
horrible without copying every API lemma from the category of types.
Christian Merten (Feb 10 2024 at 19:36):
Maybe your bundled function approach would also make this less annoying?
Adam Topaz (Feb 10 2024 at 19:47):
Yeah I think that’s the issue here
Last updated: May 02 2025 at 03:31 UTC