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) 2018 Kenny Lau. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johan Commelin, Kenny Lau, Robert Y. Lewis

! This file was ported from Lean 3 source module group_theory.eckmann_hilton
! leanprover-community/mathlib commit 41cf0cc2f528dd40a8f2db167ea4fb37b8fde7f3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Group.Defs

/-!
# Eckmann-Hilton argument

The Eckmann-Hilton argument says that if a type carries two monoid structures that distribute
over one another, then they are equal, and in addition commutative.
The main application lies in proving that higher homotopy groups (`ฯ€โ‚™` for `n โ‰ฅ 2`) are commutative.

## Main declarations

* `EckmannHilton.commMonoid`: If a type carries a unital magma structure that distributes
  over a unital binary operation, then the magma is a commutative monoid.
* `EckmannHilton.commGroup`: If a type carries a group structure that distributes
  over a unital binary operation, then the group is commutative.

-/

universe u

namespace EckmannHilton

variable {
X: Type u
X
:
Type u: Type (u+1)
Type u
} /-- Local notation for `m a b`. -/ local notation
a: ?m.180
a
" <"
m: ?m.173
m
:51 "> "
b: ?m.164
b
=>
m: ?m.173
m
a: ?m.180
a
b: ?m.164
b
/-- `IsUnital m e` expresses that `e : X` is a left and right unit for the binary operation `m : X โ†’ X โ†’ X`. -/ structure
IsUnital: {X : Type u} โ†’ (X โ†’ X โ†’ X) โ†’ X โ†’ Prop
IsUnital
(
m: X โ†’ X โ†’ X
m
:
X: Type u
X
โ†’
X: Type u
X
โ†’
X: Type u
X
) (
e: X
e
:
X: Type u
X
) extends
IsLeftId: (ฮฑ : Type ?u.1995) โ†’ (ฮฑ โ†’ ฮฑ โ†’ ฮฑ) โ†’ outParam ฮฑ โ†’ Prop
IsLeftId
_: Type ?u.1995
_
m: X โ†’ X โ†’ X
m
e: X
e
,
IsRightId: (ฮฑ : Type ?u.2006) โ†’ (ฮฑ โ†’ ฮฑ โ†’ ฮฑ) โ†’ outParam ฮฑ โ†’ Prop
IsRightId
_: Type ?u.2006
_
m: X โ†’ X โ†’ X
m
e: X
e
:
Prop: Type
Prop
#align eckmann_hilton.is_unital
EckmannHilton.IsUnital: {X : Type u} โ†’ (X โ†’ X โ†’ X) โ†’ X โ†’ Prop
EckmannHilton.IsUnital
@[to_additive
EckmannHilton.AddZeroClass.IsUnital: โˆ€ {X : Type u} [_G : AddZeroClass X], IsUnital (fun x x_1 => x + x_1) 0
EckmannHilton.AddZeroClass.IsUnital
] theorem
MulOneClass.isUnital: โˆ€ [_G : MulOneClass X], IsUnital (fun x x_1 => x * x_1) 1
MulOneClass.isUnital
[_G :
MulOneClass: Type ?u.2027 โ†’ Type ?u.2027
MulOneClass
X: Type u
X
] :
IsUnital: {X : Type ?u.2030} โ†’ (X โ†’ X โ†’ X) โ†’ X โ†’ Prop
IsUnital
(ยท * ยท): X โ†’ X โ†’ X
(ยท * ยท)
(
1: ?m.2068
1
:
X: Type u
X
) :=
IsUnital.mk: โˆ€ {X : Type ?u.2209} {m : X โ†’ X โ†’ X} {e : X}, IsLeftId X m e โ†’ IsRightId X m e โ†’ IsUnital m e
IsUnital.mk
โŸจ
MulOneClass.one_mul: โˆ€ {M : Type ?u.2237} [self : MulOneClass M] (a : M), 1 * a = a
MulOneClass.one_mul
โŸฉ โŸจ
MulOneClass.mul_one: โˆ€ {M : Type ?u.2279} [self : MulOneClass M] (a : M), a * 1 = a
MulOneClass.mul_one
โŸฉ #align eckmann_hilton.mul_one_class.is_unital
EckmannHilton.MulOneClass.isUnital: โˆ€ {X : Type u} [_G : MulOneClass X], IsUnital (fun x x_1 => x * x_1) 1
EckmannHilton.MulOneClass.isUnital
#align eckmann_hilton.add_zero_class.is_unital
EckmannHilton.AddZeroClass.IsUnital: โˆ€ {X : Type u} [_G : AddZeroClass X], IsUnital (fun x x_1 => x + x_1) 0
EckmannHilton.AddZeroClass.IsUnital
variable {
mโ‚: X โ†’ X โ†’ X
mโ‚
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
:
X: Type u
X
โ†’
X: Type u
X
โ†’
X: Type u
X
} {
eโ‚: X
eโ‚
eโ‚‚: X
eโ‚‚
:
X: Type u
X
} variable (
hโ‚: IsUnital mโ‚ eโ‚
hโ‚
:
IsUnital: {X : Type ?u.2341} โ†’ (X โ†’ X โ†’ X) โ†’ X โ†’ Prop
IsUnital
mโ‚: X โ†’ X โ†’ X
mโ‚
eโ‚: X
eโ‚
) (
hโ‚‚: IsUnital mโ‚‚ eโ‚‚
hโ‚‚
:
IsUnital: {X : Type ?u.2389} โ†’ (X โ†’ X โ†’ X) โ†’ X โ†’ Prop
IsUnital
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
eโ‚‚: X
eโ‚‚
) variable (
distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)
distrib
: โˆ€
a: ?m.2400
a
b: ?m.3268
b
c: ?m.2461
c
d: ?m.2464
d
, ((
a: ?m.2455
a
<
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
>
b: ?m.2458
b
) <
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.2461
c
<
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
>
d: ?m.2464
d
) = (
a: ?m.2400
a
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.2461
c
) <
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
>
b: ?m.2458
b
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
d: ?m.2409
d
) /-- If a type carries two unital binary operations that distribute over each other, then they have the same unit elements. In fact, the two operations are the same, and give a commutative monoid structure, see `eckmann_hilton.CommMonoid`. -/ theorem
one: โˆ€ {X : Type u} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ eโ‚ = eโ‚‚
one
:
eโ‚: X
eโ‚
=
eโ‚‚: X
eโ‚‚
:=

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)


eโ‚ = eโ‚‚

Goals accomplished! ๐Ÿ™
#align eckmann_hilton.one
EckmannHilton.one: โˆ€ {X : Type u} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ eโ‚ = eโ‚‚
EckmannHilton.one
/-- If a type carries two unital binary operations that distribute over each other, then these operations are equal. In fact, they give a commutative monoid structure, see `eckmann_hilton.CommMonoid`. -/ theorem
mul: mโ‚ = mโ‚‚
mul
:
mโ‚: X โ†’ X โ†’ X
mโ‚
=
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
:=

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)


mโ‚ = mโ‚‚
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


h.h
mโ‚ a b = mโ‚‚ a b
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)


mโ‚ = mโ‚‚
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


h.h
mโ‚ a b = mโ‚‚ a b

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


mโ‚ a b = mโ‚ (mโ‚‚ a eโ‚) (mโ‚‚ eโ‚ b)
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


mโ‚ a b = mโ‚ (mโ‚‚ a eโ‚) (mโ‚‚ eโ‚ b)
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


mโ‚ a b = mโ‚ (mโ‚‚ a eโ‚) (mโ‚‚ eโ‚ b)

Goals accomplished! ๐Ÿ™

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


h.h
mโ‚ a b = mโ‚‚ a b

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


mโ‚ (mโ‚‚ a eโ‚) (mโ‚‚ eโ‚ b) = mโ‚‚ a b

Goals accomplished! ๐Ÿ™
#align eckmann_hilton.mul
EckmannHilton.mul: โˆ€ {X : Type u} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ mโ‚ = mโ‚‚
EckmannHilton.mul
/-- If a type carries two unital binary operations that distribute over each other, then these operations are commutative. In fact, they give a commutative monoid structure, see `eckmann_hilton.CommMonoid`. -/ theorem
mul_comm: IsCommutative X mโ‚‚
mul_comm
:
IsCommutative: (ฮฑ : Type ?u.3281) โ†’ (ฮฑ โ†’ ฮฑ โ†’ ฮฑ) โ†’ Prop
IsCommutative
_: Type ?u.3281
_
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
:= โŸจfun
a: ?m.3303
a
b: ?m.3306
b
=>

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b: X


mโ‚‚ a b = mโ‚‚ b a

Goals accomplished! ๐Ÿ™
โŸฉ #align eckmann_hilton.mul_comm
EckmannHilton.mul_comm: โˆ€ {X : Type u} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ IsCommutative X mโ‚‚
EckmannHilton.mul_comm
/-- If a type carries two unital binary operations that distribute over each other, then these operations are associative. In fact, they give a commutative monoid structure, see `eckmann_hilton.CommMonoid`. -/ theorem
mul_assoc: IsAssociative X mโ‚‚
mul_assoc
:
IsAssociative: (ฮฑ : Type ?u.3543) โ†’ (ฮฑ โ†’ ฮฑ โ†’ ฮฑ) โ†’ Prop
IsAssociative
_: Type ?u.3543
_
mโ‚‚: X โ†’ X โ†’ X
mโ‚‚
:= โŸจfun
a: ?m.3565
a
b: ?m.3568
b
c: ?m.3571
c
=>

Goals accomplished! ๐Ÿ™
X: Type u

mโ‚, mโ‚‚: X โ†’ X โ†’ X

eโ‚, eโ‚‚: X

hโ‚: IsUnital mโ‚ eโ‚

hโ‚‚: IsUnital mโ‚‚ eโ‚‚

distrib: โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)

a, b, c: X


mโ‚‚ (mโ‚‚ a b) c = mโ‚‚ a (mโ‚‚ b c)

Goals accomplished! ๐Ÿ™
โŸฉ #align eckmann_hilton.mul_assoc
EckmannHilton.mul_assoc: โˆ€ {X : Type u} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ IsAssociative X mโ‚‚
EckmannHilton.mul_assoc
/-- If a type carries a unital magma structure that distributes over a unital binary operation, then the magma structure is a commutative monoid. -/ @[
to_additive: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [h : AddZeroClass X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a + b) (c + d) = mโ‚ a c + mโ‚ b d) โ†’ AddCommMonoid X
to_additive
(attr := reducible) "If a type carries a unital additive magma structure that distributes over a unital binary operation, then the additive magma structure is a commutative additive monoid."] def
commMonoid: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [h : MulOneClass X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d) โ†’ CommMonoid X
commMonoid
[h :
MulOneClass: Type ?u.3809 โ†’ Type ?u.3809
MulOneClass
X: Type u
X
] (
distrib: โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d
distrib
: โˆ€
a: ?m.3813
a
b: ?m.3816
b
c: ?m.3819
c
d: ?m.3822
d
, ((
a: ?m.3813
a
*
b: ?m.3816
b
) <
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.3819
c
*
d: ?m.3822
d
) = (
a: ?m.3813
a
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.3819
c
) *
b: ?m.3816
b
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
d: ?m.3822
d
) :
CommMonoid: Type ?u.3928 โ†’ Type ?u.3928
CommMonoid
X: Type u
X
:= { h with mul :=
(ยท * ยท): X โ†’ X โ†’ X
(ยท * ยท)
, one :=
1: ?m.4060
1
, mul_comm := (
mul_comm: โˆ€ {X : Type ?u.4184} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ IsCommutative X mโ‚‚
mul_comm
hโ‚: IsUnital mโ‚ eโ‚
hโ‚
MulOneClass.isUnital: โˆ€ {X : Type ?u.4197} [_G : MulOneClass X], IsUnital (fun x x_1 => x * x_1) 1
MulOneClass.isUnital
distrib: โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d
distrib
).
comm: โˆ€ {ฮฑ : Type ?u.4219} {op : ฮฑ โ†’ ฮฑ โ†’ ฮฑ} [self : IsCommutative ฮฑ op] (a b : ฮฑ), op a b = op b a
comm
, mul_assoc := (
mul_assoc: โˆ€ {X : Type ?u.3989} {mโ‚ mโ‚‚ : X โ†’ X โ†’ X} {eโ‚ eโ‚‚ : X}, IsUnital mโ‚ eโ‚ โ†’ IsUnital mโ‚‚ eโ‚‚ โ†’ (โˆ€ (a b c d : X), mโ‚ (mโ‚‚ a b) (mโ‚‚ c d) = mโ‚‚ (mโ‚ a c) (mโ‚ b d)) โ†’ IsAssociative X mโ‚‚
mul_assoc
hโ‚: IsUnital mโ‚ eโ‚
hโ‚
MulOneClass.isUnital: โˆ€ {X : Type ?u.4007} [_G : MulOneClass X], IsUnital (fun x x_1 => x * x_1) 1
MulOneClass.isUnital
distrib: โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d
distrib
).
assoc: โˆ€ {ฮฑ : Type ?u.4034} {op : ฮฑ โ†’ ฮฑ โ†’ ฮฑ} [self : IsAssociative ฮฑ op] (a b c : ฮฑ), op (op a b) c = op a (op b c)
assoc
} #align eckmann_hilton.comm_monoid
EckmannHilton.commMonoid: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [h : MulOneClass X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d) โ†’ CommMonoid X
EckmannHilton.commMonoid
#align eckmann_hilton.add_comm_monoid
EckmannHilton.addCommMonoid: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [h : AddZeroClass X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a + b) (c + d) = mโ‚ a c + mโ‚ b d) โ†’ AddCommMonoid X
EckmannHilton.addCommMonoid
/-- If a type carries a group structure that distributes over a unital binary operation, then the group is commutative. -/ @[
to_additive: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [G : AddGroup X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a + b) (c + d) = mโ‚ a c + mโ‚ b d) โ†’ AddCommGroup X
to_additive
(attr := reducible) "If a type carries an additive group structure that distributes over a unital binary operation, then the additive group is commutative."] def
commGroup: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [G : Group X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d) โ†’ CommGroup X
commGroup
[
G: Group X
G
:
Group: Type ?u.4810 โ†’ Type ?u.4810
Group
X: Type u
X
] (
distrib: โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d
distrib
: โˆ€
a: ?m.4814
a
b: ?m.4817
b
c: ?m.4820
c
d: ?m.4823
d
, ((
a: ?m.4814
a
*
b: ?m.4817
b
) <
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.4820
c
*
d: ?m.4823
d
) = (
a: ?m.4814
a
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
c: ?m.4820
c
) *
b: ?m.4817
b
<
mโ‚: X โ†’ X โ†’ X
mโ‚
>
d: ?m.4823
d
) :
CommGroup: Type ?u.4991 โ†’ Type ?u.4991
CommGroup
X: Type u
X
:= {
EckmannHilton.commMonoid: {X : Type ?u.4997} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [h : MulOneClass X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d) โ†’ CommMonoid X
EckmannHilton.commMonoid
hโ‚: IsUnital mโ‚ eโ‚
hโ‚
distrib: โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d
distrib
,
G: Group X
G
with .. } #align eckmann_hilton.comm_group
EckmannHilton.commGroup: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [G : Group X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a * b) (c * d) = mโ‚ a c * mโ‚ b d) โ†’ CommGroup X
EckmannHilton.commGroup
#align eckmann_hilton.add_comm_group
EckmannHilton.addCommGroup: {X : Type u} โ†’ {mโ‚ : X โ†’ X โ†’ X} โ†’ {eโ‚ : X} โ†’ IsUnital mโ‚ eโ‚ โ†’ [G : AddGroup X] โ†’ (โˆ€ (a b c d : X), mโ‚ (a + b) (c + d) = mโ‚ a c + mโ‚ b d) โ†’ AddCommGroup X
EckmannHilton.addCommGroup
end EckmannHilton