Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 2c64a77

Browse files
committed
feat(submonoid, subgroup, subring): is_ring_hom instances for set.inclusion
1 parent 49ccc9f commit 2c64a77

File tree

3 files changed

+74
-3
lines changed

3 files changed

+74
-3
lines changed

src/group_theory/subgroup.lean

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ by subtype_instance
5353
instance subtype.add_group {s : set β} [is_add_subgroup s] : add_group s :=
5454
by subtype_instance
5555
attribute [to_additive subtype.add_group] subtype.group
56+
attribute [to_additive subtype.add_group._proof_1] subtype.group._proof_1
57+
attribute [to_additive subtype.add_group._proof_2] subtype.group._proof_2
58+
attribute [to_additive subtype.add_group._proof_3] subtype.group._proof_3
59+
attribute [to_additive subtype.add_group._proof_4] subtype.group._proof_4
60+
attribute [to_additive subtype.add_group._proof_5] subtype.group._proof_5
61+
attribute [to_additive subtype.add_group.equations._eqn_1] subtype.group.equations._eqn_1
5662

5763
instance subtype.comm_group {α : Type*} [comm_group α] {s : set α} [is_subgroup s] : comm_group s :=
5864
by subtype_instance
@@ -545,11 +551,42 @@ lemma inj_iff_trivial_ker (f : α → β) [is_group_hom f] :
545551
function.injective f ↔ ker f = trivial α :=
546552
⟨trivial_ker_of_inj f, inj_of_trivial_ker f⟩
547553

548-
instance (s : set α) [is_subgroup s] : is_group_hom (subtype.val : s → α) :=
549-
⟨λ _ _, rfl⟩
550-
551554
end is_group_hom
552555

556+
instance subtype_val.is_group_hom [group α] {s : set α} [is_subgroup s] :
557+
is_group_hom (subtype.val : s → α) := { ..subtype_val.is_monoid_hom }
558+
559+
instance subtype_val.is_add_group_hom [add_group α] {s : set α} [is_add_subgroup s] :
560+
is_add_group_hom (subtype.val : s → α) := { ..subtype_val.is_add_monoid_hom }
561+
attribute [to_additive subtype_val.is_group_hom] subtype_val.is_add_group_hom
562+
563+
instance coe.is_group_hom [group α] {s : set α} [is_subgroup s] :
564+
is_group_hom (coe : s → α) := { ..subtype_val.is_monoid_hom }
565+
566+
instance coe.is_add_group_hom [add_group α] {s : set α} [is_add_subgroup s] :
567+
is_add_group_hom (coe : s → α) :=
568+
{ ..subtype_val.is_add_monoid_hom }
569+
attribute [to_additive coe.is_group_hom] coe.is_add_group_hom
570+
571+
instance subtype_mk.is_group_hom [group α] [group β] {s : set α}
572+
[is_subgroup s] (f : β → α) [is_group_hom f] (h : ∀ x, f x ∈ s) :
573+
is_group_hom (λ x, (⟨f x, h x⟩ : s)) := { ..subtype_mk.is_monoid_hom f h }
574+
575+
instance subtype_mk.is_add_group_hom [add_group α] [add_group β] {s : set α}
576+
[is_add_subgroup s] (f : β → α) [is_add_group_hom f] (h : ∀ x, f x ∈ s) :
577+
is_add_group_hom (λ x, (⟨f x, h x⟩ : s)) :=
578+
{ ..subtype_mk.is_add_monoid_hom f h }
579+
attribute [to_additive subtype_mk.is_group_hom] subtype_mk.is_add_group_hom
580+
581+
instance set_inclusion.is_group_hom [group α] {s t : set α}
582+
[is_subgroup s] [is_subgroup t] (h : s ⊆ t) : is_group_hom (set.inclusion h) :=
583+
subtype_mk.is_group_hom _ _
584+
585+
instance set_inclusion.is_add_group_hom [add_group α] {s t : set α}
586+
[is_add_subgroup s] [is_add_subgroup t] (h : s ⊆ t) : is_add_group_hom (set.inclusion h) :=
587+
subtype_mk.is_add_group_hom _ _
588+
attribute [to_additive set_inclusion.is_group_hom] set_inclusion.is_add_group_hom
589+
553590
section simple_group
554591

555592
class simple_group (α : Type*) [group α] : Prop :=

src/group_theory/submonoid.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,25 @@ by induction n; simp [*, pow_succ]
180180
by induction n; [refl, simp [*, succ_smul]]
181181
attribute [to_additive is_add_submonoid.smul_coe] is_submonoid.coe_pow
182182

183+
@[to_additive subtype_val.is_add_monoid_hom]
184+
instance subtype_val.is_monoid_hom [is_submonoid s] : is_monoid_hom (subtype.val : s → α) :=
185+
{ map_one := rfl, map_mul := λ _ _, rfl }
186+
187+
@[to_additive coe.is_add_monoid_hom]
188+
instance coe.is_monoid_hom [is_submonoid s] : is_monoid_hom (coe : s → α) :=
189+
subtype_val.is_monoid_hom
190+
191+
@[to_additive subtype_mk.is_add_monoid_hom]
192+
instance subtype_mk.is_monoid_hom {γ : Type*} [monoid γ] [is_submonoid s] (f : γ → α)
193+
[is_monoid_hom f] (h : ∀ x, f x ∈ s) : is_monoid_hom (λ x, (⟨f x, h x⟩ : s)) :=
194+
{ map_one := subtype.eq (is_monoid_hom.map_one f),
195+
map_mul := λ _ _, subtype.eq (is_monoid_hom.map_mul f) }
196+
197+
@[to_additive set_inclusion.is_add_monoid_hom]
198+
instance set_inclusion.is_monoid_hom (t : set α) [is_submonoid s] [is_submonoid t] (h : s ⊆ t) :
199+
is_monoid_hom (set.inclusion h) :=
200+
subtype_mk.is_monoid_hom _ _
201+
183202
namespace monoid
184203

185204
inductive in_closure (s : set α) : α → Prop

src/ring_theory/subring.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ instance is_subring_set_range {R : Type u} {S : Type v} [ring R] [ring S]
3737

3838
end is_ring_hom
3939

40+
instance subtype_val.is_ring_hom {s : set R} [is_subring s] :
41+
is_ring_hom (subtype.val : s → R) :=
42+
{ ..subtype_val.is_add_group_hom, ..subtype_val.is_monoid_hom }
43+
44+
instance coe.is_ring_hom {s : set R} [is_subring s] : is_ring_hom (coe : s → R) :=
45+
subtype_val.is_ring_hom
46+
47+
instance subtype_mk.is_ring_hom {γ : Type*} [ring γ] {s : set R} [is_subring s] (f : γ → R)
48+
[is_ring_hom f] (h : ∀ x, f x ∈ s) : is_ring_hom (λ x, (⟨f x, h x⟩ : s)) :=
49+
{ ..subtype_mk.is_add_group_hom f h, ..subtype_mk.is_monoid_hom f h }
50+
51+
instance set_inclusion.is_ring_hom {s t : set R} [is_subring s] [is_subring t] (h : s ⊆ t) :
52+
is_ring_hom (set.inclusion h) :=
53+
subtype_mk.is_ring_hom _ _
54+
4055
variables {cR : Type u} [comm_ring cR]
4156

4257
instance subset.comm_ring {S : set cR} [is_subring S] : comm_ring S :=

0 commit comments

Comments
 (0)