Zulip Chat Archive
Stream: general
Topic: Creating iso from equiv
Yaël Dillies (Feb 24 2022 at 21:55):
Compare docs#mul_equiv.to_Group_iso and docs#Preorder.iso.mk:
/-- Build an isomorphism in the category `Group` from a `mul_equiv` between `group`s. -/
def mul_equiv.to_Group_iso {X Y : Type*} [group X] [group Y] (e : X ≃* Y) : Group.of X ≅ Group.of Y :=
{ hom := e.to_monoid_hom,
inv := e.symm.to_monoid_hom }
/-- Constructs an equivalence between preorders from an order isomorphism between them. -/
def Preorder.iso.mk {X Y : Preorder} (e : X ≃o Y) : X ≅ Y :=
{ hom := e,
inv := e.symm,
hom_inv_id' := by { ext, exact e.symm_apply_apply x },
inv_hom_id' := by { ext, exact e.apply_symm_apply x } }
Yaël Dillies (Feb 24 2022 at 21:55):
The first bundles X
and Y
as Group
s on the fly while the second takes X Y : Preorder
directly. The destruction-construction happening in the first case is making me eat my hat because it breaks defeq:
import algebra.category.Group.basic
example (X : Group) : Group.of ↥X = X := rfl -- fails
example (X : Group) : Group.of ↥X = X := by { cases X, refl } --works
Yaël Dillies (Feb 24 2022 at 21:55):
Is there any reason why it is so? Does anyone mind if I change mul_equiv.to_Group_iso
to take X Y : Group
directly?
Yaël Dillies (Feb 24 2022 at 21:56):
cc the usual suspect, @Scott Morrison
Reid Barton (Feb 24 2022 at 22:00):
Yes, I agree X Y : Group
is the right way to set up the first one. (As a bonus, it's shorter too!)
Scott Morrison (Feb 24 2022 at 22:00):
I can't recall immediately anything that this change would break.
Yaël Dillies (Feb 24 2022 at 22:00):
From trying it out quickly now, it breaks more uses of Group.of
downstream, whose fix is the same.
Scott Morrison (Feb 24 2022 at 22:01):
I suspect this was just because in the "early days", there was less of an audience for API in terms of Group
, because no one was actually using it, and so I may have written it this way just to have the argument all live in the "classical"/"unbundled" world.
Reid Barton (Feb 24 2022 at 22:02):
Hmm, I'm a little surprised that change would break anything--can you give an example?
Yaël Dillies (Feb 24 2022 at 22:05):
If e : X ≃* Y
, then e.to_Group_iso
doesn't work. You need (e : ↥(Group.of X) ≃* ↥(Group.of Y)).to_Group_iso
or something.
Yaël Dillies (Feb 24 2022 at 22:05):
It's really benign.
Reid Barton (Feb 24 2022 at 22:16):
Most of the time inference should be outside-in, so this won't be a problem
Yaël Dillies (Feb 24 2022 at 22:20):
It just breaks dot notation in my case due to order of elaboration. But the alternative is undefeqness pain, so I'll take it :smile:
Eric Wieser (Feb 24 2022 at 23:05):
Just to be clear, it works fine with non-dot notation?
Yaël Dillies (Mar 02 2022 at 17:03):
Last updated: Dec 20 2023 at 11:08 UTC