Zulip Chat Archive
Stream: general
Topic: definition of is_mul_hom
Kevin Buzzard (Mar 17 2019 at 15:05):
import data.equiv.basic algebra.group def is_mul_hom {α β : Type*} [has_mul α] [has_mul β] (f : α → β) : Prop := -- Should this be {x y} or (x y) or ⦃x y⦄? ∀ {x y}, f (x * y) = f x * f y structure mul_equiv (α β : Type*) [has_mul α] [has_mul β] extends α ≃ β := (hom : is_mul_hom to_fun) infix ` ≃* `:50 := mul_equiv variables {α : Type*} {β : Type*} [monoid α] [monoid β] namespace mul_equiv @[symm] def symm (h : α ≃* β) : β ≃* α := { hom := λ n₁ n₂, function.injective_of_left_inverse h.left_inv begin rw h.hom, unfold equiv.symm, rw [h.right_inv, h.right_inv, h.right_inv], end ..h.to_equiv.symm} lemma one (h : equiv α β) (hom : ∀ x y, h (x * y) = h x * h y) : h 1 = 1 := by rw [←mul_one (h 1), ←h.apply_symm_apply 1, ←hom]; simp instance is_monoid_hom (h : α ≃* β) : is_monoid_hom h.to_equiv := { map_one := mul_equiv.one h.to_equiv h.hom, map_mul := h.hom } open units def map_equiv (h : α ≃* β) : units α ≃* units β := { to_fun := map h.to_equiv, inv_fun := map h.symm.to_equiv, left_inv := λ u, ext $ h.left_inv u, right_inv := λ u, ext $ h.right_inv u, -- hom := λ a b, units.ext $ h.hom} -- fails -- hom := λ a b, units.ext $ by exact h.hom} -- fails hom := λ a b, units.ext $ by have X := h.hom; exact X} -- works end mul_equiv
In the perfectoid project we have a bunch of groups, rings, linearly ordered commutative monoids etc which are canonically isomorphic, so I've been trying to extend equiv
to more general situations (see #789). Why am I having trouble with the last line here?
Kevin Buzzard (Mar 17 2019 at 15:09):
Could it be the case that the hom
field in the structure might need different brackets to the def? I should get this right now because I want to build a bunch of equivs on top of this.
Kevin Buzzard (Mar 17 2019 at 15:22):
import order.basic #check @monotone -- monotone : Π {α : Type u_1} {β : Type u_2} [_inst_1 : preorder α] [_inst_2 : preorder β], -- (α → β) → Prop #print monotone -- ∀ ⦃a b : α⦄, a ≤ b → f a ≤ f b
In #789 Chris encouraged me to define mul_equiv
for two types with has_mul
as a bijection which preserved *
. I want le_equiv
and I was going to use monotone
but this needs a preorder, rather than just a has_le
.
What is the best idea here? Can I weaken the definition of monotone
to only demand has_le
? Should I not define le_equiv
and instead stick to preorder_equiv
?
Patrick Massot (Mar 17 2019 at 16:26):
I think you should PR a modification of monotone
which assumes only has_le
Patrick Massot (Mar 17 2019 at 16:28):
In your def is_mul_hom
I don't see any reason to have implicit x
and y
. Make them explicit and your problem in map_equiv will disappear (using hom := λ a b, units.ext $ h.hom _ _
)
Kevin Buzzard (Mar 17 2019 at 17:08):
https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/bounds/near/147878878 is the reason why I don't just PR this modification of monotone
. I already observed that some stuff in mathlib only needed has_le
but Mario seemed to think it was better to have it defined on preorders. I remember being surprised at the time.
Kevin Buzzard (Mar 17 2019 at 17:14):
In your def
is_mul_hom
I don't see any reason to have implicitx
andy
. Make them explicit and your problem in map_equiv will disappear (usinghom := λ a b, units.ext $ h.hom _ _
)
Mario wrote monotone
and he used {{ }}
. Note that is_mul_hom
is "forall x y, P = Q" whereas monotone is "forall {{x y}}, P -> Q". Does the implication make a difference?
Mario Carneiro (Mar 17 2019 at 17:25):
it does
Mario Carneiro (Mar 17 2019 at 17:25):
you could use {{ }}
for is_mul_hom but it wouldn't make a difference
Kevin Buzzard (Mar 17 2019 at 17:42):
Ok, PR updated, although I don't really understand what's going on.
Kevin Buzzard (Mar 17 2019 at 18:07):
Mathlib currently has implicits for map_mul
there. If I change them then algebra.big_operators
breaks . Is it worth changing?
Last updated: Dec 20 2023 at 11:08 UTC