Zulip Chat Archive
Stream: new members
Topic: homs vs. functions
Joachim Breitner (Jan 12 2022 at 21:55):
More beginner questions, hope that’s ok. My goal is
⇑h2 ∘ ⇑h1 = id
but what I really want (to apply suitable lemmas) is what I can’t express better than
monoid_hom.comp h2 h1 = monoid_hom.id G
How do I go about this? Is there a way to apply this lemma (is_free_group.hom_ext
) to the above goal and have lean somehow figure out that both sides are indeed homs?
Yakov Pechersky (Jan 12 2022 at 22:03):
mathlib has the style tendency to not use pointfree (comp) lemmas, but use fully applied lemmas. so often such goals are solved by using an extensionality lemma (or tactic) first
Yakov Pechersky (Jan 12 2022 at 22:04):
So in this case, you might have a proof of that lemma, let's say named H
, and use congr_fun H _
Yakov Pechersky (Jan 12 2022 at 22:05):
A #mwe always helps to give concrete examples
Anne Baanen (Jan 12 2022 at 22:09):
I hope we already have docs#monoid_hom.coe_comp and docs#monoid_hom.coe_id (EDIT: no coe_id
unfortunately), then you could do it as follows:
Anne Baanen (Jan 12 2022 at 22:13):
import algebra.group.hom
variables {M N : Type*} [monoid M] [monoid N]
@[simp] lemma monoid_hom.coe_id : ((monoid_hom.id M) : M → M) = id := rfl
example (h1 : M →* N) (h2 : N →* M) (h : monoid_hom.comp h2 h1 = monoid_hom.id M) :
(h2 ∘ h1 : M → M) = id :=
by rw [← monoid_hom.coe_comp, ← monoid_hom.coe_id, h]
Anne Baanen (Jan 12 2022 at 22:17):
Now in fact coe_comp
and coe_id
are true by definition, so you can actually cheat a bit and say:
example (h1 : M →* N) (h2 : N →* M) (h : monoid_hom.comp h2 h1 = monoid_hom.id M) :
(h2 ∘ h1 : M → M) = id :=
congr_arg (coe_fn : (M →* M) → (M → M)) h
where coe_fn
is the name of the double uparrow ⇑
implicitly converting a hom to a function.
Joachim Breitner (Jan 12 2022 at 22:22):
That proof term works, thanks. At least the sorry
is gone, and maybe I’ll learn how to do it more pretty later :)
Last updated: Dec 20 2023 at 11:08 UTC