@@ -145,143 +145,150 @@ le_antisymm
145
145
end
146
146
147
147
namespace submonoid
148
+ variables {F : Type *} [mc : monoid_hom_class F M N]
148
149
149
150
open set
150
151
151
152
/-!
152
153
### `comap` and `map`
153
154
-/
154
155
156
+ include mc
155
157
/-- The preimage of a submonoid along a monoid homomorphism is a submonoid. -/
156
158
@[to_additive " The preimage of an `add_submonoid` along an `add_monoid` homomorphism is an
157
159
`add_submonoid`." ]
158
- def comap (f : M →* N ) (S : submonoid N) : submonoid M :=
160
+ def comap (f : F ) (S : submonoid N) : submonoid M :=
159
161
{ carrier := (f ⁻¹' S),
160
- one_mem' := show f 1 ∈ S, by rw f. map_one; exact S.one_mem,
162
+ one_mem' := show f 1 ∈ S, by rw map_one; exact S.one_mem,
161
163
mul_mem' := λ a b ha hb,
162
- show f (a * b) ∈ S, by rw f. map_mul; exact S.mul_mem ha hb }
164
+ show f (a * b) ∈ S, by rw map_mul; exact S.mul_mem ha hb }
163
165
164
166
@[simp, to_additive]
165
- lemma coe_comap (S : submonoid N) (f : M →* N ) : (S.comap f : set M) = f ⁻¹' S := rfl
167
+ lemma coe_comap (S : submonoid N) (f : F ) : (S.comap f : set M) = f ⁻¹' S := rfl
166
168
167
169
@[simp, to_additive]
168
- lemma mem_comap {S : submonoid N} {f : M →* N} {x : M} : x ∈ S.comap f ↔ f x ∈ S := iff.rfl
170
+ lemma mem_comap {S : submonoid N} {f : F} {x : M} : x ∈ S.comap f ↔ f x ∈ S := iff.rfl
171
+ omit mc
169
172
170
173
@[to_additive]
171
174
lemma comap_comap (S : submonoid P) (g : N →* P) (f : M →* N) :
172
175
(S.comap g).comap f = S.comap (g.comp f) :=
173
176
rfl
174
177
175
178
@[simp, to_additive]
176
- lemma comap_id (S : submonoid P) : S.comap (monoid_hom.id _ ) = S :=
179
+ lemma comap_id (S : submonoid P) : S.comap (monoid_hom.id P ) = S :=
177
180
ext (by simp)
178
181
182
+ include mc
179
183
/-- The image of a submonoid along a monoid homomorphism is a submonoid. -/
180
184
@[to_additive " The image of an `add_submonoid` along an `add_monoid` homomorphism is
181
185
an `add_submonoid`." ]
182
- def map (f : M →* N ) (S : submonoid M) : submonoid N :=
186
+ def map (f : F ) (S : submonoid M) : submonoid N :=
183
187
{ carrier := (f '' S),
184
- one_mem' := ⟨1 , S.one_mem, f. map_one⟩,
188
+ one_mem' := ⟨1 , S.one_mem, map_one f ⟩,
185
189
mul_mem' := begin rintros _ _ ⟨x, hx, rfl⟩ ⟨y, hy, rfl⟩, exact ⟨x * y, S.mul_mem hx hy,
186
- by rw f. map_mul; refl⟩ end }
190
+ by rw map_mul; refl⟩ end }
187
191
188
192
@[simp, to_additive]
189
- lemma coe_map (f : M →* N ) (S : submonoid M) :
193
+ lemma coe_map (f : F ) (S : submonoid M) :
190
194
(S.map f : set N) = f '' S := rfl
191
195
192
196
@[simp, to_additive]
193
- lemma mem_map {f : M →* N } {S : submonoid M} {y : N} :
197
+ lemma mem_map {f : F } {S : submonoid M} {y : N} :
194
198
y ∈ S.map f ↔ ∃ x ∈ S, f x = y :=
195
199
mem_image_iff_bex
196
200
197
201
@[to_additive]
198
- lemma mem_map_of_mem (f : M →* N ) {S : submonoid M} {x : M} (hx : x ∈ S) : f x ∈ S.map f :=
202
+ lemma mem_map_of_mem (f : F ) {S : submonoid M} {x : M} (hx : x ∈ S) : f x ∈ S.map f :=
199
203
mem_image_of_mem f hx
200
204
201
205
@[to_additive]
202
- lemma apply_coe_mem_map (f : M →* N ) (S : submonoid M) (x : S) : f x ∈ S.map f :=
206
+ lemma apply_coe_mem_map (f : F ) (S : submonoid M) (x : S) : f x ∈ S.map f :=
203
207
mem_map_of_mem f x.prop
208
+ omit mc
204
209
205
210
@[to_additive]
206
211
lemma map_map (g : N →* P) (f : M →* N) : (S.map f).map g = S.map (g.comp f) :=
207
212
set_like.coe_injective $ image_image _ _ _
208
213
214
+ include mc
209
215
@[to_additive]
210
- lemma mem_map_iff_mem {f : M →* N } (hf : function.injective f) {S : submonoid M} {x : M} :
216
+ lemma mem_map_iff_mem {f : F } (hf : function.injective f) {S : submonoid M} {x : M} :
211
217
f x ∈ S.map f ↔ x ∈ S :=
212
218
hf.mem_set_image
213
219
214
220
@[to_additive]
215
- lemma map_le_iff_le_comap {f : M →* N } {S : submonoid M} {T : submonoid N} :
221
+ lemma map_le_iff_le_comap {f : F } {S : submonoid M} {T : submonoid N} :
216
222
S.map f ≤ T ↔ S ≤ T.comap f :=
217
223
image_subset_iff
218
224
219
225
@[to_additive]
220
- lemma gc_map_comap (f : M →* N ) : galois_connection (map f) (comap f) :=
226
+ lemma gc_map_comap (f : F ) : galois_connection (map f) (comap f) :=
221
227
λ S T, map_le_iff_le_comap
222
228
223
229
@[to_additive]
224
- lemma map_le_of_le_comap {T : submonoid N} {f : M →* N } : S ≤ T.comap f → S.map f ≤ T :=
230
+ lemma map_le_of_le_comap {T : submonoid N} {f : F } : S ≤ T.comap f → S.map f ≤ T :=
225
231
(gc_map_comap f).l_le
226
232
227
233
@[to_additive]
228
- lemma le_comap_of_map_le {T : submonoid N} {f : M →* N } : S.map f ≤ T → S ≤ T.comap f :=
234
+ lemma le_comap_of_map_le {T : submonoid N} {f : F } : S.map f ≤ T → S ≤ T.comap f :=
229
235
(gc_map_comap f).le_u
230
236
231
237
@[to_additive]
232
- lemma le_comap_map {f : M →* N } : S ≤ (S.map f).comap f :=
238
+ lemma le_comap_map {f : F } : S ≤ (S.map f).comap f :=
233
239
(gc_map_comap f).le_u_l _
234
240
235
241
@[to_additive]
236
- lemma map_comap_le {S : submonoid N} {f : M →* N } : (S.comap f).map f ≤ S :=
242
+ lemma map_comap_le {S : submonoid N} {f : F } : (S.comap f).map f ≤ S :=
237
243
(gc_map_comap f).l_u_le _
238
244
239
245
@[to_additive]
240
- lemma monotone_map {f : M →* N } : monotone (map f) :=
246
+ lemma monotone_map {f : F } : monotone (map f) :=
241
247
(gc_map_comap f).monotone_l
242
248
243
249
@[to_additive]
244
- lemma monotone_comap {f : M →* N } : monotone (comap f) :=
250
+ lemma monotone_comap {f : F } : monotone (comap f) :=
245
251
(gc_map_comap f).monotone_u
246
252
247
253
@[simp, to_additive]
248
- lemma map_comap_map {f : M →* N } : ((S.map f).comap f).map f = S.map f :=
254
+ lemma map_comap_map {f : F } : ((S.map f).comap f).map f = S.map f :=
249
255
(gc_map_comap f).l_u_l_eq_l _
250
256
251
257
@[simp, to_additive]
252
- lemma comap_map_comap {S : submonoid N} {f : M →* N } : ((S.comap f).map f).comap f = S.comap f :=
258
+ lemma comap_map_comap {S : submonoid N} {f : F } : ((S.comap f).map f).comap f = S.comap f :=
253
259
(gc_map_comap f).u_l_u_eq_u _
254
260
255
261
@[to_additive]
256
- lemma map_sup (S T : submonoid M) (f : M →* N ) : (S ⊔ T).map f = S.map f ⊔ T.map f :=
257
- (gc_map_comap f).l_sup
262
+ lemma map_sup (S T : submonoid M) (f : F ) : (S ⊔ T).map f = S.map f ⊔ T.map f :=
263
+ (gc_map_comap f : galois_connection (map f) (comap f) ).l_sup
258
264
259
265
@[to_additive]
260
- lemma map_supr {ι : Sort *} (f : M →* N ) (s : ι → submonoid M) :
266
+ lemma map_supr {ι : Sort *} (f : F ) (s : ι → submonoid M) :
261
267
(supr s).map f = ⨆ i, (s i).map f :=
262
- (gc_map_comap f).l_supr
268
+ (gc_map_comap f : galois_connection (map f) (comap f) ).l_supr
263
269
264
270
@[to_additive]
265
- lemma comap_inf (S T : submonoid N) (f : M →* N ) : (S ⊓ T).comap f = S.comap f ⊓ T.comap f :=
266
- (gc_map_comap f).u_inf
271
+ lemma comap_inf (S T : submonoid N) (f : F ) : (S ⊓ T).comap f = S.comap f ⊓ T.comap f :=
272
+ (gc_map_comap f : galois_connection (map f) (comap f) ).u_inf
267
273
268
274
@[to_additive]
269
- lemma comap_infi {ι : Sort *} (f : M →* N ) (s : ι → submonoid N) :
275
+ lemma comap_infi {ι : Sort *} (f : F ) (s : ι → submonoid N) :
270
276
(infi s).comap f = ⨅ i, (s i).comap f :=
271
- (gc_map_comap f).u_infi
277
+ (gc_map_comap f : galois_connection (map f) (comap f) ).u_infi
272
278
273
- @[simp, to_additive] lemma map_bot (f : M →* N ) : (⊥ : submonoid M).map f = ⊥ :=
279
+ @[simp, to_additive] lemma map_bot (f : F ) : (⊥ : submonoid M).map f = ⊥ :=
274
280
(gc_map_comap f).l_bot
275
281
276
- @[simp, to_additive] lemma comap_top (f : M →* N ) : (⊤ : submonoid N).comap f = ⊤ :=
282
+ @[simp, to_additive] lemma comap_top (f : F ) : (⊤ : submonoid N).comap f = ⊤ :=
277
283
(gc_map_comap f).u_top
284
+ omit mc
278
285
279
286
@[simp, to_additive] lemma map_id (S : submonoid M) : S.map (monoid_hom.id M) = S :=
280
287
ext (λ x, ⟨λ ⟨_, h, rfl⟩, h, λ h, ⟨_, h, rfl⟩⟩)
281
288
282
289
section galois_coinsertion
283
290
284
- variables {ι : Type *} {f : M →* N } (hf : function.injective f)
291
+ variables {ι : Type *} {f : F } (hf : function.injective f)
285
292
286
293
include hf
287
294
@@ -331,7 +338,7 @@ end galois_coinsertion
331
338
332
339
section galois_insertion
333
340
334
- variables {ι : Type *} {f : M →* N } (hf : function.surjective f)
341
+ variables {ι : Type *} {f : F } (hf : function.surjective f)
335
342
336
343
include hf
337
344
720
727
end submonoid
721
728
722
729
namespace monoid_hom
730
+ variables {F : Type *} [mc : monoid_hom_class F M N]
723
731
724
732
open submonoid
725
733
@@ -754,53 +762,57 @@ def mrange (f : M →* N) : submonoid N :=
754
762
-/
755
763
library_note " range copy pattern"
756
764
765
+ include mc
757
766
/-- The range of a monoid homomorphism is a submonoid. See Note [range copy pattern]. -/
758
767
@[to_additive " The range of an `add_monoid_hom` is an `add_submonoid`." ]
759
- def mrange (f : M →* N ) : submonoid N :=
768
+ def mrange (f : F ) : submonoid N :=
760
769
((⊤ : submonoid M).map f).copy (set.range f) set.image_univ.symm
761
770
762
771
@[simp, to_additive]
763
- lemma coe_mrange (f : M →* N ) :
764
- (f. mrange : set N) = set.range f :=
772
+ lemma coe_mrange (f : F ) :
773
+ (mrange f : set N) = set.range f :=
765
774
rfl
766
775
767
- @[simp, to_additive] lemma mem_mrange {f : M →* N } {y : N} :
768
- y ∈ f. mrange ↔ ∃ x, f x = y :=
776
+ @[simp, to_additive] lemma mem_mrange {f : F } {y : N} :
777
+ y ∈ mrange f ↔ ∃ x, f x = y :=
769
778
iff.rfl
770
779
771
- @[to_additive] lemma mrange_eq_map (f : M →* N ) : f. mrange = (⊤ : submonoid M).map f :=
780
+ @[to_additive] lemma mrange_eq_map (f : F ) : mrange f = (⊤ : submonoid M).map f :=
772
781
copy_eq _
782
+ omit mc
773
783
774
784
@[to_additive]
775
785
lemma map_mrange (g : N →* P) (f : M →* N) : f.mrange.map g = (g.comp f).mrange :=
776
786
by simpa only [mrange_eq_map] using (⊤ : submonoid M).map_map g f
777
787
788
+ include mc
778
789
@[to_additive]
779
- lemma mrange_top_iff_surjective {N} [mul_one_class N] { f : M →* N } :
780
- f. mrange = (⊤ : submonoid N) ↔ function.surjective f :=
790
+ lemma mrange_top_iff_surjective {f : F } :
791
+ mrange f = (⊤ : submonoid N) ↔ function.surjective f :=
781
792
set_like.ext'_iff.trans $ iff.trans (by rw [coe_mrange, coe_top]) set.range_iff_surjective
782
793
783
794
/-- The range of a surjective monoid hom is the whole of the codomain. -/
784
795
@[to_additive " The range of a surjective `add_monoid` hom is the whole of the codomain." ]
785
- lemma mrange_top_of_surjective {N} [mul_one_class N] (f : M →* N ) (hf : function.surjective f) :
786
- f. mrange = (⊤ : submonoid N) :=
796
+ lemma mrange_top_of_surjective (f : F ) (hf : function.surjective f) :
797
+ mrange f = (⊤ : submonoid N) :=
787
798
mrange_top_iff_surjective.2 hf
788
799
789
800
@[to_additive]
790
- lemma mclosure_preimage_le (f : M →* N ) (s : set N) :
801
+ lemma mclosure_preimage_le (f : F ) (s : set N) :
791
802
closure (f ⁻¹' s) ≤ (closure s).comap f :=
792
803
closure_le.2 $ λ x hx, set_like.mem_coe.2 $ mem_comap.2 $ subset_closure hx
793
804
794
805
/-- The image under a monoid hom of the submonoid generated by a set equals the submonoid generated
795
806
by the image of the set. -/
796
807
@[to_additive " The image under an `add_monoid` hom of the `add_submonoid` generated by a set equals
797
808
the `add_submonoid` generated by the image of the set." ]
798
- lemma map_mclosure (f : M →* N ) (s : set M) :
809
+ lemma map_mclosure (f : F ) (s : set M) :
799
810
(closure s).map f = closure (f '' s) :=
800
811
le_antisymm
801
812
(map_le_iff_le_comap.2 $ le_trans (closure_mono $ set.subset_preimage_image _ _)
802
813
(mclosure_preimage_le _ _))
803
814
(closure_le.2 $ set.image_subset _ subset_closure)
815
+ omit mc
804
816
805
817
/-- Restriction of a monoid hom to a submonoid of the domain. -/
806
818
@[to_additive " Restriction of an add_monoid hom to an `add_submonoid` of the domain." ]
@@ -836,28 +848,32 @@ rfl
836
848
lemma mrange_restrict_surjective (f : M →* N) : function.surjective f.mrange_restrict :=
837
849
λ ⟨_, ⟨x, rfl⟩⟩, ⟨x, rfl⟩
838
850
851
+ include mc
839
852
/-- The multiplicative kernel of a monoid homomorphism is the submonoid of elements `x : G` such
840
853
that `f x = 1` -/
841
854
@[to_additive " The additive kernel of an `add_monoid` homomorphism is the `add_submonoid` of
842
855
elements such that `f x = 0`" ]
843
- def mker (f : M →* N ) : submonoid M := (⊥ : submonoid N).comap f
856
+ def mker (f : F ) : submonoid M := (⊥ : submonoid N).comap f
844
857
845
858
@[to_additive]
846
- lemma mem_mker (f : M →* N ) {x : M} : x ∈ f. mker ↔ f x = 1 := iff.rfl
859
+ lemma mem_mker (f : F ) {x : M} : x ∈ mker f ↔ f x = 1 := iff.rfl
847
860
848
861
@[to_additive]
849
- lemma coe_mker (f : M →* N ) : (f. mker : set M) = (f : M → N) ⁻¹' {1 } := rfl
862
+ lemma coe_mker (f : F ) : (mker f : set M) = (f : M → N) ⁻¹' {1 } := rfl
850
863
851
864
@[to_additive]
852
- instance decidable_mem_mker [decidable_eq N] (f : M →* N) :
853
- decidable_pred (∈ f.mker) :=
854
- λ x, decidable_of_iff (f x = 1 ) f.mem_mker
865
+ instance decidable_mem_mker [decidable_eq N] (f : F) :
866
+ decidable_pred (∈ mker f) :=
867
+ λ x, decidable_of_iff (f x = 1 ) (mem_mker f)
868
+ omit mc
855
869
856
870
@[to_additive]
857
871
lemma comap_mker (g : N →* P) (f : M →* N) : g.mker.comap f = (g.comp f).mker := rfl
858
872
859
- @[simp, to_additive] lemma comap_bot' (f : M →* N) :
860
- (⊥ : submonoid N).comap f = f.mker := rfl
873
+ include mc
874
+ @[simp, to_additive] lemma comap_bot' (f : F) :
875
+ (⊥ : submonoid N).comap f = mker f := rfl
876
+ omit mc
861
877
862
878
@[to_additive] lemma range_restrict_mker (f : M →* N) : mker (mrange_restrict f) = mker f :=
863
879
begin
@@ -931,11 +947,11 @@ lemma mrange_inr' : (inr M N).mrange = comap (fst M N) ⊥ := mrange_inr.trans (
931
947
932
948
@[simp, to_additive]
933
949
lemma mrange_fst : (fst M N).mrange = ⊤ :=
934
- (fst M N).mrange_top_of_surjective $ @prod.fst_surjective _ _ ⟨1 ⟩
950
+ mrange_top_of_surjective (fst M N) $ @prod.fst_surjective _ _ ⟨1 ⟩
935
951
936
952
@[simp, to_additive]
937
953
lemma mrange_snd : (snd M N).mrange = ⊤ :=
938
- (snd M N).mrange_top_of_surjective $ @prod.snd_surjective _ _ ⟨1 ⟩
954
+ mrange_top_of_surjective (snd M N) $ @prod.snd_surjective _ _ ⟨1 ⟩
939
955
940
956
@[to_additive]
941
957
lemma prod_eq_bot_iff {s : submonoid M} {t : submonoid N} :
0 commit comments