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

Commit 065f083

Browse files
kckennylaujohoelzl
authored andcommitted
feat(group_theory): monoid / group closure of union
1 parent f7b9d6b commit 065f083

File tree

2 files changed

+91
-4
lines changed

2 files changed

+91
-4
lines changed

src/group_theory/subgroup.lean

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,56 @@ assume a ha, by induction ha; simp [h _, *, one_mem, mul_mem, inv_mem_iff]
159159
lemma closure_subset_iff (s t : set α) [is_subgroup t] : closure s ⊆ t ↔ s ⊆ t :=
160160
⟨assume h b ha, h (mem_closure ha), assume h b ha, closure_subset h ha⟩
161161

162+
theorem closure_mono {s t : set α} (h : s ⊆ t) : closure s ⊆ closure t :=
163+
closure_subset $ set.subset.trans h subset_closure
164+
165+
theorem exists_list_of_mem_closure {s : set α} {a : α} (h : a ∈ closure s) :
166+
(∃l:list α, (∀x∈l, x ∈ s ∨ x⁻¹ ∈ s) ∧ l.prod = a) :=
167+
in_closure.rec_on h
168+
(λ x hxs, ⟨[x], list.forall_mem_singleton.2 $ or.inl hxs, one_mul _⟩)
169+
⟨[], list.forall_mem_nil _, rfl⟩
170+
(λ x _ ⟨L, HL1, HL2⟩, ⟨L.reverse.map has_inv.inv,
171+
λ x hx, let ⟨y, hy1, hy2⟩ := list.exists_of_mem_map hx in
172+
hy2 ▸ or.imp id (by rw [inv_inv]; exact id) (HL1 _ $ list.mem_reverse.1 hy1).symm,
173+
HL2 ▸ list.rec_on L one_inv.symm (λ hd tl ih,
174+
by rw [list.reverse_cons, list.map_append, list.prod_append, ih, list.map_singleton,
175+
list.prod_cons, list.prod_nil, mul_one, list.prod_cons, mul_inv_rev])⟩)
176+
(λ x y hx hy ⟨L1, HL1, HL2⟩ ⟨L2, HL3, HL4⟩, ⟨L1 ++ L2, list.forall_mem_append.2 ⟨HL1, HL3⟩,
177+
by rw [list.prod_append, HL2, HL4]⟩)
178+
179+
theorem mclosure_subset {s : set α} : monoid.closure s ⊆ closure s :=
180+
monoid.closure_subset $ subset_closure
181+
182+
theorem mclosure_inv_subset {s : set α} : monoid.closure (has_inv.inv ⁻¹' s) ⊆ closure s :=
183+
monoid.closure_subset $ λ x hx, inv_inv x ▸ (is_subgroup.inv_mem $ subset_closure hx)
184+
185+
theorem closure_eq_mclosure {s : set α} : closure s = monoid.closure (s ∪ has_inv.inv ⁻¹' s) :=
186+
set.subset.antisymm
187+
(@closure_subset _ _ _ (monoid.closure (s ∪ has_inv.inv ⁻¹' s))
188+
{ inv_mem := λ x hx, monoid.in_closure.rec_on hx
189+
(λ x hx, or.cases_on hx (λ hx, monoid.subset_closure $ or.inr $ show x⁻¹⁻¹ ∈ s, from (inv_inv x).symm ▸ hx)
190+
(λ hx, monoid.subset_closure $ or.inl hx))
191+
((@one_inv α _).symm ▸ is_submonoid.one_mem _)
192+
(λ x y hx hy ihx ihy, (mul_inv_rev x y).symm ▸ is_submonoid.mul_mem ihy ihx) }
193+
(set.subset.trans (set.subset_union_left _ _) monoid.subset_closure))
194+
(monoid.closure_subset $ set.union_subset subset_closure $ λ x hx, inv_inv x ▸ (is_subgroup.inv_mem $ subset_closure hx))
195+
196+
theorem mem_closure_union_iff {α : Type*} [comm_group α] {s t : set α} {x : α} :
197+
x ∈ closure (s ∪ t) ↔ ∃ y ∈ closure s, ∃ z ∈ closure t, y * z = x :=
198+
begin
199+
simp only [closure_eq_mclosure, monoid.mem_closure_union_iff, exists_prop, preimage_union], split,
200+
{ rintro ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, rfl⟩,
201+
refine ⟨_, ⟨_, hys, _, hzs, rfl⟩, _, ⟨_, hyt, _, hzt, rfl⟩, _⟩,
202+
rw [mul_assoc, mul_assoc, mul_left_comm zs], refl },
203+
{ rintro ⟨_, ⟨ys, hys, zs, hzs, rfl⟩, _, ⟨yt, hyt, zt, hzt, rfl⟩, rfl⟩,
204+
refine ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, _⟩,
205+
rw [mul_assoc, mul_assoc, mul_left_comm yt], refl }
206+
end
207+
162208
theorem gpowers_eq_closure {a : α} : gpowers a = closure {a} :=
163209
subset.antisymm
164210
(assume x h, match x, h with _, ⟨i, rfl⟩ := gpow_mem (mem_closure $ by simp) end)
165-
(closure_subset $ by simp [mem_gpowers])
211+
(closure_subset $ by simp [mem_gpowers])
166212

167213
end group
168214

@@ -202,6 +248,26 @@ theorem in_closure.rec_on {C : α → Prop}
202248
C a :=
203249
group.in_closure.rec_on H (λ _, H1) H2 (λ _, H3) (λ _ _, H4)
204250

251+
theorem closure_mono {s t : set α} (h : s ⊆ t) : closure s ⊆ closure t :=
252+
closure_subset $ set.subset.trans h subset_closure
253+
254+
theorem exists_list_of_mem_closure {s : set α} {a : α} (h : a ∈ closure s) :
255+
(∃l:list α, (∀x∈l, x ∈ s ∨ -x ∈ s) ∧ l.sum = a) :=
256+
group.exists_list_of_mem_closure h
257+
258+
theorem mclosure_subset {s : set α} : add_monoid.closure s ⊆ closure s :=
259+
group.mclosure_subset
260+
261+
theorem mclosure_inv_subset {s : set α} : add_monoid.closure (has_neg.neg ⁻¹' s) ⊆ closure s :=
262+
group.mclosure_inv_subset
263+
264+
theorem closure_eq_mclosure {s : set α} : closure s = add_monoid.closure (s ∪ has_neg.neg ⁻¹' s) :=
265+
group.closure_eq_mclosure
266+
267+
theorem mem_closure_union_iff {α : Type*} [add_comm_group α] {s t : set α} {x : α} :
268+
x ∈ closure (s ∪ t) ↔ ∃ y ∈ closure s, ∃ z ∈ closure t, y + z = x :=
269+
group.mem_closure_union_iff
270+
205271
end add_group
206272

207273
class normal_subgroup [group α] (s : set α) extends is_subgroup s : Prop :=

src/group_theory/submonoid.lean

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ assume a, in_closure.basic
148148
theorem closure_subset {s t : set α} [is_submonoid t] (h : s ⊆ t) : closure s ⊆ t :=
149149
assume a ha, by induction ha; simp [h _, *, is_submonoid.one_mem, is_submonoid.mul_mem]
150150

151+
theorem closure_mono {s t : set α} (h : s ⊆ t) : closure s ⊆ closure t :=
152+
closure_subset $ set.subset.trans h subset_closure
153+
151154
theorem exists_list_of_mem_closure {s : set α} {a : α} (h : a ∈ closure s) :
152155
(∃l:list α, (∀x∈l, x ∈ s) ∧ l.prod = a) :=
153156
begin
@@ -163,6 +166,17 @@ begin
163166
}
164167
end
165168

169+
theorem mem_closure_union_iff {α : Type*} [comm_monoid α] {s t : set α} {x : α} :
170+
x ∈ closure (s ∪ t) ↔ ∃ y ∈ closure s, ∃ z ∈ closure t, y * z = x :=
171+
⟨λ hx, let ⟨L, HL1, HL2⟩ := exists_list_of_mem_closure hx in HL2 ▸
172+
list.rec_on L (λ _, ⟨1, is_submonoid.one_mem _, 1, is_submonoid.one_mem _, mul_one _⟩)
173+
(λ hd tl ih HL1, let ⟨y, hy, z, hz, hyzx⟩ := ih (list.forall_mem_of_forall_mem_cons HL1) in
174+
or.cases_on (HL1 hd $ list.mem_cons_self _ _)
175+
(λ hs, ⟨hd * y, is_submonoid.mul_mem (subset_closure hs) hy, z, hz, by rw [mul_assoc, list.prod_cons, ← hyzx]; refl⟩)
176+
(λ ht, ⟨y, hy, z * hd, is_submonoid.mul_mem hz (subset_closure ht), by rw [← mul_assoc, list.prod_cons, ← hyzx, mul_comm hd]; refl⟩)) HL1,
177+
λ ⟨y, hy, z, hz, hyzx⟩, hyzx ▸ is_submonoid.mul_mem (closure_mono (set.subset_union_left _ _) hy)
178+
(closure_mono (set.subset_union_right _ _) hz)⟩
179+
166180
end monoid
167181

168182
namespace add_monoid
@@ -173,14 +187,17 @@ instance closure.is_add_submonoid (s : set β) : is_add_submonoid (closure s) :=
173187
multiplicative.is_submonoid_iff.1 $ monoid.closure.is_submonoid s
174188

175189
theorem subset_closure {s : set β} : s ⊆ closure s :=
176-
@monoid.subset_closure (multiplicative β) _ _
190+
monoid.subset_closure
177191

178192
theorem closure_subset {s t : set β} [is_add_submonoid t] : s ⊆ t → closure s ⊆ t :=
179-
@monoid.closure_subset (multiplicative β) _ _ _ _
193+
monoid.closure_subset
194+
195+
theorem closure_mono {s t : set β} (h : s ⊆ t) : closure s ⊆ closure t :=
196+
closure_subset $ set.subset.trans h subset_closure
180197

181198
theorem exists_list_of_mem_closure {s : set β} {a : β} :
182199
a ∈ closure s → ∃l:list β, (∀x∈l, x ∈ s) ∧ l.sum = a :=
183-
@monoid.exists_list_of_mem_closure (multiplicative β) _ _ _
200+
monoid.exists_list_of_mem_closure
184201

185202
@[elab_as_eliminator]
186203
theorem in_closure.rec_on {s : set β} {C : β → Prop}
@@ -190,4 +207,8 @@ theorem in_closure.rec_on {s : set β} {C : β → Prop}
190207
C a :=
191208
monoid.in_closure.rec_on H (λ _, H1) H2 (λ _ _, H3)
192209

210+
theorem mem_closure_union_iff {β : Type*} [add_comm_monoid β] {s t : set β} {x : β} :
211+
x ∈ closure (s ∪ t) ↔ ∃ y ∈ closure s, ∃ z ∈ closure t, y + z = x :=
212+
monoid.mem_closure_union_iff
213+
193214
end add_monoid

0 commit comments

Comments
 (0)