@@ -53,6 +53,17 @@ protected def con : Con G where
5353instance Quotient.group : Group (G ⧸ N) :=
5454 (QuotientGroup.con N).group
5555
56+ /--
57+ The congruence relation defined by the kernel of a group homomorphism is equal to its kernel
58+ as a congruence relation.
59+ -/
60+ @ [to_additive QuotientAddGroup.con_ker_eq_addConKer
61+ "The additive congruence relation defined by the kernel of an additive group homomorphism is
62+ equal to its kernel as an additive congruence relation." ]
63+ theorem con_ker_eq_conKer (f : G →* M) : QuotientGroup.con f.ker = Con.ker f := by
64+ ext
65+ rw [QuotientGroup.con, Con.rel_mk, Setoid.comm', leftRel_apply, Con.ker_rel, MonoidHom.eq_iff]
66+
5667/-- The group homomorphism from `G` to `G/N`. -/
5768@ [to_additive "The additive group homomorphism from `G` to `G/N`." ]
5869def mk' : G →* G ⧸ N :=
@@ -150,17 +161,73 @@ theorem mk_zpow (a : G) (n : ℤ) : ((a ^ n : G) : Q) = (a : Q) ^ n :=
150161
151162@ [to_additive (attr := simp)] lemma map_mk'_self : N.map (mk' N) = ⊥ := by aesop
152163
164+ /--
165+ The subgroup defined by the class of `1` for a congruence relation on a group.
166+ -/
167+ @ [to_additive
168+ "The `AddSubgroup` defined by the class of `0` for an additive congruence relation
169+ on an `AddGroup`." ]
170+ protected def _root_.Con.subgroup (c : Con G) : Subgroup G where
171+ carrier := { x | c x 1 }
172+ one_mem' := c.refl 1
173+ mul_mem' hx hy := by simpa using c.mul hx hy
174+ inv_mem' h := by simpa using c.inv h
175+
176+ @ [to_additive (attr := simp)]
177+ theorem _root_.Con.mem_subgroup_iff {c : Con G} {x : G} :
178+ x ∈ c.subgroup ↔ c x 1 := Iff.rfl
179+
180+ @[to_additive]
181+ instance (c : Con G) : c.subgroup.Normal :=
182+ ⟨fun x hx g ↦ by simpa using (c.mul (c.mul (c.refl g) hx) (c.refl g⁻¹))⟩
183+
184+ @ [to_additive (attr := simp)]
185+ theorem _root_.Con.subgroup_quotientGroupCon (H : Subgroup G) [H.Normal] :
186+ (QuotientGroup.con H).subgroup = H := by
187+ ext
188+ simp [QuotientGroup.con, leftRel_apply]
189+
190+ @ [to_additive (attr := simp)]
191+ theorem con_subgroup (c : Con G) :
192+ QuotientGroup.con c.subgroup = c := by
193+ ext x y
194+ rw [QuotientGroup.con, Con.rel_mk, leftRel_apply, Con.mem_subgroup_iff]
195+ exact ⟨fun h ↦ by simpa using c.mul (c.refl x) (c.symm h),
196+ fun h ↦ by simpa using c.mul (c.refl x⁻¹) (c.symm h)⟩
197+
198+ /--
199+ The normal subgroups correspond to the congruence relations on a group.
200+ -/
201+ @ [to_additive (attr := simps) AddSubgroup.orderIsoAddCon
202+ "The normal subgroups correspond to the additive congruence relations on an `AddGroup`." ]
203+ def _root_.Subgroup.orderIsoCon :
204+ { N : Subgroup G // N.Normal } ≃o Con G where
205+ toFun N := letI : N.val.Normal := N.prop; QuotientGroup.con N
206+ invFun c := ⟨c.subgroup, inferInstance⟩
207+ left_inv := fun ⟨N, _⟩ ↦ Subtype.mk_eq_mk.mpr (Con.subgroup_quotientGroupCon N)
208+ right_inv c := QuotientGroup.con_subgroup c
209+ map_rel_iff' := by
210+ simp only [QuotientGroup.con, Equiv.coe_fn_mk, Con.le_def, Con.rel_mk, leftRel_apply]
211+ refine ⟨fun h x _ ↦ ?_, fun hle _ _ h ↦ hle h⟩
212+ specialize @h 1 x
213+ simp_all
214+
215+ @ [to_additive (attr := simp)]
216+ lemma con_le_iff {N M : Subgroup G} [N.Normal] [M.Normal] :
217+ QuotientGroup.con N ≤ QuotientGroup.con M ↔ N ≤ M :=
218+ (Subgroup.orderIsoCon.map_rel_iff (a := ⟨N, inferInstance⟩) (b := ⟨M, inferInstance⟩))
219+
220+ @ [to_additive (attr := gcongr)]
221+ lemma con_mono {N M : Subgroup G} [hN : N.Normal] [hM : M.Normal] (h : N ≤ M) :
222+ QuotientGroup.con N ≤ QuotientGroup.con M :=
223+ con_le_iff.mpr h
224+
153225/-- A group homomorphism `φ : G →* M` with `N ⊆ ker(φ)` descends (i.e. `lift`s) to a
154226group homomorphism `G/N →* M`. -/
155227@ [to_additive "An `AddGroup` homomorphism `φ : G →+ M` with `N ⊆ ker(φ)` descends (i.e. `lift`s)
156228 to a group homomorphism `G/N →* M`." ]
157229def lift (φ : G →* M) (HN : N ≤ φ.ker) : Q →* M :=
158- (QuotientGroup.con N).lift φ fun x y h => by
159- simp only [QuotientGroup.con, leftRel_apply, Con.rel_mk] at h
160- rw [Con.ker_rel]
161- calc
162- φ x = φ (y * (x⁻¹ * y)⁻¹) := by rw [mul_inv_rev, inv_inv, mul_inv_cancel_left]
163- _ = φ y := by rw [φ.map_mul, HN (N.inv_mem h), mul_one]
230+ (QuotientGroup.con N).lift φ <| con_ker_eq_conKer φ ▸ con_mono HN
164231
165232@ [to_additive (attr := simp)]
166233theorem lift_mk {φ : G →* M} (HN : N ≤ φ.ker) (g : G) : lift N φ HN (g : Q) = φ g :=
0 commit comments