Zulip Chat Archive
Stream: general
Topic: to instance or not to instance
Johan Commelin (Oct 26 2021 at 12:24):
Clearly, the following instances form a loop together. Do we have design principles that dictate which should be instance and which should be lemma?
instance {f g : arrow T} (ff : f ⟶ g) [is_iso ff.left] [is_iso ff.right] :
is_iso ff :=
{ out := ⟨⟨inv ff.left, inv ff.right⟩,
by { ext; dsimp; simp only [is_iso.hom_inv_id] },
by { ext; dsimp; simp only [is_iso.inv_hom_id] }⟩ }
instance left_is_iso [is_iso sq] : is_iso sq.left :=
{ out := ⟨(inv sq).left, by simp only [← comma.comp_left, is_iso.hom_inv_id, is_iso.inv_hom_id,
arrow.id_left, eq_self_iff_true, and_self]⟩ }
instance right_is_iso [is_iso sq] : is_iso sq.right :=
{ out := ⟨(inv sq).right, by simp only [← comma.comp_right, is_iso.hom_inv_id, is_iso.inv_hom_id,
arrow.id_right, eq_self_iff_true, and_self]⟩ }
Gabriel Ebner (Oct 26 2021 at 12:27):
The first one should not be an instance because it loops (at least as far as I can see the types).
Johan Commelin (Oct 26 2021 at 12:28):
The first one alone doesn't loop, right?
Johan Commelin (Oct 26 2021 at 12:29):
But it's somehow an "extensionality instance" if that makes sense. Maybe those are "bad"? Can/should we lint against those?
Gabriel Ebner (Oct 26 2021 at 12:33):
Ah, because ff.left
is no longer a morphism between objects in an arrow.
Johan Commelin (Oct 26 2021 at 12:36):
Or at least, if it is, then in a different category. (If you start with f g : arrow (arrow T)
)
Reid Barton (Oct 26 2021 at 12:49):
Ideally is_iso
would not exist as a class at all (there are a lot of ways to prove that a map is an isomorphism and many of them are not "syntactic"). However, the loop-breaking rule is generally that the instance head(s) should get smaller when you apply an instance.
Johan Commelin (Oct 26 2021 at 12:59):
Which in thise case means that nr1 should not be an instance, and the other two are fine, right?
Last updated: Dec 20 2023 at 11:08 UTC