Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+πŸ–±οΈto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser

! This file was ported from Lean 3 source module group_theory.submonoid.center
! leanprover-community/mathlib commit 6cb77a8eaff0ddd100e87b1591c6d3ad319514ff
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.GroupTheory.Submonoid.Operations
import Mathlib.GroupTheory.Subsemigroup.Center

/-!
# Centers of monoids

## Main definitions

* `Submonoid.center`: the center of a monoid
* `AddSubmonoid.center`: the center of an additive monoid

We provide `Subgroup.center`, `AddSubgroup.center`, `Subsemiring.center`, and `Subring.center` in
other files.
-/


namespace Submonoid

section

variable (
M: Type ?u.8
M
:
Type _: Type (?u.1801+1)
Type _
) [
Monoid: Type ?u.5 β†’ Type ?u.5
Monoid
M: Type ?u.575
M
] /-- The center of a monoid `M` is the set of elements that commute with everything in `M` -/ @[
to_additive: (M : Type u_1) β†’ [inst : AddMonoid M] β†’ AddSubmonoid M
to_additive
"The center of a monoid `M` is the set of elements that commute with everything in `M`"] def
center: (M : Type u_1) β†’ [inst : Monoid M] β†’ Submonoid M
center
:
Submonoid: (M : Type ?u.14) β†’ [inst : MulOneClass M] β†’ Type ?u.14
Submonoid
M: Type ?u.8
M
where carrier :=
Set.center: (M : Type ?u.297) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.8
M
one_mem' :=
Set.one_mem_center: βˆ€ (M : Type ?u.451) [inst : MulOneClass M], 1 ∈ Set.center M
Set.one_mem_center
M: Type ?u.8
M
mul_mem' :=
Set.mul_mem_center: βˆ€ {M : Type ?u.303} [inst : Semigroup M] {a b : M}, a ∈ Set.center M β†’ b ∈ Set.center M β†’ a * b ∈ Set.center M
Set.mul_mem_center
#align submonoid.center
Submonoid.center: (M : Type u_1) β†’ [inst : Monoid M] β†’ Submonoid M
Submonoid.center
#align add_submonoid.center
AddSubmonoid.center: (M : Type u_1) β†’ [inst : AddMonoid M] β†’ AddSubmonoid M
AddSubmonoid.center
@[
to_additive: βˆ€ (M : Type u_1) [inst : AddMonoid M], ↑(AddSubmonoid.center M) = Set.addCenter M
to_additive
] theorem
coe_center: ↑(center M) = Set.center M
coe_center
: ↑(
center: (M : Type ?u.785) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.575
M
) =
Set.center: (M : Type ?u.585) β†’ [inst : Mul M] β†’ Set M
Set.center
M: Type ?u.575
M
:=
rfl: βˆ€ {Ξ± : Sort ?u.881} {a : Ξ±}, a = a
rfl
#align submonoid.coe_center
Submonoid.coe_center: βˆ€ (M : Type u_1) [inst : Monoid M], ↑(center M) = Set.center M
Submonoid.coe_center
#align add_submonoid.coe_center
AddSubmonoid.coe_center: βˆ€ (M : Type u_1) [inst : AddMonoid M], ↑(AddSubmonoid.center M) = Set.addCenter M
AddSubmonoid.coe_center
@[to_additive (attr := simp)
AddSubmonoid.center_toAddSubsemigroup: βˆ€ (M : Type u_1) [inst : AddMonoid M], (AddSubmonoid.center M).toAddSubsemigroup = AddSubsemigroup.center M
AddSubmonoid.center_toAddSubsemigroup
] theorem
center_toSubsemigroup: (center M).toSubsemigroup = Subsemigroup.center M
center_toSubsemigroup
: (
center: (M : Type ?u.907) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.900
M
).
toSubsemigroup: {M : Type ?u.917} β†’ [inst : MulOneClass M] β†’ Submonoid M β†’ Subsemigroup M
toSubsemigroup
=
Subsemigroup.center: (M : Type ?u.1022) β†’ [inst : Semigroup M] β†’ Subsemigroup M
Subsemigroup.center
M: Type ?u.900
M
:=
rfl: βˆ€ {Ξ± : Sort ?u.1133} {a : Ξ±}, a = a
rfl
#align submonoid.center_to_subsemigroup
Submonoid.center_toSubsemigroup: βˆ€ (M : Type u_1) [inst : Monoid M], (center M).toSubsemigroup = Subsemigroup.center M
Submonoid.center_toSubsemigroup
variable {
M: ?m.1183
M
} @[
to_additive: βˆ€ {M : Type u_1} [inst : AddMonoid M] {z : M}, z ∈ AddSubmonoid.center M ↔ βˆ€ (g : M), g + z = z + g
to_additive
] theorem
mem_center_iff: βˆ€ {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
{
z: M
z
:
M: Type ?u.1186
M
} :
z: M
z
∈
center: (M : Type ?u.1199) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.1186
M
↔ βˆ€
g: ?m.1234
g
,
g: ?m.1234
g
*
z: M
z
=
z: M
z
*
g: ?m.1234
g
:=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align submonoid.mem_center_iff
Submonoid.mem_center_iff: βˆ€ {M : Type u_1} [inst : Monoid M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
Submonoid.mem_center_iff
#align add_submonoid.mem_center_iff
AddSubmonoid.mem_center_iff: βˆ€ {M : Type u_1} [inst : AddMonoid M] {z : M}, z ∈ AddSubmonoid.center M ↔ βˆ€ (g : M), g + z = z + g
AddSubmonoid.mem_center_iff
@[
to_additive: {M : Type u_1} β†’ [inst : AddMonoid M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b + a = a + b)] β†’ Decidable (a ∈ AddSubmonoid.center M)
to_additive
] instance
decidableMemCenter: (a : M) β†’ [inst : Decidable (βˆ€ (b : M), b * a = a * b)] β†’ Decidable (a ∈ center M)
decidableMemCenter
(
a: ?m.1807
a
) [
Decidable: Prop β†’ Type
Decidable
<| βˆ€
b: M
b
:
M: Type ?u.1801
M
,
b: M
b
*
a: ?m.1807
a
=
a: ?m.1807
a
*
b: M
b
] :
Decidable: Prop β†’ Type
Decidable
(
a: ?m.1807
a
∈
center: (M : Type ?u.2364) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.1801
M
) :=
decidable_of_iff': {a : Prop} β†’ (b : Prop) β†’ (a ↔ b) β†’ [inst : Decidable b] β†’ Decidable a
decidable_of_iff'
_: Prop
_
mem_center_iff: βˆ€ {M : Type ?u.2400} [inst : Monoid M] {z : M}, z ∈ center M ↔ βˆ€ (g : M), g * z = z * g
mem_center_iff
#align submonoid.decidable_mem_center
Submonoid.decidableMemCenter: {M : Type u_1} β†’ [inst : Monoid M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b * a = a * b)] β†’ Decidable (a ∈ center M)
Submonoid.decidableMemCenter
#align add_submonoid.decidable_mem_center
AddSubmonoid.decidableMemCenter: {M : Type u_1} β†’ [inst : AddMonoid M] β†’ (a : M) β†’ [inst_1 : Decidable (βˆ€ (b : M), b + a = a + b)] β†’ Decidable (a ∈ AddSubmonoid.center M)
AddSubmonoid.decidableMemCenter
/-- The center of a monoid is commutative. -/ instance
center.commMonoid: CommMonoid { x // x ∈ center M }
center.commMonoid
:
CommMonoid: Type ?u.2610 β†’ Type ?u.2610
CommMonoid
(
center: (M : Type ?u.2611) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.2604
M
) := { (
center: (M : Type ?u.2766) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.2604
M
).
toMonoid: {M : Type ?u.2768} β†’ [inst : Monoid M] β†’ (S : Submonoid M) β†’ Monoid { x // x ∈ S }
toMonoid
with mul_comm := fun
_: ?m.2825
_
b: ?m.2828
b
=>
Subtype.ext: βˆ€ {Ξ± : Sort ?u.2830} {p : Ξ± β†’ Prop} {a1 a2 : { x // p x }}, ↑a1 = ↑a2 β†’ a1 = a2
Subtype.ext
<|
b: ?m.2828
b
.
prop: βˆ€ {Ξ± : Sort ?u.2841} {p : Ξ± β†’ Prop} (x : Subtype p), p ↑x
prop
_: M
_
} /-- The center of a monoid acts commutatively on that monoid. -/ instance
center.smulCommClass_left: βˆ€ {M : Type u_1} [inst : Monoid M], SMulCommClass { x // x ∈ center M } M M
center.smulCommClass_left
:
SMulCommClass: (M : Type ?u.2979) β†’ (N : Type ?u.2978) β†’ (Ξ± : Type ?u.2977) β†’ [inst : SMul M Ξ±] β†’ [inst : SMul N Ξ±] β†’ Prop
SMulCommClass
(
center: (M : Type ?u.2980) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.2971
M
)
M: Type ?u.2971
M
M: Type ?u.2971
M
where smul_comm
m: ?m.3981
m
x: ?m.3984
x
y: ?m.3987
y
:= (
Commute.left_comm: βˆ€ {S : Type ?u.3989} [inst : Semigroup S] {a b : S}, Commute a b β†’ βˆ€ (c : S), a * (b * c) = b * (a * c)
Commute.left_comm
(
m: ?m.3981
m
.
prop: βˆ€ {Ξ± : Sort ?u.3994} {p : Ξ± β†’ Prop} (x : Subtype p), p ↑x
prop
x: ?m.3984
x
)
y: ?m.3987
y
).
symm: βˆ€ {Ξ± : Sort ?u.4117} {a b : Ξ±}, a = b β†’ b = a
symm
#align submonoid.center.smul_comm_class_left
Submonoid.center.smulCommClass_left: βˆ€ {M : Type u_1} [inst : Monoid M], SMulCommClass { x // x ∈ center M } M M
Submonoid.center.smulCommClass_left
/-- The center of a monoid acts commutatively on that monoid. -/ instance
center.smulCommClass_right: βˆ€ {M : Type u_1} [inst : Monoid M], SMulCommClass M { x // x ∈ center M } M
center.smulCommClass_right
:
SMulCommClass: (M : Type ?u.4168) β†’ (N : Type ?u.4167) β†’ (Ξ± : Type ?u.4166) β†’ [inst : SMul M Ξ±] β†’ [inst : SMul N Ξ±] β†’ Prop
SMulCommClass
M: Type ?u.4160
M
(
center: (M : Type ?u.4169) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.4160
M
)
M: Type ?u.4160
M
:=
SMulCommClass.symm: βˆ€ (M : Type ?u.5156) (N : Type ?u.5157) (Ξ± : Type ?u.5158) [inst : SMul M Ξ±] [inst_1 : SMul N Ξ±] [inst_2 : SMulCommClass M N Ξ±], SMulCommClass N M Ξ±
SMulCommClass.symm
_: Type ?u.5156
_
_: Type ?u.5157
_
_: Type ?u.5158
_
#align submonoid.center.smul_comm_class_right
Submonoid.center.smulCommClass_right: βˆ€ {M : Type u_1} [inst : Monoid M], SMulCommClass M { x // x ∈ center M } M
Submonoid.center.smulCommClass_right
/-! Note that `smulCommClass (center M) (center M) M` is already implied by `Submonoid.smulCommClass_right` -/
example: βˆ€ {M : Type u_1} [inst : Monoid M], SMulCommClass { x // x ∈ center M } { x // x ∈ center M } M
example
:
SMulCommClass: (M : Type ?u.5331) β†’ (N : Type ?u.5330) β†’ (Ξ± : Type ?u.5329) β†’ [inst : SMul M Ξ±] β†’ [inst : SMul N Ξ±] β†’ Prop
SMulCommClass
(
center: (M : Type ?u.5332) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.5323
M
) (
center: (M : Type ?u.5483) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.5323
M
)
M: Type ?u.5323
M
:=

Goals accomplished! πŸ™
M: Type ?u.5323

inst✝: Monoid M


SMulCommClass { x // x ∈ center M } { x // x ∈ center M } M

Goals accomplished! πŸ™
end section variable (
M: Type ?u.6168
M
:
Type _: Type (?u.6162+1)
Type _
) [
CommMonoid: Type ?u.6165 β†’ Type ?u.6165
CommMonoid
M: Type ?u.6162
M
] @[simp] theorem
center_eq_top: βˆ€ (M : Type u_1) [inst : CommMonoid M], center M = ⊀
center_eq_top
:
center: (M : Type ?u.6175) β†’ [inst : Monoid M] β†’ Submonoid M
center
M: Type ?u.6168
M
=
⊀: ?m.6349
⊀
:=
SetLike.coe_injective: βˆ€ {A : Type ?u.6405} {B : Type ?u.6406} [i : SetLike A B], Function.Injective SetLike.coe
SetLike.coe_injective
(
Set.center_eq_univ: βˆ€ (M : Type ?u.6425) [inst : CommSemigroup M], Set.center M = Set.univ
Set.center_eq_univ
M: Type ?u.6168
M
) #align submonoid.center_eq_top
Submonoid.center_eq_top: βˆ€ (M : Type u_1) [inst : CommMonoid M], center M = ⊀
Submonoid.center_eq_top
end end Submonoid -- Guard against import creep assert_not_exists Finset