Zulip Chat Archive
Stream: Is there code for X?
Topic: Structures vs Type classes: Projections
Sina (Dec 08 2022 at 16:37):
Say I have defined a structure named blah
which has fields F1
... Fn
in its definition. When proving a certain theorem about blah
, I have in my context some stuff X Y Z: blah
which are going to be used in the statement and the proof of the theorem. In my tactic-style proof, Lean can display in context/goal X.F1
, Y.F1
etc which is great. But, if I make blah
into a type-class, which is desirable in some situations, then instead of X.F1
Lean displays blah.F1
for both X.F1
, Y.F1
, which is less useful when proving theorems with lots of instances. Is there a way to formalize my structure blah
with a type-class but also have the useful projections X.F1
, Y.F1
?
Yaël Dillies (Dec 08 2022 at 16:39):
Yes, replace (the_field_I_want_a_projection_of : its_type)
by (the_field_I_want_a_projection_of [] : its_type)
in the structure declaration.
Sina (Dec 08 2022 at 16:57):
Not sure I am doing it right. Here's a MWE:
class functor (𝓒 : Type u₁) [category_str.{v₁} 𝓒] (𝓓 : Type u₂) [category_str.{v₂} 𝓓] : Type (max v₁ v₂ u₁ u₂) :=
(obj [] : 𝓒 → 𝓓)
(mor [] : Π {X Y : 𝓒}, (X ⟶ Y) → (obj X ⟶ obj Y))
(resp_id' :
∀ (X : 𝓒), mor (𝟙 X) = 𝟙 (obj X) )
(resp_comp' :
∀ {X Y Z : 𝓒} (f : X ⟶ Y) (g : Y ⟶ Z), mor (f ≫ g ) = (mor f) ≫ (mor g) )
Now, in defining composition of functors, Lean displays mor 𝓔 (mor 𝓓 (𝟙 X)) = 𝟙 (obj (obj X))
(when i put my cursor on the first simp
in the definition below) whereas i would like it to display G.mor (F.mor (𝟙 X)) = 𝟙 (G.obj (F.obj X))
.
def comp (F : functor 𝓒 𝓓) (G : functor 𝓓 𝓔) : functor 𝓒 𝓔 :=
{
obj := λ X, G.obj (F.obj X), -- G.obj ∘ F.obj,
mor := λ X, λ Y, λ f, G.mor (F.mor f),
resp_id' := by {intro X, simp only [functor.resp_id ], },
resp_comp' := by {intros X Y Z f g, simp only [functor.resp_comp],},
}
Yaël Dillies (Dec 08 2022 at 17:03):
That doesn't answer your question, but you most definitely don't want functor
to be a class, as it means you will be able to use only one functor between any two categories!
Sina (Dec 08 2022 at 17:28):
Absolutely, I just used the functor example as MWE, since your trick with [ ]
would work for other examples i had. Thanks for your answer though, i never quite understood the purpose of [ ]
in type classes before.
Reid Barton (Dec 08 2022 at 17:31):
Have you tried defining your structure as a structure, but then adding attribute [class]
to it afterwards?
Yaël Dillies (Dec 08 2022 at 17:31):
The []
trick answers why it shows up as blah.F1
rather than X.F1
, but your second message makes it seem that you expected X.F1
rather than blah.F1 X
. This is a different question, and relates to "pretty-printing" (aka pp).
Sina (Dec 08 2022 at 17:44):
@Yaël Dillies I see. I'd prefer X.F1
, but would also be happy with blah.F1 X
. With functor
example, I do not even get the latter; I only get blah.F1
. So, adding []
to obj
and mor
field of the functor type class , Lean would display
mor 𝓔 (mor 𝓓 (𝟙 X)) = 𝟙 (obj 𝓔 (obj 𝓓 X))
instead of
mor (mor (𝟙 X)) = 𝟙 (obj (obj X))
without adding []
.
Does pp
help with displaying either F.mor
or mor F
for a functor (F : functor 𝓒 𝓓)
? Again this is in the context of wrongly declaring functor
as a type-class.
Last updated: Dec 20 2023 at 11:08 UTC