Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Mathlib/Algebra/Group/Subgroup/Ker.lean
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,9 @@ def ker (f : G →* M) : Subgroup G :=
f x⁻¹ = f x * f x⁻¹ := by rw [hx, one_mul]
_ = 1 := by rw [← map_mul, mul_inv_cancel, map_one] }

@[to_additive (attr := simp)]
theorem ker_toSubmonoid (f : G →* M) : f.ker.toSubmonoid = MonoidHom.mker f := rfl

@[to_additive (attr := simp)]
theorem mem_ker {f : G →* M} {x : G} : x ∈ f.ker ↔ f x = 1 :=
Iff.rfl
Expand Down
4 changes: 4 additions & 0 deletions Mathlib/Algebra/Group/Subgroup/Map.lean
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ def map (f : G →* N) (H : Subgroup G) : Subgroup N :=
theorem coe_map (f : G →* N) (K : Subgroup G) : (K.map f : Set N) = f '' K :=
rfl

@[to_additive (attr := simp)]
theorem map_toSubmonoid (f : G →* G') (K : Subgroup G):
(Subgroup.map f K).toSubmonoid = Submonoid.map f K.toSubmonoid := rfl

@[to_additive (attr := simp)]
theorem mem_map {f : G →* N} {K : Subgroup G} {y : N} : y ∈ K.map f ↔ ∃ x ∈ K, f x = y := Iff.rfl

Expand Down
5 changes: 5 additions & 0 deletions Mathlib/Algebra/Group/Submonoid/Operations.lean
Original file line number Diff line number Diff line change
Expand Up @@ -1042,4 +1042,9 @@ theorem map_comap_eq_self {f : F} {S : Submonoid N} (h : S ≤ MonoidHom.mrange
(S.comap f).map f = S := by
simpa only [inf_of_le_left h] using map_comap_eq f S

@[to_additive]
theorem map_comap_eq_self_of_surjective {f : F} (h : Function.Surjective f) {S : Submonoid N} :
map f (comap f S) = S :=
map_comap_eq_self (MonoidHom.mrange_eq_top_of_surjective _ h ▸ le_top)

end Submonoid
10 changes: 10 additions & 0 deletions Mathlib/Data/Quot.lean
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,16 @@ theorem Quotient.lift_comp_mk {_ : Setoid α} (f : α → β) (h : ∀ a b : α,
Quotient.lift f h ∘ Quotient.mk _ = f :=
rfl

theorem Quotient.lift_surjective_iff {α β : Sort*} {s : Setoid α} (f : α → β)
Comment thread
xroblot marked this conversation as resolved.
(h : ∀ (a b : α), a ≈ b → f a = f b) :
Function.Surjective (Quotient.lift f h : Quotient s → β) ↔ Function.Surjective f :=
Quot.surjective_lift h

theorem Quotient.lift_surjective {α β : Sort*} {s : Setoid α} (f : α → β)
(h : ∀ (a b : α), a ≈ b → f a = f b) (hf : Function.Surjective f):
Function.Surjective (Quotient.lift f h : Quotient s → β) :=
(Quot.surjective_lift h).mpr hf

@[simp]
theorem Quotient.lift₂_mk {α : Sort*} {β : Sort*} {γ : Sort*} {_ : Setoid α} {_ : Setoid β}
(f : α → β → γ)
Expand Down
29 changes: 29 additions & 0 deletions Mathlib/GroupTheory/QuotientGroup/Defs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -238,11 +238,28 @@ theorem lift_mk' {φ : G →* M} (HN : N ≤ φ.ker) (g : G) : lift N φ HN (mk
rfl
-- TODO: replace `mk` with `mk'`)

@[to_additive (attr := simp)]
theorem lift_comp_mk' (φ : G →* M) (HN : N ≤ φ.ker) :
(QuotientGroup.lift N φ HN).comp (QuotientGroup.mk' N) = φ :=
rfl

@[to_additive (attr := simp)]
theorem lift_quot_mk {φ : G →* M} (HN : N ≤ φ.ker) (g : G) :
lift N φ HN (Quot.mk _ g : Q) = φ g :=
rfl

@[to_additive]
theorem lift_surjective_of_surjective (φ : G →* M) (hφ : Function.Surjective φ) (HN : N ≤ φ.ker) :
Comment thread
xroblot marked this conversation as resolved.
Function.Surjective (QuotientGroup.lift N φ HN) :=
Quotient.lift_surjective _ _ hφ

@[to_additive]
theorem ker_lift (φ : G →* M) (HN : N ≤ φ.ker) :
(QuotientGroup.lift N φ HN).ker = Subgroup.map (QuotientGroup.mk' N) φ.ker := by
Comment thread
xroblot marked this conversation as resolved.
rw [← Subgroup.toSubmonoid_inj, Subgroup.map_toSubmonoid, MonoidHom.ker_toSubmonoid,
MonoidHom.ker_toSubmonoid, ← congr_arg MonoidHom.mker (lift_comp_mk' N φ HN),
← MonoidHom.comap_mker, Submonoid.map_comap_eq_self_of_surjective (mk'_surjective N)]

/-- A group homomorphism `f : G →* H` induces a map `G/N →* H/M` if `N ⊆ f⁻¹(M)`. -/
@[to_additive
"An `AddGroup` homomorphism `f : G →+ H` induces a map `G/N →+ H/M` if `N ⊆ f⁻¹(M)`."]
Expand All @@ -263,6 +280,18 @@ theorem map_mk' (M : Subgroup H) [M.Normal] (f : G →* H) (h : N ≤ M.comap f)
map N M f h (mk' _ x) = ↑(f x) :=
rfl

@[to_additive]
theorem map_surjective_of_surjective (M : Subgroup H) [M.Normal] (f : G →* H)
(hf : Function.Surjective (mk ∘ f : G → H ⧸ M)) (h : N ≤ M.comap f) :
Function.Surjective (map N M f h) :=
lift_surjective_of_surjective _ _ hf _

@[to_additive]
theorem ker_map (M : Subgroup H) [M.Normal] (f : G →* H) (h : N ≤ Subgroup.comap f M) :
(map N M f h).ker = Subgroup.map (mk' N) (M.comap f) := by
simp_rw [← ker_mk' M, MonoidHom.comap_ker]
exact QuotientGroup.ker_lift _ _ _

@[to_additive]
theorem map_id_apply (h : N ≤ Subgroup.comap (MonoidHom.id _) N := (Subgroup.comap_id N).le) (x) :
map N N (MonoidHom.id _) h x = x :=
Expand Down