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) 2020 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Simon Hudon, Patrick Massot, Yury Kudryashov

! This file was ported from Lean 3 source module algebra.group.prod
! leanprover-community/mathlib commit cf9386b56953fb40904843af98b7a80757bbe7f9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Group.Opposite
import Mathlib.Algebra.GroupWithZero.Units.Basic
import Mathlib.Algebra.Hom.Units

/-!
# Monoid, group etc structures on `M Γ— N`

In this file we define one-binop (`Monoid`, `Group` etc) structures on `M Γ— N`. We also prove
trivial `simp` lemmas, and define the following operations on `MonoidHom`s:

* `fst M N : M Γ— N β†’* M`, `snd M N : M Γ— N β†’* N`: projections `Prod.fst` and `Prod.snd`
  as `MonoidHom`s;
* `inl M N : M β†’* M Γ— N`, `inr M N : N β†’* M Γ— N`: inclusions of first/second monoid
  into the product;
* `f.prod g : `M β†’* N Γ— P`: sends `x` to `(f x, g x)`;
* `f.coprod g : M Γ— N β†’* P`: sends `(x, y)` to `f x * g y`;
* `f.prodMap g : M Γ— N β†’ M' Γ— N'`: `prod.map f g` as a `MonoidHom`,
  sends `(x, y)` to `(f x, g y)`.

## Main declarations

* `mulMulHom`/`mulMonoidHom`/`mulMonoidWithZeroHom`: Multiplication bundled as a
  multiplicative/monoid/monoid with zero homomorphism.
* `divMonoidHom`/`divMonoidWithZeroHom`: Division bundled as a monoid/monoid with zero
  homomorphism.
-/


variable {
A: Type ?u.23
A
:
Type _: Type (?u.59943+1)
Type _
} {
B: Type ?u.26
B
:
Type _: Type (?u.21364+1)
Type _
} {
G: Type ?u.39690
G
:
Type _: Type (?u.15455+1)
Type _
} {
H: Type ?u.32
H
:
Type _: Type (?u.1002+1)
Type _
} {
M: Type ?u.14
M
:
Type _: Type (?u.1005+1)
Type _
} {
N: Type ?u.39699
N
:
Type _: Type (?u.7978+1)
Type _
} {
P: Type ?u.39702
P
:
Type _: Type (?u.42267+1)
Type _
} namespace Prod @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Add M] β†’ [inst : Add N] β†’ Add (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Mul M] β†’ [inst : Mul N] β†’ Mul (M Γ— N)
instance
[
Mul: Type ?u.44 β†’ Type ?u.44
Mul
M: Type ?u.35
M
] [
Mul: Type ?u.47 β†’ Type ?u.47
Mul
N: Type ?u.38
N
] :
Mul: Type ?u.50 β†’ Type ?u.50
Mul
(
M: Type ?u.35
M
Γ—
N: Type ?u.38
N
) := ⟨fun
p: ?m.62
p
q: ?m.65
q
=> ⟨
p: ?m.62
p
.
1: {Ξ± : Type ?u.81} β†’ {Ξ² : Type ?u.80} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
*
q: ?m.65
q
.
1: {Ξ± : Type ?u.85} β†’ {Ξ² : Type ?u.84} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
,
p: ?m.62
p
.
2: {Ξ± : Type ?u.129} β†’ {Ξ² : Type ?u.128} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
*
q: ?m.65
q
.
2: {Ξ± : Type ?u.133} β†’ {Ξ² : Type ?u.132} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⟩⟩ @[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), (p + q).fst = p.fst + q.fst
to_additive
(attr := simp)] theorem
fst_mul: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), (p * q).fst = p.fst * q.fst
fst_mul
[
Mul: Type ?u.526 β†’ Type ?u.526
Mul
M: Type ?u.517
M
] [
Mul: Type ?u.529 β†’ Type ?u.529
Mul
N: Type ?u.520
N
] (
p: M Γ— N
p
q: M Γ— N
q
:
M: Type ?u.517
M
Γ—
N: Type ?u.520
N
) : (
p: M Γ— N
p
*
q: M Γ— N
q
).
1: {Ξ± : Type ?u.615} β†’ {Ξ² : Type ?u.614} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
=
p: M Γ— N
p
.
1: {Ξ± : Type ?u.624} β†’ {Ξ² : Type ?u.623} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
*
q: M Γ— N
q
.
1: {Ξ± : Type ?u.628} β†’ {Ξ² : Type ?u.627} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
:=
rfl: βˆ€ {Ξ± : Sort ?u.672} {a : Ξ±}, a = a
rfl
#align prod.fst_mul
Prod.fst_mul: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), (p * q).fst = p.fst * q.fst
Prod.fst_mul
#align prod.fst_add
Prod.fst_add: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), (p + q).fst = p.fst + q.fst
Prod.fst_add
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), (p + q).snd = p.snd + q.snd
to_additive
(attr := simp)] theorem
snd_mul: βˆ€ [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), (p * q).snd = p.snd * q.snd
snd_mul
[
Mul: Type ?u.770 β†’ Type ?u.770
Mul
M: Type ?u.761
M
] [
Mul: Type ?u.773 β†’ Type ?u.773
Mul
N: Type ?u.764
N
] (
p: M Γ— N
p
q: M Γ— N
q
:
M: Type ?u.761
M
Γ—
N: Type ?u.764
N
) : (
p: M Γ— N
p
*
q: M Γ— N
q
).
2: {Ξ± : Type ?u.859} β†’ {Ξ² : Type ?u.858} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
=
p: M Γ— N
p
.
2: {Ξ± : Type ?u.868} β†’ {Ξ² : Type ?u.867} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
*
q: M Γ— N
q
.
2: {Ξ± : Type ?u.872} β†’ {Ξ² : Type ?u.871} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
:=
rfl: βˆ€ {Ξ± : Sort ?u.916} {a : Ξ±}, a = a
rfl
#align prod.snd_mul
Prod.snd_mul: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), (p * q).snd = p.snd * q.snd
Prod.snd_mul
#align prod.snd_add
Prod.snd_add: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), (p + q).snd = p.snd + q.snd
Prod.snd_add
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (a₁ aβ‚‚ : M) (b₁ bβ‚‚ : N), (a₁, b₁) + (aβ‚‚, bβ‚‚) = (a₁ + aβ‚‚, b₁ + bβ‚‚)
to_additive
(attr := simp)] theorem
mk_mul_mk: βˆ€ [inst : Mul M] [inst_1 : Mul N] (a₁ aβ‚‚ : M) (b₁ bβ‚‚ : N), (a₁, b₁) * (aβ‚‚, bβ‚‚) = (a₁ * aβ‚‚, b₁ * bβ‚‚)
mk_mul_mk
[
Mul: Type ?u.1014 β†’ Type ?u.1014
Mul
M: Type ?u.1005
M
] [
Mul: Type ?u.1017 β†’ Type ?u.1017
Mul
N: Type ?u.1008
N
] (
a₁: M
a₁
aβ‚‚: M
aβ‚‚
:
M: Type ?u.1005
M
) (
b₁: N
b₁
bβ‚‚: N
bβ‚‚
:
N: Type ?u.1008
N
) : (
a₁: M
a₁
,
b₁: N
b₁
) * (
aβ‚‚: M
aβ‚‚
,
bβ‚‚: N
bβ‚‚
) = (
a₁: M
a₁
*
aβ‚‚: M
aβ‚‚
,
b₁: N
b₁
*
bβ‚‚: N
bβ‚‚
) :=
rfl: βˆ€ {Ξ± : Sort ?u.1200} {a : Ξ±}, a = a
rfl
#align prod.mk_mul_mk
Prod.mk_mul_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (a₁ aβ‚‚ : M) (b₁ bβ‚‚ : N), (a₁, b₁) * (aβ‚‚, bβ‚‚) = (a₁ * aβ‚‚, b₁ * bβ‚‚)
Prod.mk_mul_mk
#align prod.mk_add_mk
Prod.mk_add_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (a₁ aβ‚‚ : M) (b₁ bβ‚‚ : N), (a₁, b₁) + (aβ‚‚, bβ‚‚) = (a₁ + aβ‚‚, b₁ + bβ‚‚)
Prod.mk_add_mk
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), swap (p + q) = swap p + swap q
to_additive
(attr := simp)] theorem
swap_mul: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), swap (p * q) = swap p * swap q
swap_mul
[
Mul: Type ?u.1332 β†’ Type ?u.1332
Mul
M: Type ?u.1323
M
] [
Mul: Type ?u.1335 β†’ Type ?u.1335
Mul
N: Type ?u.1326
N
] (
p: M Γ— N
p
q: M Γ— N
q
:
M: Type ?u.1323
M
Γ—
N: Type ?u.1326
N
) : (
p: M Γ— N
p
*
q: M Γ— N
q
).
swap: {Ξ± : Type ?u.1421} β†’ {Ξ² : Type ?u.1420} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
=
p: M Γ— N
p
.
swap: {Ξ± : Type ?u.1433} β†’ {Ξ² : Type ?u.1432} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
*
q: M Γ— N
q
.
swap: {Ξ± : Type ?u.1440} β†’ {Ξ² : Type ?u.1439} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
:=
rfl: βˆ€ {Ξ± : Sort ?u.1507} {a : Ξ±}, a = a
rfl
#align prod.swap_mul
Prod.swap_mul: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), swap (p * q) = swap p * swap q
Prod.swap_mul
#align prod.swap_add
Prod.swap_add: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), swap (p + q) = swap p + swap q
Prod.swap_add
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), p + q = (p.fst + q.fst, p.snd + q.snd)
to_additive
] theorem
mul_def: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), p * q = (p.fst * q.fst, p.snd * q.snd)
mul_def
[
Mul: Type ?u.1619 β†’ Type ?u.1619
Mul
M: Type ?u.1610
M
] [
Mul: Type ?u.1622 β†’ Type ?u.1622
Mul
N: Type ?u.1613
N
] (
p: M Γ— N
p
q: M Γ— N
q
:
M: Type ?u.1610
M
Γ—
N: Type ?u.1613
N
) :
p: M Γ— N
p
*
q: M Γ— N
q
= (
p: M Γ— N
p
.
1: {Ξ± : Type ?u.1645} β†’ {Ξ² : Type ?u.1644} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
*
q: M Γ— N
q
.
1: {Ξ± : Type ?u.1651} β†’ {Ξ² : Type ?u.1650} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
,
p: M Γ— N
p
.
2: {Ξ± : Type ?u.1696} β†’ {Ξ² : Type ?u.1695} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
*
q: M Γ— N
q
.
2: {Ξ± : Type ?u.1700} β†’ {Ξ² : Type ?u.1699} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
) :=
rfl: βˆ€ {Ξ± : Sort ?u.1811} {a : Ξ±}, a = a
rfl
#align prod.mul_def
Prod.mul_def: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N] (p q : M Γ— N), p * q = (p.fst * q.fst, p.snd * q.snd)
Prod.mul_def
#align prod.add_def
Prod.add_def: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N] (p q : M Γ— N), p + q = (p.fst + q.fst, p.snd + q.snd)
Prod.add_def
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : AddMonoid M] [inst_1 : Add N] (b₁ bβ‚‚ : N), (0, b₁) + (0, bβ‚‚) = (0, b₁ + bβ‚‚)
to_additive
] theorem
one_mk_mul_one_mk: βˆ€ [inst : Monoid M] [inst_1 : Mul N] (b₁ bβ‚‚ : N), (1, b₁) * (1, bβ‚‚) = (1, b₁ * bβ‚‚)
one_mk_mul_one_mk
[
Monoid: Type ?u.1869 β†’ Type ?u.1869
Monoid
M: Type ?u.1860
M
] [
Mul: Type ?u.1872 β†’ Type ?u.1872
Mul
N: Type ?u.1863
N
] (
b₁: N
b₁
bβ‚‚: N
bβ‚‚
:
N: Type ?u.1863
N
) : ((
1: ?m.1889
1
:
M: Type ?u.1860
M
),
b₁: N
b₁
) * (
1: ?m.2018
1
,
bβ‚‚: N
bβ‚‚
) = (
1: ?m.2037
1
,
b₁: N
b₁
*
bβ‚‚: N
bβ‚‚
) :=

Goals accomplished! πŸ™
A: Type ?u.1848

B: Type ?u.1851

G: Type ?u.1854

H: Type ?u.1857

M: Type u_1

N: Type u_2

P: Type ?u.1866

inst✝¹: Monoid M

inst✝: Mul N

b₁, bβ‚‚: N


(1, b₁) * (1, bβ‚‚) = (1, b₁ * bβ‚‚)
A: Type ?u.1848

B: Type ?u.1851

G: Type ?u.1854

H: Type ?u.1857

M: Type u_1

N: Type u_2

P: Type ?u.1866

inst✝¹: Monoid M

inst✝: Mul N

b₁, bβ‚‚: N


(1, b₁) * (1, bβ‚‚) = (1, b₁ * bβ‚‚)
A: Type ?u.1848

B: Type ?u.1851

G: Type ?u.1854

H: Type ?u.1857

M: Type u_1

N: Type u_2

P: Type ?u.1866

inst✝¹: Monoid M

inst✝: Mul N

b₁, bβ‚‚: N


(1 * 1, b₁ * bβ‚‚) = (1, b₁ * bβ‚‚)
A: Type ?u.1848

B: Type ?u.1851

G: Type ?u.1854

H: Type ?u.1857

M: Type u_1

N: Type u_2

P: Type ?u.1866

inst✝¹: Monoid M

inst✝: Mul N

b₁, bβ‚‚: N


(1, b₁) * (1, bβ‚‚) = (1, b₁ * bβ‚‚)
A: Type ?u.1848

B: Type ?u.1851

G: Type ?u.1854

H: Type ?u.1857

M: Type u_1

N: Type u_2

P: Type ?u.1866

inst✝¹: Monoid M

inst✝: Mul N

b₁, bβ‚‚: N


(1, b₁ * bβ‚‚) = (1, b₁ * bβ‚‚)

Goals accomplished! πŸ™
#align prod.one_mk_mul_one_mk
Prod.one_mk_mul_one_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Monoid M] [inst_1 : Mul N] (b₁ bβ‚‚ : N), (1, b₁) * (1, bβ‚‚) = (1, b₁ * bβ‚‚)
Prod.one_mk_mul_one_mk
#align prod.zero_mk_add_zero_mk
Prod.zero_mk_add_zero_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : AddMonoid M] [inst_1 : Add N] (b₁ bβ‚‚ : N), (0, b₁) + (0, bβ‚‚) = (0, b₁ + bβ‚‚)
Prod.zero_mk_add_zero_mk
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : AddMonoid N] (a₁ aβ‚‚ : M), (a₁, 0) + (aβ‚‚, 0) = (a₁ + aβ‚‚, 0)
to_additive
] theorem
mk_one_mul_mk_one: βˆ€ [inst : Mul M] [inst_1 : Monoid N] (a₁ aβ‚‚ : M), (a₁, 1) * (aβ‚‚, 1) = (a₁ * aβ‚‚, 1)
mk_one_mul_mk_one
[
Mul: Type ?u.2655 β†’ Type ?u.2655
Mul
M: Type ?u.2646
M
] [
Monoid: Type ?u.2658 β†’ Type ?u.2658
Monoid
N: Type ?u.2649
N
] (
a₁: M
a₁
aβ‚‚: M
aβ‚‚
:
M: Type ?u.2646
M
) : (
a₁: M
a₁
, (
1: ?m.2675
1
:
N: Type ?u.2649
N
)) * (
aβ‚‚: M
aβ‚‚
,
1: ?m.2804
1
) = (
a₁: M
a₁
*
aβ‚‚: M
aβ‚‚
,
1: ?m.2869
1
) :=

Goals accomplished! πŸ™
A: Type ?u.2634

B: Type ?u.2637

G: Type ?u.2640

H: Type ?u.2643

M: Type u_1

N: Type u_2

P: Type ?u.2652

inst✝¹: Mul M

inst✝: Monoid N

a₁, aβ‚‚: M


(a₁, 1) * (aβ‚‚, 1) = (a₁ * aβ‚‚, 1)
A: Type ?u.2634

B: Type ?u.2637

G: Type ?u.2640

H: Type ?u.2643

M: Type u_1

N: Type u_2

P: Type ?u.2652

inst✝¹: Mul M

inst✝: Monoid N

a₁, aβ‚‚: M


(a₁, 1) * (aβ‚‚, 1) = (a₁ * aβ‚‚, 1)
A: Type ?u.2634

B: Type ?u.2637

G: Type ?u.2640

H: Type ?u.2643

M: Type u_1

N: Type u_2

P: Type ?u.2652

inst✝¹: Mul M

inst✝: Monoid N

a₁, aβ‚‚: M


(a₁ * aβ‚‚, 1 * 1) = (a₁ * aβ‚‚, 1)
A: Type ?u.2634

B: Type ?u.2637

G: Type ?u.2640

H: Type ?u.2643

M: Type u_1

N: Type u_2

P: Type ?u.2652

inst✝¹: Mul M

inst✝: Monoid N

a₁, aβ‚‚: M


(a₁, 1) * (aβ‚‚, 1) = (a₁ * aβ‚‚, 1)
A: Type ?u.2634

B: Type ?u.2637

G: Type ?u.2640

H: Type ?u.2643

M: Type u_1

N: Type u_2

P: Type ?u.2652

inst✝¹: Mul M

inst✝: Monoid N

a₁, aβ‚‚: M


(a₁ * aβ‚‚, 1) = (a₁ * aβ‚‚, 1)

Goals accomplished! πŸ™
#align prod.mk_one_mul_mk_one
Prod.mk_one_mul_mk_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Monoid N] (a₁ aβ‚‚ : M), (a₁, 1) * (aβ‚‚, 1) = (a₁ * aβ‚‚, 1)
Prod.mk_one_mul_mk_one
#align prod.mk_zero_add_mk_zero
Prod.mk_zero_add_mk_zero: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : AddMonoid N] (a₁ aβ‚‚ : M), (a₁, 0) + (aβ‚‚, 0) = (a₁ + aβ‚‚, 0)
Prod.mk_zero_add_mk_zero
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Zero M] β†’ [inst : Zero N] β†’ Zero (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : One M] β†’ [inst : One N] β†’ One (M Γ— N)
instance
[
One: Type ?u.3442 β†’ Type ?u.3442
One
M: Type ?u.3433
M
] [
One: Type ?u.3445 β†’ Type ?u.3445
One
N: Type ?u.3436
N
] :
One: Type ?u.3448 β†’ Type ?u.3448
One
(
M: Type ?u.3433
M
Γ—
N: Type ?u.3436
N
) := ⟨(
1: ?m.3466
1
,
1: ?m.3488
1
)⟩ @[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0.fst = 0
to_additive
(attr := simp)] theorem
fst_one: βˆ€ [inst : One M] [inst_1 : One N], 1.fst = 1
fst_one
[
One: Type ?u.3681 β†’ Type ?u.3681
One
M: Type ?u.3672
M
] [
One: Type ?u.3684 β†’ Type ?u.3684
One
N: Type ?u.3675
N
] : (
1: ?m.3692
1
:
M: Type ?u.3672
M
Γ—
N: Type ?u.3675
N
).
1: {Ξ± : Type ?u.3747} β†’ {Ξ² : Type ?u.3746} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
=
1: ?m.3751
1
:=
rfl: βˆ€ {Ξ± : Sort ?u.3787} {a : Ξ±}, a = a
rfl
#align prod.fst_one
Prod.fst_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N], 1.fst = 1
Prod.fst_one
#align prod.fst_zero
Prod.fst_zero: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0.fst = 0
Prod.fst_zero
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0.snd = 0
to_additive
(attr := simp)] theorem
snd_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N], 1.snd = 1
snd_one
[
One: Type ?u.3861 β†’ Type ?u.3861
One
M: Type ?u.3852
M
] [
One: Type ?u.3864 β†’ Type ?u.3864
One
N: Type ?u.3855
N
] : (
1: ?m.3872
1
:
M: Type ?u.3852
M
Γ—
N: Type ?u.3855
N
).
2: {Ξ± : Type ?u.3927} β†’ {Ξ² : Type ?u.3926} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
=
1: ?m.3931
1
:=
rfl: βˆ€ {Ξ± : Sort ?u.3967} {a : Ξ±}, a = a
rfl
#align prod.snd_one
Prod.snd_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N], 1.snd = 1
Prod.snd_one
#align prod.snd_zero
Prod.snd_zero: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0.snd = 0
Prod.snd_zero
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0 = (0, 0)
to_additive
] theorem
one_eq_mk: βˆ€ [inst : One M] [inst_1 : One N], 1 = (1, 1)
one_eq_mk
[
One: Type ?u.4041 β†’ Type ?u.4041
One
M: Type ?u.4032
M
] [
One: Type ?u.4044 β†’ Type ?u.4044
One
N: Type ?u.4035
N
] : (
1: ?m.4052
1
:
M: Type ?u.4032
M
Γ—
N: Type ?u.4035
N
) = (
1: ?m.4111
1
,
1: ?m.4121
1
) :=
rfl: βˆ€ {Ξ± : Sort ?u.4206} {a : Ξ±}, a = a
rfl
#align prod.one_eq_mk
Prod.one_eq_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N], 1 = (1, 1)
Prod.one_eq_mk
#align prod.zero_eq_mk
Prod.zero_eq_mk: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], 0 = (0, 0)
Prod.zero_eq_mk
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N] {x : M} {y : N}, (x, y) = 0 ↔ x = 0 ∧ y = 0
to_additive
(attr := simp)] theorem
mk_eq_one: βˆ€ [inst : One M] [inst_1 : One N] {x : M} {y : N}, (x, y) = 1 ↔ x = 1 ∧ y = 1
mk_eq_one
[
One: Type ?u.4254 β†’ Type ?u.4254
One
M: Type ?u.4245
M
] [
One: Type ?u.4257 β†’ Type ?u.4257
One
N: Type ?u.4248
N
] {
x: M
x
:
M: Type ?u.4245
M
} {
y: N
y
:
N: Type ?u.4248
N
} : (
x: M
x
,
y: N
y
) =
1: ?m.4270
1
↔
x: M
x
=
1: ?m.4338
1
∧
y: N
y
=
1: ?m.4373
1
:=
mk.inj_iff: βˆ€ {Ξ± : Type ?u.4411} {Ξ² : Type ?u.4412} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
#align prod.mk_eq_one
Prod.mk_eq_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N] {x : M} {y : N}, (x, y) = 1 ↔ x = 1 ∧ y = 1
Prod.mk_eq_one
#align prod.mk_eq_zero
Prod.mk_eq_zero: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N] {x : M} {y : N}, (x, y) = 0 ↔ x = 0 ∧ y = 0
Prod.mk_eq_zero
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], swap 0 = 0
to_additive
(attr := simp)] theorem
swap_one: βˆ€ [inst : One M] [inst_1 : One N], swap 1 = 1
swap_one
[
One: Type ?u.4552 β†’ Type ?u.4552
One
M: Type ?u.4543
M
] [
One: Type ?u.4555 β†’ Type ?u.4555
One
N: Type ?u.4546
N
] : (
1: ?m.4563
1
:
M: Type ?u.4543
M
Γ—
N: Type ?u.4546
N
).
swap: {Ξ± : Type ?u.4618} β†’ {Ξ² : Type ?u.4617} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
=
1: ?m.4625
1
:=
rfl: βˆ€ {Ξ± : Sort ?u.4681} {a : Ξ±}, a = a
rfl
#align prod.swap_one
Prod.swap_one: βˆ€ {M : Type u_1} {N : Type u_2} [inst : One M] [inst_1 : One N], swap 1 = 1
Prod.swap_one
#align prod.swap_zero
Prod.swap_zero: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Zero M] [inst_1 : Zero N], swap 0 = 0
Prod.swap_zero
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : AddZeroClass M] [inst_1 : AddZeroClass N] (p : M Γ— N), (p.fst, 0) + (0, p.snd) = p
to_additive
] theorem
fst_mul_snd: βˆ€ {M : Type u_1} {N : Type u_2} [inst : MulOneClass M] [inst_1 : MulOneClass N] (p : M Γ— N), (p.fst, 1) * (1, p.snd) = p
fst_mul_snd
[
MulOneClass: Type ?u.4765 β†’ Type ?u.4765
MulOneClass
M: Type ?u.4756
M
] [
MulOneClass: Type ?u.4768 β†’ Type ?u.4768
MulOneClass
N: Type ?u.4759
N
] (
p: M Γ— N
p
:
M: Type ?u.4756
M
Γ—
N: Type ?u.4759
N
) : (
p: M Γ— N
p
.
fst: {Ξ± : Type ?u.4784} β†’ {Ξ² : Type ?u.4783} β†’ Ξ± Γ— Ξ² β†’ Ξ±
fst
,
1: ?m.4790
1
) * (
1: ?m.4804
1
,
p: M Γ— N
p
.
snd: {Ξ± : Type ?u.4814} β†’ {Ξ² : Type ?u.4813} β†’ Ξ± Γ— Ξ² β†’ Ξ²
snd
) =
p: M Γ— N
p
:=
ext: βˆ€ {Ξ± : Type ?u.5462} {Ξ² : Type ?u.5463} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
mul_one: βˆ€ {M : Type ?u.5473} [inst : MulOneClass M] (a : M), a * 1 = a
mul_one
p: M Γ— N
p
.
1: {Ξ± : Type ?u.5477} β†’ {Ξ² : Type ?u.5476} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
) (
one_mul: βˆ€ {M : Type ?u.5492} [inst : MulOneClass M] (a : M), 1 * a = a
one_mul
p: M Γ— N
p
.
2: {Ξ± : Type ?u.5496} β†’ {Ξ² : Type ?u.5495} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
) #align prod.fst_mul_snd
Prod.fst_mul_snd: βˆ€ {M : Type u_1} {N : Type u_2} [inst : MulOneClass M] [inst_1 : MulOneClass N] (p : M Γ— N), (p.fst, 1) * (1, p.snd) = p
Prod.fst_mul_snd
#align prod.fst_add_snd
Prod.fst_add_snd: βˆ€ {M : Type u_1} {N : Type u_2} [inst : AddZeroClass M] [inst_1 : AddZeroClass N] (p : M Γ— N), (p.fst, 0) + (0, p.snd) = p
Prod.fst_add_snd
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Neg M] β†’ [inst : Neg N] β†’ Neg (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Inv M] β†’ [inst : Inv N] β†’ Inv (M Γ— N)
instance
[
Inv: Type ?u.5558 β†’ Type ?u.5558
Inv
M: Type ?u.5549
M
] [
Inv: Type ?u.5561 β†’ Type ?u.5561
Inv
N: Type ?u.5552
N
] :
Inv: Type ?u.5564 β†’ Type ?u.5564
Inv
(
M: Type ?u.5549
M
Γ—
N: Type ?u.5552
N
) := ⟨fun
p: ?m.5576
p
=> (
p: ?m.5576
p
.
1: {Ξ± : Type ?u.5604} β†’ {Ξ² : Type ?u.5603} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
⁻¹,
p: ?m.5576
p
.
2: {Ξ± : Type ?u.5635} β†’ {Ξ² : Type ?u.5634} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⁻¹)⟩ @[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), (-p).fst = -p.fst
to_additive
(attr := simp)] theorem
fst_inv: βˆ€ [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), p⁻¹.fst = p.fst⁻¹
fst_inv
[
Inv: Type ?u.5889 β†’ Type ?u.5889
Inv
G: Type ?u.5874
G
] [
Inv: Type ?u.5892 β†’ Type ?u.5892
Inv
H: Type ?u.5877
H
] (
p: G Γ— H
p
:
G: Type ?u.5874
G
Γ—
H: Type ?u.5877
H
) :
p: G Γ— H
p
⁻¹.
1: {Ξ± : Type ?u.5938} β†’ {Ξ² : Type ?u.5937} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
=
p: G Γ— H
p
.
1: {Ξ± : Type ?u.5945} β†’ {Ξ² : Type ?u.5944} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
⁻¹ :=
rfl: βˆ€ {Ξ± : Sort ?u.5959} {a : Ξ±}, a = a
rfl
#align prod.fst_inv
Prod.fst_inv: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), p⁻¹.fst = p.fst⁻¹
Prod.fst_inv
#align prod.fst_neg
Prod.fst_neg: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), (-p).fst = -p.fst
Prod.fst_neg
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), (-p).snd = -p.snd
to_additive
(attr := simp)] theorem
snd_inv: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), p⁻¹.snd = p.snd⁻¹
snd_inv
[
Inv: Type ?u.6042 β†’ Type ?u.6042
Inv
G: Type ?u.6027
G
] [
Inv: Type ?u.6045 β†’ Type ?u.6045
Inv
H: Type ?u.6030
H
] (
p: G Γ— H
p
:
G: Type ?u.6027
G
Γ—
H: Type ?u.6030
H
) :
p: G Γ— H
p
⁻¹.
2: {Ξ± : Type ?u.6091} β†’ {Ξ² : Type ?u.6090} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
=
p: G Γ— H
p
.
2: {Ξ± : Type ?u.6098} β†’ {Ξ² : Type ?u.6097} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⁻¹ :=
rfl: βˆ€ {Ξ± : Sort ?u.6112} {a : Ξ±}, a = a
rfl
#align prod.snd_inv
Prod.snd_inv: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), p⁻¹.snd = p.snd⁻¹
Prod.snd_inv
#align prod.snd_neg
Prod.snd_neg: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), (-p).snd = -p.snd
Prod.snd_neg
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (a : G) (b : H), -(a, b) = (-a, -b)
to_additive
(attr := simp)] theorem
inv_mk: βˆ€ [inst : Inv G] [inst_1 : Inv H] (a : G) (b : H), (a, b)⁻¹ = (a⁻¹, b⁻¹)
inv_mk
[
Inv: Type ?u.6195 β†’ Type ?u.6195
Inv
G: Type ?u.6180
G
] [
Inv: Type ?u.6198 β†’ Type ?u.6198
Inv
H: Type ?u.6183
H
] (
a: G
a
:
G: Type ?u.6180
G
) (
b: H
b
:
H: Type ?u.6183
H
) : (
a: G
a
,
b: H
b
)⁻¹ = (
a: G
a
⁻¹,
b: H
b
⁻¹) :=
rfl: βˆ€ {Ξ± : Sort ?u.6311} {a : Ξ±}, a = a
rfl
#align prod.inv_mk
Prod.inv_mk: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Inv G] [inst_1 : Inv H] (a : G) (b : H), (a, b)⁻¹ = (a⁻¹, b⁻¹)
Prod.inv_mk
#align prod.neg_mk
Prod.neg_mk: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (a : G) (b : H), -(a, b) = (-a, -b)
Prod.neg_mk
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), swap (-p) = -swap p
to_additive
(attr := simp)] theorem
swap_inv: βˆ€ [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), swap p⁻¹ = (swap p)⁻¹
swap_inv
[
Inv: Type ?u.6417 β†’ Type ?u.6417
Inv
G: Type ?u.6402
G
] [
Inv: Type ?u.6420 β†’ Type ?u.6420
Inv
H: Type ?u.6405
H
] (
p: G Γ— H
p
:
G: Type ?u.6402
G
Γ—
H: Type ?u.6405
H
) :
p: G Γ— H
p
⁻¹.
swap: {Ξ± : Type ?u.6466} β†’ {Ξ² : Type ?u.6465} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
=
p: G Γ— H
p
.
swap: {Ξ± : Type ?u.6476} β†’ {Ξ² : Type ?u.6475} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
⁻¹ :=
rfl: βˆ€ {Ξ± : Sort ?u.6513} {a : Ξ±}, a = a
rfl
#align prod.swap_inv
Prod.swap_inv: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Inv G] [inst_1 : Inv H] (p : G Γ— H), swap p⁻¹ = (swap p)⁻¹
Prod.swap_inv
#align prod.swap_neg
Prod.swap_neg: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Neg G] [inst_1 : Neg H] (p : G Γ— H), swap (-p) = -swap p
Prod.swap_neg
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : InvolutiveNeg M] β†’ [inst : InvolutiveNeg N] β†’ InvolutiveNeg (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : InvolutiveInv M] β†’ [inst : InvolutiveInv N] β†’ InvolutiveInv (M Γ— N)
instance
[
InvolutiveInv: Type ?u.6608 β†’ Type ?u.6608
InvolutiveInv
M: Type ?u.6599
M
] [
InvolutiveInv: Type ?u.6611 β†’ Type ?u.6611
InvolutiveInv
N: Type ?u.6602
N
] :
InvolutiveInv: Type ?u.6614 β†’ Type ?u.6614
InvolutiveInv
(
M: Type ?u.6599
M
Γ—
N: Type ?u.6602
N
) := { inv_inv := fun
_: ?m.6786
_
=>
ext: βˆ€ {Ξ± : Type ?u.6788} {Ξ² : Type ?u.6789} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
inv_inv: βˆ€ {G : Type ?u.6799} [inst : InvolutiveInv G] (a : G), a⁻¹⁻¹ = a
inv_inv
_: ?m.6800
_
) (
inv_inv: βˆ€ {G : Type ?u.6821} [inst : InvolutiveInv G] (a : G), a⁻¹⁻¹ = a
inv_inv
_: ?m.6822
_
) } @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Sub M] β†’ [inst : Sub N] β†’ Sub (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Div M] β†’ [inst : Div N] β†’ Div (M Γ— N)
instance
[
Div: Type ?u.7024 β†’ Type ?u.7024
Div
M: Type ?u.7015
M
] [
Div: Type ?u.7027 β†’ Type ?u.7027
Div
N: Type ?u.7018
N
] :
Div: Type ?u.7030 β†’ Type ?u.7030
Div
(
M: Type ?u.7015
M
Γ—
N: Type ?u.7018
N
) := ⟨fun
p: ?m.7042
p
q: ?m.7045
q
=> ⟨
p: ?m.7042
p
.
1: {Ξ± : Type ?u.7061} β†’ {Ξ² : Type ?u.7060} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
/
q: ?m.7045
q
.
1: {Ξ± : Type ?u.7065} β†’ {Ξ² : Type ?u.7064} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
,
p: ?m.7042
p
.
2: {Ξ± : Type ?u.7109} β†’ {Ξ² : Type ?u.7108} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
/
q: ?m.7045
q
.
2: {Ξ± : Type ?u.7113} β†’ {Ξ² : Type ?u.7112} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⟩⟩ @[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), (a - b).fst = a.fst - b.fst
to_additive
(attr := simp)] theorem
fst_div: βˆ€ [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), (a / b).fst = a.fst / b.fst
fst_div
[
Div: Type ?u.7496 β†’ Type ?u.7496
Div
G: Type ?u.7481
G
] [
Div: Type ?u.7499 β†’ Type ?u.7499
Div
H: Type ?u.7484
H
] (
a: G Γ— H
a
b: G Γ— H
b
:
G: Type ?u.7481
G
Γ—
H: Type ?u.7484
H
) : (
a: G Γ— H
a
/
b: G Γ— H
b
).
1: {Ξ± : Type ?u.7585} β†’ {Ξ² : Type ?u.7584} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
=
a: G Γ— H
a
.
1: {Ξ± : Type ?u.7594} β†’ {Ξ² : Type ?u.7593} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
/
b: G Γ— H
b
.
1: {Ξ± : Type ?u.7598} β†’ {Ξ² : Type ?u.7597} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
:=
rfl: βˆ€ {Ξ± : Sort ?u.7642} {a : Ξ±}, a = a
rfl
#align prod.fst_div
Prod.fst_div: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), (a / b).fst = a.fst / b.fst
Prod.fst_div
#align prod.fst_sub
Prod.fst_sub: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), (a - b).fst = a.fst - b.fst
Prod.fst_sub
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), (a - b).snd = a.snd - b.snd
to_additive
(attr := simp)] theorem
snd_div: βˆ€ [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), (a / b).snd = a.snd / b.snd
snd_div
[
Div: Type ?u.7740 β†’ Type ?u.7740
Div
G: Type ?u.7725
G
] [
Div: Type ?u.7743 β†’ Type ?u.7743
Div
H: Type ?u.7728
H
] (
a: G Γ— H
a
b: G Γ— H
b
:
G: Type ?u.7725
G
Γ—
H: Type ?u.7728
H
) : (
a: G Γ— H
a
/
b: G Γ— H
b
).
2: {Ξ± : Type ?u.7829} β†’ {Ξ² : Type ?u.7828} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
=
a: G Γ— H
a
.
2: {Ξ± : Type ?u.7838} β†’ {Ξ² : Type ?u.7837} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
/
b: G Γ— H
b
.
2: {Ξ± : Type ?u.7842} β†’ {Ξ² : Type ?u.7841} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
:=
rfl: βˆ€ {Ξ± : Sort ?u.7886} {a : Ξ±}, a = a
rfl
#align prod.snd_div
Prod.snd_div: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), (a / b).snd = a.snd / b.snd
Prod.snd_div
#align prod.snd_sub
Prod.snd_sub: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), (a - b).snd = a.snd - b.snd
Prod.snd_sub
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (x₁ xβ‚‚ : G) (y₁ yβ‚‚ : H), (x₁, y₁) - (xβ‚‚, yβ‚‚) = (x₁ - xβ‚‚, y₁ - yβ‚‚)
to_additive
(attr := simp)] theorem
mk_div_mk: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (x₁ xβ‚‚ : G) (y₁ yβ‚‚ : H), (x₁, y₁) / (xβ‚‚, yβ‚‚) = (x₁ / xβ‚‚, y₁ / yβ‚‚)
mk_div_mk
[
Div: Type ?u.7984 β†’ Type ?u.7984
Div
G: Type ?u.7969
G
] [
Div: Type ?u.7987 β†’ Type ?u.7987
Div
H: Type ?u.7972
H
] (
x₁: G
x₁
xβ‚‚: G
xβ‚‚
:
G: Type ?u.7969
G
) (
y₁: H
y₁
yβ‚‚: H
yβ‚‚
:
H: Type ?u.7972
H
) : (
x₁: G
x₁
,
y₁: H
y₁
) / (
xβ‚‚: G
xβ‚‚
,
yβ‚‚: H
yβ‚‚
) = (
x₁: G
x₁
/
xβ‚‚: G
xβ‚‚
,
y₁: H
y₁
/
yβ‚‚: H
yβ‚‚
) :=
rfl: βˆ€ {Ξ± : Sort ?u.8170} {a : Ξ±}, a = a
rfl
#align prod.mk_div_mk
Prod.mk_div_mk: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (x₁ xβ‚‚ : G) (y₁ yβ‚‚ : H), (x₁, y₁) / (xβ‚‚, yβ‚‚) = (x₁ / xβ‚‚, y₁ / yβ‚‚)
Prod.mk_div_mk
#align prod.mk_sub_mk
Prod.mk_sub_mk: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (x₁ xβ‚‚ : G) (y₁ yβ‚‚ : H), (x₁, y₁) - (xβ‚‚, yβ‚‚) = (x₁ - xβ‚‚, y₁ - yβ‚‚)
Prod.mk_sub_mk
@[
to_additive: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), swap (a - b) = swap a - swap b
to_additive
(attr := simp)] theorem
swap_div: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), swap (a / b) = swap a / swap b
swap_div
[
Div: Type ?u.8302 β†’ Type ?u.8302
Div
G: Type ?u.8287
G
] [
Div: Type ?u.8305 β†’ Type ?u.8305
Div
H: Type ?u.8290
H
] (
a: G Γ— H
a
b: G Γ— H
b
:
G: Type ?u.8287
G
Γ—
H: Type ?u.8290
H
) : (
a: G Γ— H
a
/
b: G Γ— H
b
).
swap: {Ξ± : Type ?u.8391} β†’ {Ξ² : Type ?u.8390} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
=
a: G Γ— H
a
.
swap: {Ξ± : Type ?u.8403} β†’ {Ξ² : Type ?u.8402} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
/
b: G Γ— H
b
.
swap: {Ξ± : Type ?u.8410} β†’ {Ξ² : Type ?u.8409} β†’ Ξ± Γ— Ξ² β†’ Ξ² Γ— Ξ±
swap
:=
rfl: βˆ€ {Ξ± : Sort ?u.8477} {a : Ξ±}, a = a
rfl
#align prod.swap_div
Prod.swap_div: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Div G] [inst_1 : Div H] (a b : G Γ— H), swap (a / b) = swap a / swap b
Prod.swap_div
#align prod.swap_sub
Prod.swap_sub: βˆ€ {G : Type u_1} {H : Type u_2} [inst : Sub G] [inst_1 : Sub H] (a b : G Γ— H), swap (a - b) = swap a - swap b
Prod.swap_sub
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : MulZeroClass M] β†’ [inst : MulZeroClass N] β†’ MulZeroClass (M Γ— N)
instance
[
MulZeroClass: Type ?u.8589 β†’ Type ?u.8589
MulZeroClass
M: Type ?u.8580
M
] [
MulZeroClass: Type ?u.8592 β†’ Type ?u.8592
MulZeroClass
N: Type ?u.8583
N
] :
MulZeroClass: Type ?u.8595 β†’ Type ?u.8595
MulZeroClass
(
M: Type ?u.8580
M
Γ—
N: Type ?u.8583
N
) := { zero_mul := fun
a: ?m.8805
a
=>
Prod.recOn: βˆ€ {Ξ± : Type ?u.8808} {Ξ² : Type ?u.8807} {motive : Ξ± Γ— Ξ² β†’ Sort ?u.8809} (t : Ξ± Γ— Ξ²), (βˆ€ (fst : Ξ±) (snd : Ξ²), motive (fst, snd)) β†’ motive t
Prod.recOn
a: ?m.8805
a
fun
_: ?m.8880
_
_: ?m.8883
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.8885} {Ξ² : Type ?u.8886} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
zero_mul: βˆ€ {Mβ‚€ : Type ?u.8909} [self : MulZeroClass Mβ‚€] (a : Mβ‚€), 0 * a = 0
zero_mul
_: ?m.8910
_
,
zero_mul: βˆ€ {Mβ‚€ : Type ?u.8940} [self : MulZeroClass Mβ‚€] (a : Mβ‚€), 0 * a = 0
zero_mul
_: ?m.8941
_
⟩, mul_zero := fun
a: ?m.8845
a
=>
Prod.recOn: βˆ€ {Ξ± : Type ?u.8848} {Ξ² : Type ?u.8847} {motive : Ξ± Γ— Ξ² β†’ Sort ?u.8849} (t : Ξ± Γ— Ξ²), (βˆ€ (fst : Ξ±) (snd : Ξ²), motive (fst, snd)) β†’ motive t
Prod.recOn
a: ?m.8845
a
fun
_: ?m.8979
_
_: ?m.8982
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.8984} {Ξ² : Type ?u.8985} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
mul_zero: βˆ€ {Mβ‚€ : Type ?u.9000} [self : MulZeroClass Mβ‚€] (a : Mβ‚€), a * 0 = 0
mul_zero
_: ?m.9001
_
,
mul_zero: βˆ€ {Mβ‚€ : Type ?u.9010} [self : MulZeroClass Mβ‚€] (a : Mβ‚€), a * 0 = 0
mul_zero
_: ?m.9011
_
⟩ } @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddSemigroup M] β†’ [inst : AddSemigroup N] β†’ AddSemigroup (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Semigroup M] β†’ [inst : Semigroup N] β†’ Semigroup (M Γ— N)
instance
[
Semigroup: Type ?u.9130 β†’ Type ?u.9130
Semigroup
M: Type ?u.9121
M
] [
Semigroup: Type ?u.9133 β†’ Type ?u.9133
Semigroup
N: Type ?u.9124
N
] :
Semigroup: Type ?u.9136 β†’ Type ?u.9136
Semigroup
(
M: Type ?u.9121
M
Γ—
N: Type ?u.9124
N
) := { mul_assoc := fun
_: ?m.9522
_
_: ?m.9525
_
_: ?m.9528
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.9530} {Ξ² : Type ?u.9531} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
mul_assoc: βˆ€ {G : Type ?u.9559} [inst : Semigroup G] (a b c : G), a * b * c = a * (b * c)
mul_assoc
_: ?m.9560
_
_: ?m.9560
_
_: ?m.9560
_
,
mul_assoc: βˆ€ {G : Type ?u.9595} [inst : Semigroup G] (a b c : G), a * b * c = a * (b * c)
mul_assoc
_: ?m.9596
_
_: ?m.9596
_
_: ?m.9596
_
⟩ } @[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : AddCommSemigroup G] β†’ [inst : AddCommSemigroup H] β†’ AddCommSemigroup (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : CommSemigroup G] β†’ [inst : CommSemigroup H] β†’ CommSemigroup (G Γ— H)
instance
[
CommSemigroup: Type ?u.9826 β†’ Type ?u.9826
CommSemigroup
G: Type ?u.9811
G
] [
CommSemigroup: Type ?u.9829 β†’ Type ?u.9829
CommSemigroup
H: Type ?u.9814
H
] :
CommSemigroup: Type ?u.9832 β†’ Type ?u.9832
CommSemigroup
(
G: Type ?u.9811
G
Γ—
H: Type ?u.9814
H
) := { mul_comm := fun
_: ?m.10202
_
_: ?m.10205
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.10207} {Ξ² : Type ?u.10208} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
mul_comm: βˆ€ {G : Type ?u.10236} [inst : CommSemigroup G] (a b : G), a * b = b * a
mul_comm
_: ?m.10237
_
_: ?m.10237
_
,
mul_comm: βˆ€ {G : Type ?u.10261} [inst : CommSemigroup G] (a b : G), a * b = b * a
mul_comm
_: ?m.10262
_
_: ?m.10262
_
⟩ }
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : SemigroupWithZero M] β†’ [inst : SemigroupWithZero N] β†’ SemigroupWithZero (M Γ— N)
instance
[
SemigroupWithZero: Type ?u.10474 β†’ Type ?u.10474
SemigroupWithZero
M: Type ?u.10465
M
] [
SemigroupWithZero: Type ?u.10477 β†’ Type ?u.10477
SemigroupWithZero
N: Type ?u.10468
N
] :
SemigroupWithZero: Type ?u.10480 β†’ Type ?u.10480
SemigroupWithZero
(
M: Type ?u.10465
M
Γ—
N: Type ?u.10468
N
) :=
{ zero_mul := : SemigroupWithZero ?m.10487
{
zero_mul
{ zero_mul := : SemigroupWithZero ?m.10487
:=

Goals accomplished! πŸ™
A: Type ?u.10453

B: Type ?u.10456

G: Type ?u.10459

H: Type ?u.10462

M: Type ?u.10465

N: Type ?u.10468

P: Type ?u.10471

inst✝¹: SemigroupWithZero M

inst✝: SemigroupWithZero N


βˆ€ (a : M Γ— N), 0 * a = 0

Goals accomplished! πŸ™
, mul_zero := : SemigroupWithZero ?m.10487
,
mul_zero
, mul_zero := : SemigroupWithZero ?m.10487
:=

Goals accomplished! πŸ™
A: Type ?u.10453

B: Type ?u.10456

G: Type ?u.10459

H: Type ?u.10462

M: Type ?u.10465

N: Type ?u.10468

P: Type ?u.10471

inst✝¹: SemigroupWithZero M

inst✝: SemigroupWithZero N


βˆ€ (a : M Γ— N), a * 0 = 0

Goals accomplished! πŸ™
}: SemigroupWithZero ?m.10487
}
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddZeroClass M] β†’ [inst : AddZeroClass N] β†’ AddZeroClass (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : MulOneClass M] β†’ [inst : MulOneClass N] β†’ MulOneClass (M Γ— N)
instance
[
MulOneClass: Type ?u.12227 β†’ Type ?u.12227
MulOneClass
M: Type ?u.12218
M
] [
MulOneClass: Type ?u.12230 β†’ Type ?u.12230
MulOneClass
N: Type ?u.12221
N
] :
MulOneClass: Type ?u.12233 β†’ Type ?u.12233
MulOneClass
(
M: Type ?u.12218
M
Γ—
N: Type ?u.12221
N
) := { one_mul := fun
a: ?m.12762
a
=>
Prod.recOn: βˆ€ {Ξ± : Type ?u.12765} {Ξ² : Type ?u.12764} {motive : Ξ± Γ— Ξ² β†’ Sort ?u.12766} (t : Ξ± Γ— Ξ²), (βˆ€ (fst : Ξ±) (snd : Ξ²), motive (fst, snd)) β†’ motive t
Prod.recOn
a: ?m.12762
a
fun
_: ?m.12837
_
_: ?m.12840
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.12842} {Ξ² : Type ?u.12843} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
one_mul: βˆ€ {M : Type ?u.12866} [inst : MulOneClass M] (a : M), 1 * a = a
one_mul
_: ?m.12867
_
,
one_mul: βˆ€ {M : Type ?u.12900} [inst : MulOneClass M] (a : M), 1 * a = a
one_mul
_: ?m.12901
_
⟩, mul_one := fun
a: ?m.12802
a
=>
Prod.recOn: βˆ€ {Ξ± : Type ?u.12805} {Ξ² : Type ?u.12804} {motive : Ξ± Γ— Ξ² β†’ Sort ?u.12806} (t : Ξ± Γ— Ξ²), (βˆ€ (fst : Ξ±) (snd : Ξ²), motive (fst, snd)) β†’ motive t
Prod.recOn
a: ?m.12802
a
fun
_: ?m.12942
_
_: ?m.12945
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.12947} {Ξ² : Type ?u.12948} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
mul_one: βˆ€ {M : Type ?u.12963} [inst : MulOneClass M] (a : M), a * 1 = a
mul_one
_: ?m.12964
_
,
mul_one: βˆ€ {M : Type ?u.12976} [inst : MulOneClass M] (a : M), a * 1 = a
mul_one
_: ?m.12977
_
⟩ } @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddMonoid M] β†’ [inst : AddMonoid N] β†’ AddMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : Monoid M] β†’ [inst : Monoid N] β†’ Monoid (M Γ— N)
instance
[
Monoid: Type ?u.13214 β†’ Type ?u.13214
Monoid
M: Type ?u.13205
M
] [
Monoid: Type ?u.13217 β†’ Type ?u.13217
Monoid
N: Type ?u.13208
N
] :
Monoid: Type ?u.13220 β†’ Type ?u.13220
Monoid
(
M: Type ?u.13205
M
Γ—
N: Type ?u.13208
N
) := { npow := fun
z: ?m.13601
z
a: ?m.13604
a
=> ⟨
Monoid.npow: {M : Type ?u.13616} β†’ [self : Monoid M] β†’ β„• β†’ M β†’ M
Monoid.npow
z: ?m.13601
z
a: ?m.13604
a
.
1: {Ξ± : Type ?u.13633} β†’ {Ξ² : Type ?u.13632} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
,
Monoid.npow: {M : Type ?u.13642} β†’ [self : Monoid M] β†’ β„• β†’ M β†’ M
Monoid.npow
z: ?m.13601
z
a: ?m.13604
a
.
2: {Ξ± : Type ?u.13659} β†’ {Ξ² : Type ?u.13658} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⟩, npow_zero := fun
z: ?m.13673
z
=>
ext: βˆ€ {Ξ± : Type ?u.13675} {Ξ² : Type ?u.13676} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
Monoid.npow_zero: βˆ€ {M : Type ?u.13688} [self : Monoid M] (x : M), Monoid.npow 0 x = 1
Monoid.npow_zero
_: ?m.13689
_
) (
Monoid.npow_zero: βˆ€ {M : Type ?u.13714} [self : Monoid M] (x : M), Monoid.npow 0 x = 1
Monoid.npow_zero
_: ?m.13715
_
), npow_succ := fun
z: ?m.13746
z
a: ?m.13749
a
=>
ext: βˆ€ {Ξ± : Type ?u.13751} {Ξ² : Type ?u.13752} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
Monoid.npow_succ: βˆ€ {M : Type ?u.13761} [self : Monoid M] (n : β„•) (x : M), Monoid.npow (n + 1) x = x * Monoid.npow n x
Monoid.npow_succ
_
_: ?m.13762
_
) (
Monoid.npow_succ: βˆ€ {M : Type ?u.13785} [self : Monoid M] (n : β„•) (x : M), Monoid.npow (n + 1) x = x * Monoid.npow n x
Monoid.npow_succ
_
_: ?m.13786
_
), one_mul :=

Goals accomplished! πŸ™
A: Type ?u.13193

B: Type ?u.13196

G: Type ?u.13199

H: Type ?u.13202

M: Type ?u.13205

N: Type ?u.13208

P: Type ?u.13211

inst✝¹: Monoid M

inst✝: Monoid N


βˆ€ (a : M Γ— N), 1 * a = a

Goals accomplished! πŸ™
, mul_one :=

Goals accomplished! πŸ™
A: Type ?u.13193

B: Type ?u.13196

G: Type ?u.13199

H: Type ?u.13202

M: Type ?u.13205

N: Type ?u.13208

P: Type ?u.13211

inst✝¹: Monoid M

inst✝: Monoid N


βˆ€ (a : M Γ— N), a * 1 = a

Goals accomplished! πŸ™
} @[to_additive
Prod.subNegMonoid: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : SubNegMonoid G] β†’ [inst : SubNegMonoid H] β†’ SubNegMonoid (G Γ— H)
Prod.subNegMonoid
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : DivInvMonoid G] β†’ [inst : DivInvMonoid H] β†’ DivInvMonoid (G Γ— H)
instance
[
DivInvMonoid: Type ?u.15470 β†’ Type ?u.15470
DivInvMonoid
G: Type ?u.15455
G
] [
DivInvMonoid: Type ?u.15473 β†’ Type ?u.15473
DivInvMonoid
H: Type ?u.15458
H
] :
DivInvMonoid: Type ?u.15476 β†’ Type ?u.15476
DivInvMonoid
(
G: Type ?u.15455
G
Γ—
H: Type ?u.15458
H
) := { div_eq_mul_inv := fun
_: ?m.15784
_
_: ?m.15787
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.15789} {Ξ² : Type ?u.15790} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
div_eq_mul_inv: βˆ€ {G : Type ?u.15818} [inst : DivInvMonoid G] (a b : G), a / b = a * b⁻¹
div_eq_mul_inv
_: ?m.15819
_
_: ?m.15819
_
,
div_eq_mul_inv: βˆ€ {G : Type ?u.15853} [inst : DivInvMonoid G] (a b : G), a / b = a * b⁻¹
div_eq_mul_inv
_: ?m.15854
_
_: ?m.15854
_
⟩, zpow := fun
z: ?m.15896
z
a: ?m.15899
a
=> ⟨
DivInvMonoid.zpow: {G : Type ?u.15909} β†’ [self : DivInvMonoid G] β†’ β„€ β†’ G β†’ G
DivInvMonoid.zpow
z: ?m.15896
z
a: ?m.15899
a
.
1: {Ξ± : Type ?u.15923} β†’ {Ξ² : Type ?u.15922} β†’ Ξ± Γ— Ξ² β†’ Ξ±
1
,
DivInvMonoid.zpow: {G : Type ?u.15926} β†’ [self : DivInvMonoid G] β†’ β„€ β†’ G β†’ G
DivInvMonoid.zpow
z: ?m.15896
z
a: ?m.15899
a
.
2: {Ξ± : Type ?u.15940} β†’ {Ξ² : Type ?u.15939} β†’ Ξ± Γ— Ξ² β†’ Ξ²
2
⟩, zpow_zero' := fun
_: ?m.15948
_
=>
ext: βˆ€ {Ξ± : Type ?u.15950} {Ξ² : Type ?u.15951} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
DivInvMonoid.zpow_zero': βˆ€ {G : Type ?u.15960} [self : DivInvMonoid G] (a : G), DivInvMonoid.zpow 0 a = 1
DivInvMonoid.zpow_zero'
_: ?m.15961
_
) (
DivInvMonoid.zpow_zero': βˆ€ {G : Type ?u.15980} [self : DivInvMonoid G] (a : G), DivInvMonoid.zpow 0 a = 1
DivInvMonoid.zpow_zero'
_: ?m.15981
_
), zpow_succ' := fun
_: ?m.16006
_
_: ?m.16009
_
=>
ext: βˆ€ {Ξ± : Type ?u.16011} {Ξ² : Type ?u.16012} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
DivInvMonoid.zpow_succ': βˆ€ {G : Type ?u.16021} [self : DivInvMonoid G] (n : β„•) (a : G), DivInvMonoid.zpow (Int.ofNat (Nat.succ n)) a = a * DivInvMonoid.zpow (Int.ofNat n) a
DivInvMonoid.zpow_succ'
_
_: ?m.16022
_
) (
DivInvMonoid.zpow_succ': βˆ€ {G : Type ?u.16041} [self : DivInvMonoid G] (n : β„•) (a : G), DivInvMonoid.zpow (Int.ofNat (Nat.succ n)) a = a * DivInvMonoid.zpow (Int.ofNat n) a
DivInvMonoid.zpow_succ'
_
_: ?m.16042
_
), zpow_neg' := fun
_: ?m.16065
_
_: ?m.16068
_
=>
ext: βˆ€ {Ξ± : Type ?u.16070} {Ξ² : Type ?u.16071} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
DivInvMonoid.zpow_neg': βˆ€ {G : Type ?u.16080} [self : DivInvMonoid G] (n : β„•) (a : G), DivInvMonoid.zpow (Int.negSucc n) a = (DivInvMonoid.zpow (↑(Nat.succ n)) a)⁻¹
DivInvMonoid.zpow_neg'
_
_: ?m.16081
_
) (
DivInvMonoid.zpow_neg': βˆ€ {G : Type ?u.16101} [self : DivInvMonoid G] (n : β„•) (a : G), DivInvMonoid.zpow (Int.negSucc n) a = (DivInvMonoid.zpow (↑(Nat.succ n)) a)⁻¹
DivInvMonoid.zpow_neg'
_
_: ?m.16102
_
) } @[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : SubtractionMonoid G] β†’ [inst : SubtractionMonoid H] β†’ SubtractionMonoid (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : DivisionMonoid G] β†’ [inst : DivisionMonoid H] β†’ DivisionMonoid (G Γ— H)
instance
[
DivisionMonoid: Type ?u.16670 β†’ Type ?u.16670
DivisionMonoid
G: Type ?u.16655
G
] [
DivisionMonoid: Type ?u.16673 β†’ Type ?u.16673
DivisionMonoid
H: Type ?u.16658
H
] :
DivisionMonoid: Type ?u.16676 β†’ Type ?u.16676
DivisionMonoid
(
G: Type ?u.16655
G
Γ—
H: Type ?u.16658
H
) := { mul_inv_rev := fun
a: ?m.16756
a
b: ?m.16759
b
=>
ext: βˆ€ {Ξ± : Type ?u.16761} {Ξ² : Type ?u.16762} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
mul_inv_rev: βˆ€ {G : Type ?u.16772} [inst : DivisionMonoid G] (a b : G), (a * b)⁻¹ = b⁻¹ * a⁻¹
mul_inv_rev
_: ?m.16773
_
_: ?m.16773
_
) (
mul_inv_rev: βˆ€ {G : Type ?u.16816} [inst : DivisionMonoid G] (a b : G), (a * b)⁻¹ = b⁻¹ * a⁻¹
mul_inv_rev
_: ?m.16817
_
_: ?m.16817
_
), inv_eq_of_mul := fun
a: ?m.16868
a
b: ?m.16871
b
h: ?m.16874
h
=>
ext: βˆ€ {Ξ± : Type ?u.16876} {Ξ² : Type ?u.16877} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
ext
(
inv_eq_of_mul_eq_one_right: βˆ€ {G : Type ?u.16884} [inst : DivisionMonoid G] {a b : G}, a * b = 1 β†’ a⁻¹ = b
inv_eq_of_mul_eq_one_right
<|
congr_arg: βˆ€ {Ξ± : Sort ?u.16898} {Ξ² : Sort ?u.16897} {a₁ aβ‚‚ : Ξ±} (f : Ξ± β†’ Ξ²), a₁ = aβ‚‚ β†’ f a₁ = f aβ‚‚
congr_arg
fst: {Ξ± : Type ?u.16904} β†’ {Ξ² : Type ?u.16903} β†’ Ξ± Γ— Ξ² β†’ Ξ±
fst
h: ?m.16874
h
) (
inv_eq_of_mul_eq_one_right: βˆ€ {G : Type ?u.16915} [inst : DivisionMonoid G] {a b : G}, a * b = 1 β†’ a⁻¹ = b
inv_eq_of_mul_eq_one_right
<|
congr_arg: βˆ€ {Ξ± : Sort ?u.16929} {Ξ² : Sort ?u.16928} {a₁ aβ‚‚ : Ξ±} (f : Ξ± β†’ Ξ²), a₁ = aβ‚‚ β†’ f a₁ = f aβ‚‚
congr_arg
snd: {Ξ± : Type ?u.16935} β†’ {Ξ² : Type ?u.16934} β†’ Ξ± Γ— Ξ² β†’ Ξ²
snd
h: ?m.16874
h
), inv_inv :=

Goals accomplished! πŸ™
A: Type ?u.16649

B: Type ?u.16652

G: Type ?u.16655

H: Type ?u.16658

M: Type ?u.16661

N: Type ?u.16664

P: Type ?u.16667

inst✝¹: DivisionMonoid G

inst✝: DivisionMonoid H


βˆ€ (x : G Γ— H), x⁻¹⁻¹ = x

Goals accomplished! πŸ™
} @[to_additive
SubtractionCommMonoid: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : _root_.SubtractionCommMonoid G] β†’ [inst : _root_.SubtractionCommMonoid H] β†’ _root_.SubtractionCommMonoid (G Γ— H)
SubtractionCommMonoid
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : DivisionCommMonoid G] β†’ [inst : DivisionCommMonoid H] β†’ DivisionCommMonoid (G Γ— H)
instance
[
DivisionCommMonoid: Type ?u.17831 β†’ Type ?u.17831
DivisionCommMonoid
G: Type ?u.17816
G
] [
DivisionCommMonoid: Type ?u.17834 β†’ Type ?u.17834
DivisionCommMonoid
H: Type ?u.17819
H
] :
DivisionCommMonoid: Type ?u.17837 β†’ Type ?u.17837
DivisionCommMonoid
(
G: Type ?u.17816
G
Γ—
H: Type ?u.17819
H
) := { mul_comm := fun ⟨
g₁: G
g₁
,
h₁: H
h₁
⟩ ⟨_, _⟩ =>

Goals accomplished! πŸ™
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁ * fst✝, h₁ * snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, h₁ * snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, snd✝ * h₁) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, snd✝ * h₁) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, snd✝ * h₁) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.17810

B: Type ?u.17813

G: Type ?u.17816

H: Type ?u.17819

M: Type ?u.17822

N: Type ?u.17825

P: Type ?u.17828

inst✝¹: DivisionCommMonoid G

inst✝: DivisionCommMonoid H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)

Goals accomplished! πŸ™
} @[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : AddGroup G] β†’ [inst : AddGroup H] β†’ AddGroup (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : Group G] β†’ [inst : Group H] β†’ Group (G Γ— H)
instance
[
Group: Type ?u.18747 β†’ Type ?u.18747
Group
G: Type ?u.18732
G
] [
Group: Type ?u.18750 β†’ Type ?u.18750
Group
H: Type ?u.18735
H
] :
Group: Type ?u.18753 β†’ Type ?u.18753
Group
(
G: Type ?u.18732
G
Γ—
H: Type ?u.18735
H
) := { mul_left_inv := fun
_: ?m.18814
_
=>
mk.inj_iff: βˆ€ {Ξ± : Type ?u.18816} {Ξ² : Type ?u.18817} {a₁ aβ‚‚ : Ξ±} {b₁ bβ‚‚ : Ξ²}, (a₁, b₁) = (aβ‚‚, bβ‚‚) ↔ a₁ = aβ‚‚ ∧ b₁ = bβ‚‚
mk.inj_iff
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
⟨
mul_left_inv: βˆ€ {G : Type ?u.18845} [inst : Group G] (a : G), a⁻¹ * a = 1
mul_left_inv
_: ?m.18846
_
,
mul_left_inv: βˆ€ {G : Type ?u.18875} [inst : Group G] (a : G), a⁻¹ * a = 1
mul_left_inv
_: ?m.18876
_
⟩ } @[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : AddLeftCancelSemigroup G] β†’ [inst : AddLeftCancelSemigroup H] β†’ AddLeftCancelSemigroup (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : LeftCancelSemigroup G] β†’ [inst : LeftCancelSemigroup H] β†’ LeftCancelSemigroup (G Γ— H)
instance
[
LeftCancelSemigroup: Type ?u.19086 β†’ Type ?u.19086
LeftCancelSemigroup
G: Type ?u.19071
G
] [
LeftCancelSemigroup: Type ?u.19089 β†’ Type ?u.19089
LeftCancelSemigroup
H: Type ?u.19074
H
] :
LeftCancelSemigroup: Type ?u.19092 β†’ Type ?u.19092
LeftCancelSemigroup
(
G: Type ?u.19071
G
Γ—
H: Type ?u.19074
H
) := { mul_left_cancel := fun
_: ?m.19448
_
_: ?m.19451
_
_: ?m.19454
_
h: ?m.19457
h
=>
Prod.ext: βˆ€ {Ξ± : Type ?u.19459} {Ξ² : Type ?u.19460} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
Prod.ext
(
mul_left_cancel: βˆ€ {G : Type ?u.19470} [inst : Mul G] [inst_1 : IsLeftCancelMul G] {a b c : G}, a * b = a * c β†’ b = c
mul_left_cancel
(
Prod.ext_iff: βˆ€ {Ξ± : Type ?u.19533} {Ξ² : Type ?u.19534} {p q : Ξ± Γ— Ξ²}, p = q ↔ p.fst = q.fst ∧ p.snd = q.snd
Prod.ext_iff
.
1: βˆ€ {a b : Prop}, (a ↔ b) β†’ a β†’ b
1
h: ?m.19457
h
).
1: βˆ€ {a b : Prop}, a ∧ b β†’ a
1
) (
mul_left_cancel: βˆ€ {G : Type ?u.19758} [inst : Mul G] [inst_1 : IsLeftCancelMul G] {a b c : G}, a * b = a * c β†’ b = c
mul_left_cancel
(
Prod.ext_iff: βˆ€ {Ξ± : Type ?u.19821} {Ξ² : Type ?u.19822} {p q : Ξ± Γ— Ξ²}, p = q ↔ p.fst = q.fst ∧ p.snd = q.snd
Prod.ext_iff
.
1: βˆ€ {a b : Prop}, (a ↔ b) β†’ a β†’ b
1
h: ?m.19457
h
).
2: βˆ€ {a b : Prop}, a ∧ b β†’ b
2
) } @[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : AddRightCancelSemigroup G] β†’ [inst : AddRightCancelSemigroup H] β†’ AddRightCancelSemigroup (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : RightCancelSemigroup G] β†’ [inst : RightCancelSemigroup H] β†’ RightCancelSemigroup (G Γ— H)
instance
[
RightCancelSemigroup: Type ?u.20244 β†’ Type ?u.20244
RightCancelSemigroup
G: Type ?u.20229
G
] [
RightCancelSemigroup: Type ?u.20247 β†’ Type ?u.20247
RightCancelSemigroup
H: Type ?u.20232
H
] :
RightCancelSemigroup: Type ?u.20250 β†’ Type ?u.20250
RightCancelSemigroup
(
G: Type ?u.20229
G
Γ—
H: Type ?u.20232
H
) := { mul_right_cancel := fun
_: ?m.20592
_
_: ?m.20595
_
_: ?m.20598
_
h: ?m.20601
h
=>
Prod.ext: βˆ€ {Ξ± : Type ?u.20603} {Ξ² : Type ?u.20604} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
Prod.ext
(
mul_right_cancel: βˆ€ {G : Type ?u.20614} [inst : Mul G] [inst_1 : IsRightCancelMul G] {a b c : G}, a * b = c * b β†’ a = c
mul_right_cancel
(
Prod.ext_iff: βˆ€ {Ξ± : Type ?u.20677} {Ξ² : Type ?u.20678} {p q : Ξ± Γ— Ξ²}, p = q ↔ p.fst = q.fst ∧ p.snd = q.snd
Prod.ext_iff
.
1: βˆ€ {a b : Prop}, (a ↔ b) β†’ a β†’ b
1
h: ?m.20601
h
).
1: βˆ€ {a b : Prop}, a ∧ b β†’ a
1
) (
mul_right_cancel: βˆ€ {G : Type ?u.20899} [inst : Mul G] [inst_1 : IsRightCancelMul G] {a b c : G}, a * b = c * b β†’ a = c
mul_right_cancel
(
Prod.ext_iff: βˆ€ {Ξ± : Type ?u.20962} {Ξ² : Type ?u.20963} {p q : Ξ± Γ— Ξ²}, p = q ↔ p.fst = q.fst ∧ p.snd = q.snd
Prod.ext_iff
.
1: βˆ€ {a b : Prop}, (a ↔ b) β†’ a β†’ b
1
h: ?m.20601
h
).
2: βˆ€ {a b : Prop}, a ∧ b β†’ b
2
) } @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddLeftCancelMonoid M] β†’ [inst : AddLeftCancelMonoid N] β†’ AddLeftCancelMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : LeftCancelMonoid M] β†’ [inst : LeftCancelMonoid N] β†’ LeftCancelMonoid (M Γ— N)
instance
[
LeftCancelMonoid: Type ?u.21382 β†’ Type ?u.21382
LeftCancelMonoid
M: Type ?u.21373
M
] [
LeftCancelMonoid: Type ?u.21385 β†’ Type ?u.21385
LeftCancelMonoid
N: Type ?u.21376
N
] :
LeftCancelMonoid: Type ?u.21388 β†’ Type ?u.21388
LeftCancelMonoid
(
M: Type ?u.21373
M
Γ—
N: Type ?u.21376
N
) :=
{ mul_one := : LeftCancelMonoid ?m.21395
{
mul_one
{ mul_one := : LeftCancelMonoid ?m.21395
:=

Goals accomplished! πŸ™
A: Type ?u.21361

B: Type ?u.21364

G: Type ?u.21367

H: Type ?u.21370

M: Type ?u.21373

N: Type ?u.21376

P: Type ?u.21379

inst✝¹: LeftCancelMonoid M

inst✝: LeftCancelMonoid N


βˆ€ (a : M Γ— N), a * 1 = a

Goals accomplished! πŸ™
, one_mul := : LeftCancelMonoid ?m.21395
,
one_mul
, one_mul := : LeftCancelMonoid ?m.21395
:=

Goals accomplished! πŸ™
A: Type ?u.21361

B: Type ?u.21364

G: Type ?u.21367

H: Type ?u.21370

M: Type ?u.21373

N: Type ?u.21376

P: Type ?u.21379

inst✝¹: LeftCancelMonoid M

inst✝: LeftCancelMonoid N


βˆ€ (a : M Γ— N), 1 * a = a

Goals accomplished! πŸ™
}: LeftCancelMonoid ?m.21395
}
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddRightCancelMonoid M] β†’ [inst : AddRightCancelMonoid N] β†’ AddRightCancelMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : RightCancelMonoid M] β†’ [inst : RightCancelMonoid N] β†’ RightCancelMonoid (M Γ— N)
instance
[
RightCancelMonoid: Type ?u.23331 β†’ Type ?u.23331
RightCancelMonoid
M: Type ?u.23322
M
] [
RightCancelMonoid: Type ?u.23334 β†’ Type ?u.23334
RightCancelMonoid
N: Type ?u.23325
N
] :
RightCancelMonoid: Type ?u.23337 β†’ Type ?u.23337
RightCancelMonoid
(
M: Type ?u.23322
M
Γ—
N: Type ?u.23325
N
) :=
{ mul_one := : RightCancelMonoid ?m.23344
{
mul_one
{ mul_one := : RightCancelMonoid ?m.23344
:=

Goals accomplished! πŸ™
A: Type ?u.23310

B: Type ?u.23313

G: Type ?u.23316

H: Type ?u.23319

M: Type ?u.23322

N: Type ?u.23325

P: Type ?u.23328

inst✝¹: RightCancelMonoid M

inst✝: RightCancelMonoid N


βˆ€ (a : M Γ— N), a * 1 = a

Goals accomplished! πŸ™
, one_mul := : RightCancelMonoid ?m.23344
,
one_mul
, one_mul := : RightCancelMonoid ?m.23344
:=

Goals accomplished! πŸ™
A: Type ?u.23310

B: Type ?u.23313

G: Type ?u.23316

H: Type ?u.23319

M: Type ?u.23322

N: Type ?u.23325

P: Type ?u.23328

inst✝¹: RightCancelMonoid M

inst✝: RightCancelMonoid N


βˆ€ (a : M Γ— N), 1 * a = a

Goals accomplished! πŸ™
}: RightCancelMonoid ?m.23344
}
@[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddCancelMonoid M] β†’ [inst : AddCancelMonoid N] β†’ AddCancelMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : CancelMonoid M] β†’ [inst : CancelMonoid N] β†’ CancelMonoid (M Γ— N)
instance
[
CancelMonoid: Type ?u.25176 β†’ Type ?u.25176
CancelMonoid
M: Type ?u.25167
M
] [
CancelMonoid: Type ?u.25179 β†’ Type ?u.25179
CancelMonoid
N: Type ?u.25170
N
] :
CancelMonoid: Type ?u.25182 β†’ Type ?u.25182
CancelMonoid
(
M: Type ?u.25167
M
Γ—
N: Type ?u.25170
N
) := { mul_right_cancel :=

Goals accomplished! πŸ™
A: Type ?u.25155

B: Type ?u.25158

G: Type ?u.25161

H: Type ?u.25164

M: Type ?u.25167

N: Type ?u.25170

P: Type ?u.25173

inst✝¹: CancelMonoid M

inst✝: CancelMonoid N


βˆ€ (a b c : M Γ— N), a * b = c * b β†’ a = c

Goals accomplished! πŸ™
} @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddCommMonoid M] β†’ [inst : AddCommMonoid N] β†’ AddCommMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : CommMonoid M] β†’ [inst : CommMonoid N] β†’ CommMonoid (M Γ— N)
instance
[
CommMonoid: Type ?u.26364 β†’ Type ?u.26364
CommMonoid
M: Type ?u.26355
M
] [
CommMonoid: Type ?u.26367 β†’ Type ?u.26367
CommMonoid
N: Type ?u.26358
N
] :
CommMonoid: Type ?u.26370 β†’ Type ?u.26370
CommMonoid
(
M: Type ?u.26355
M
Γ—
N: Type ?u.26358
N
) := { mul_comm := fun ⟨
m₁: M
m₁
,
n₁: N
n₁
⟩ ⟨_, _⟩ =>

Goals accomplished! πŸ™
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁ * fst✝, n₁ * snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁ * fst✝, n₁ * snd✝) = (fst✝ * m₁, snd✝ * n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(fst✝ * m₁, n₁ * snd✝) = (fst✝ * m₁, snd✝ * n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.26343

B: Type ?u.26346

G: Type ?u.26349

H: Type ?u.26352

M: Type ?u.26355

N: Type ?u.26358

P: Type ?u.26361

inst✝¹: CommMonoid M

inst✝: CommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(fst✝ * m₁, snd✝ * n₁) = (fst✝ * m₁, snd✝ * n₁)

Goals accomplished! πŸ™
} @[
to_additive: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : AddCancelCommMonoid M] β†’ [inst : AddCancelCommMonoid N] β†’ AddCancelCommMonoid (M Γ— N)
to_additive
]
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : CancelCommMonoid M] β†’ [inst : CancelCommMonoid N] β†’ CancelCommMonoid (M Γ— N)
instance
[
CancelCommMonoid: Type ?u.27556 β†’ Type ?u.27556
CancelCommMonoid
M: Type ?u.27547
M
] [
CancelCommMonoid: Type ?u.27559 β†’ Type ?u.27559
CancelCommMonoid
N: Type ?u.27550
N
] :
CancelCommMonoid: Type ?u.27562 β†’ Type ?u.27562
CancelCommMonoid
(
M: Type ?u.27547
M
Γ—
N: Type ?u.27550
N
) := { mul_comm := fun ⟨
m₁: M
m₁
,
n₁: N
n₁
⟩ ⟨_, _⟩ =>

Goals accomplished! πŸ™
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁ * fst✝, n₁ * snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁ * fst✝, n₁ * snd✝) = (fst✝ * m₁, snd✝ * n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(fst✝ * m₁, n₁ * snd✝) = (fst✝ * m₁, snd✝ * n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(m₁, n₁) * (fst✝, snd✝) = (fst✝, snd✝) * (m₁, n₁)
A: Type ?u.27535

B: Type ?u.27538

G: Type ?u.27541

H: Type ?u.27544

M: Type ?u.27547

N: Type ?u.27550

P: Type ?u.27553

inst✝¹: CancelCommMonoid M

inst✝: CancelCommMonoid N

x✝¹, x✝: M Γ— N

m₁: M

n₁: N

fst✝: M

snd✝: N


(fst✝ * m₁, snd✝ * n₁) = (fst✝ * m₁, snd✝ * n₁)

Goals accomplished! πŸ™
}
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : MulZeroOneClass M] β†’ [inst : MulZeroOneClass N] β†’ MulZeroOneClass (M Γ— N)
instance
[
MulZeroOneClass: Type ?u.28577 β†’ Type ?u.28577
MulZeroOneClass
M: Type ?u.28568
M
] [
MulZeroOneClass: Type ?u.28580 β†’ Type ?u.28580
MulZeroOneClass
N: Type ?u.28571
N
] :
MulZeroOneClass: Type ?u.28583 β†’ Type ?u.28583
MulZeroOneClass
(
M: Type ?u.28568
M
Γ—
N: Type ?u.28571
N
) :=
{ zero_mul := : MulZeroOneClass ?m.28590
{
zero_mul
{ zero_mul := : MulZeroOneClass ?m.28590
:=

Goals accomplished! πŸ™
A: Type ?u.28556

B: Type ?u.28559

G: Type ?u.28562

H: Type ?u.28565

M: Type ?u.28568

N: Type ?u.28571

P: Type ?u.28574

inst✝¹: MulZeroOneClass M

inst✝: MulZeroOneClass N


βˆ€ (a : M Γ— N), 0 * a = 0

Goals accomplished! πŸ™
, mul_zero := : MulZeroOneClass ?m.28590
,
mul_zero
, mul_zero := : MulZeroOneClass ?m.28590
:=

Goals accomplished! πŸ™
A: Type ?u.28556

B: Type ?u.28559

G: Type ?u.28562

H: Type ?u.28565

M: Type ?u.28568

N: Type ?u.28571

P: Type ?u.28574

inst✝¹: MulZeroOneClass M

inst✝: MulZeroOneClass N


βˆ€ (a : M Γ— N), a * 0 = 0

Goals accomplished! πŸ™
}: MulZeroOneClass ?m.28590
}
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : MonoidWithZero M] β†’ [inst : MonoidWithZero N] β†’ MonoidWithZero (M Γ— N)
instance
[
MonoidWithZero: Type ?u.30143 β†’ Type ?u.30143
MonoidWithZero
M: Type ?u.30134
M
] [
MonoidWithZero: Type ?u.30146 β†’ Type ?u.30146
MonoidWithZero
N: Type ?u.30137
N
] :
MonoidWithZero: Type ?u.30149 β†’ Type ?u.30149
MonoidWithZero
(
M: Type ?u.30134
M
Γ—
N: Type ?u.30137
N
) :=
{ zero_mul := : MonoidWithZero ?m.30156
{
zero_mul
{ zero_mul := : MonoidWithZero ?m.30156
:=

Goals accomplished! πŸ™
A: Type ?u.30122

B: Type ?u.30125

G: Type ?u.30128

H: Type ?u.30131

M: Type ?u.30134

N: Type ?u.30137

P: Type ?u.30140

inst✝¹: MonoidWithZero M

inst✝: MonoidWithZero N


βˆ€ (a : M Γ— N), 0 * a = 0

Goals accomplished! πŸ™
, mul_zero := : MonoidWithZero ?m.30156
,
mul_zero
, mul_zero := : MonoidWithZero ?m.30156
:=

Goals accomplished! πŸ™
A: Type ?u.30122

B: Type ?u.30125

G: Type ?u.30128

H: Type ?u.30131

M: Type ?u.30134

N: Type ?u.30137

P: Type ?u.30140

inst✝¹: MonoidWithZero M

inst✝: MonoidWithZero N


βˆ€ (a : M Γ— N), a * 0 = 0

Goals accomplished! πŸ™
}: MonoidWithZero ?m.30156
}
instance: {M : Type u_1} β†’ {N : Type u_2} β†’ [inst : CommMonoidWithZero M] β†’ [inst : CommMonoidWithZero N] β†’ CommMonoidWithZero (M Γ— N)
instance
[
CommMonoidWithZero: Type ?u.31564 β†’ Type ?u.31564
CommMonoidWithZero
M: Type ?u.31555
M
] [
CommMonoidWithZero: Type ?u.31567 β†’ Type ?u.31567
CommMonoidWithZero
N: Type ?u.31558
N
] :
CommMonoidWithZero: Type ?u.31570 β†’ Type ?u.31570
CommMonoidWithZero
(
M: Type ?u.31555
M
Γ—
N: Type ?u.31558
N
) :=
{ zero_mul := : CommMonoidWithZero ?m.31577
{
zero_mul
{ zero_mul := : CommMonoidWithZero ?m.31577
:=

Goals accomplished! πŸ™
A: Type ?u.31543

B: Type ?u.31546

G: Type ?u.31549

H: Type ?u.31552

M: Type ?u.31555

N: Type ?u.31558

P: Type ?u.31561

inst✝¹: CommMonoidWithZero M

inst✝: CommMonoidWithZero N


βˆ€ (a : M Γ— N), 0 * a = 0

Goals accomplished! πŸ™
, mul_zero := : CommMonoidWithZero ?m.31577
,
mul_zero
, mul_zero := : CommMonoidWithZero ?m.31577
:=

Goals accomplished! πŸ™
A: Type ?u.31543

B: Type ?u.31546

G: Type ?u.31549

H: Type ?u.31552

M: Type ?u.31555

N: Type ?u.31558

P: Type ?u.31561

inst✝¹: CommMonoidWithZero M

inst✝: CommMonoidWithZero N


βˆ€ (a : M Γ— N), a * 0 = 0

Goals accomplished! πŸ™
}: CommMonoidWithZero ?m.31577
}
@[
to_additive: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : AddCommGroup G] β†’ [inst : AddCommGroup H] β†’ AddCommGroup (G Γ— H)
to_additive
]
instance: {G : Type u_1} β†’ {H : Type u_2} β†’ [inst : CommGroup G] β†’ [inst : CommGroup H] β†’ CommGroup (G Γ— H)
instance
[
CommGroup: Type ?u.32990 β†’ Type ?u.32990
CommGroup
G: Type ?u.32975
G
] [
CommGroup: Type ?u.32993 β†’ Type ?u.32993
CommGroup
H: Type ?u.32978
H
] :
CommGroup: Type ?u.32996 β†’ Type ?u.32996
CommGroup
(
G: Type ?u.32975
G
Γ—
H: Type ?u.32978
H
) := { mul_comm := fun ⟨
g₁: G
g₁
,
h₁: H
h₁
⟩ ⟨_, _⟩ =>

Goals accomplished! πŸ™
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁ * fst✝, h₁ * snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁ * fst✝, h₁ * snd✝) = (fst✝ * g₁, snd✝ * h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, h₁ * snd✝) = (fst✝ * g₁, snd✝ * h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(g₁, h₁) * (fst✝, snd✝) = (fst✝, snd✝) * (g₁, h₁)
A: Type ?u.32969

B: Type ?u.32972

G: Type ?u.32975

H: Type ?u.32978

M: Type ?u.32981

N: Type ?u.32984

P: Type ?u.32987

inst✝¹: CommGroup G

inst✝: CommGroup H

x✝¹, x✝: G Γ— H

g₁: G

h₁: H

fst✝: G

snd✝: H


(fst✝ * g₁, snd✝ * h₁) = (fst✝ * g₁, snd✝ * h₁)

Goals accomplished! πŸ™
} end Prod namespace MulHom section Prod variable (
M: ?m.33892
M
N: ?m.33895
N
) [
Mul: Type ?u.33898 β†’ Type ?u.33898
Mul
M: Type ?u.33919
M
] [
Mul: Type ?u.34527 β†’ Type ?u.34527
Mul
N: Type ?u.33922
N
] [
Mul: Type ?u.34530 β†’ Type ?u.34530
Mul
P: Type ?u.33889
P
] /-- Given magmas `M`, `N`, the natural projection homomorphism from `M Γ— N` to `M`.-/ @[
to_additive: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ AddHom (M Γ— N) M
to_additive
"Given additive magmas `A`, `B`, the natural projection homomorphism from `A Γ— B` to `A`"] def
fst: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* M
fst
:
M: Type ?u.33919
M
Γ—
N: Type ?u.33922
N
β†’β‚™*
M: Type ?u.33919
M
:= ⟨
Prod.fst: {Ξ± : Type ?u.34030} β†’ {Ξ² : Type ?u.34029} β†’ Ξ± Γ— Ξ² β†’ Ξ±
Prod.fst
, fun
_: ?m.34039
_
_: ?m.34042
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.34044} {a : Ξ±}, a = a
rfl
⟩ #align mul_hom.fst
MulHom.fst: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* M
MulHom.fst
#align add_hom.fst
AddHom.fst: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ AddHom (M Γ— N) M
AddHom.fst
/-- Given magmas `M`, `N`, the natural projection homomorphism from `M Γ— N` to `N`.-/ @[
to_additive: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ AddHom (M Γ— N) N
to_additive
"Given additive magmas `A`, `B`, the natural projection homomorphism from `A Γ— B` to `B`"] def
snd: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* N
snd
:
M: Type ?u.34224
M
Γ—
N: Type ?u.34227
N
β†’β‚™*
N: Type ?u.34227
N
:= ⟨
Prod.snd: {Ξ± : Type ?u.34335} β†’ {Ξ² : Type ?u.34334} β†’ Ξ± Γ— Ξ² β†’ Ξ²
Prod.snd
, fun
_: ?m.34344
_
_: ?m.34347
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.34349} {a : Ξ±}, a = a
rfl
⟩ #align mul_hom.snd
MulHom.snd: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* N
MulHom.snd
#align add_hom.snd
AddHom.snd: (M : Type u_1) β†’ (N : Type u_2) β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ AddHom (M Γ— N) N
AddHom.snd
variable {
M: ?m.34533
M
N: ?m.34536
N
} @[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N], ↑(AddHom.fst M N) = Prod.fst
to_additive
(attr := simp)] theorem
coe_fst: ↑(fst M N) = Prod.fst
coe_fst
: ⇑(
fst: (M : Type ?u.34571) β†’ (N : Type ?u.34570) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* M
fst
M: Type ?u.34551
M
N: Type ?u.34554
N
) =
Prod.fst: {Ξ± : Type ?u.34764} β†’ {Ξ² : Type ?u.34763} β†’ Ξ± Γ— Ξ² β†’ Ξ±
Prod.fst
:=
rfl: βˆ€ {Ξ± : Sort ?u.34819} {a : Ξ±}, a = a
rfl
#align mul_hom.coe_fst
MulHom.coe_fst: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N], ↑(fst M N) = Prod.fst
MulHom.coe_fst
#align add_hom.coe_fst
AddHom.coe_fst: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N], ↑(AddHom.fst M N) = Prod.fst
AddHom.coe_fst
@[
to_additive: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N], ↑(AddHom.snd M N) = Prod.snd
to_additive
(attr := simp)] theorem
coe_snd: ↑(snd M N) = Prod.snd
coe_snd
: ⇑(
snd: (M : Type ?u.34942) β†’ (N : Type ?u.34941) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* N
snd
M: Type ?u.34922
M
N: Type ?u.34925
N
) =
Prod.snd: {Ξ± : Type ?u.35135} β†’ {Ξ² : Type ?u.35134} β†’ Ξ± Γ— Ξ² β†’ Ξ²
Prod.snd
:=
rfl: βˆ€ {Ξ± : Sort ?u.35190} {a : Ξ±}, a = a
rfl
#align mul_hom.coe_snd
MulHom.coe_snd: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Mul M] [inst_1 : Mul N], ↑(snd M N) = Prod.snd
MulHom.coe_snd
#align add_hom.coe_snd
AddHom.coe_snd: βˆ€ {M : Type u_1} {N : Type u_2} [inst : Add M] [inst_1 : Add N], ↑(AddHom.snd M N) = Prod.snd
AddHom.coe_snd
/-- Combine two `MonoidHom`s `f : M β†’β‚™* N`, `g : M β†’β‚™* P` into `f.prod g : M β†’β‚™* (N Γ— P)` given by `(f.prod g) x = (f x, g x)`. -/ @[to_additive
prod: {M : Type u_1} β†’ {N : Type u_2} β†’ {P : Type u_3} β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ [inst_2 : Add P] β†’ AddHom M N β†’ AddHom M P β†’ AddHom M (N Γ— P)
prod
"Combine two `AddMonoidHom`s `f : AddHom M N`, `g : AddHom M P` into `f.prod g : AddHom M (N Γ— P)` given by `(f.prod g) x = (f x, g x)`"] protected def
prod: {M : Type u_1} β†’ {N : Type u_2} β†’ {P : Type u_3} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
(f :
M: Type ?u.35293
M
β†’β‚™*
N: Type ?u.35296
N
) (g :
M: Type ?u.35293
M
β†’β‚™*
P: Type ?u.35299
P
) :
M: Type ?u.35293
M
β†’β‚™*
N: Type ?u.35296
N
Γ—
P: Type ?u.35299
P
where toFun :=
Pi.prod: {I : Type ?u.35402} β†’ {f : I β†’ Type ?u.35401} β†’ {g : I β†’ Type ?u.35400} β†’ ((i : I) β†’ f i) β†’ ((i : I) β†’ g i) β†’ (i : I) β†’ f i Γ— g i
Pi.prod
f g map_mul'
x: ?m.35753
x
y: ?m.35756
y
:=
Prod.ext: βˆ€ {Ξ± : Type ?u.35758} {Ξ² : Type ?u.35759} {p q : Ξ± Γ— Ξ²}, p.fst = q.fst β†’ p.snd = q.snd β†’ p = q
Prod.ext
(f.
map_mul: βˆ€ {M : Type ?u.35769} {N : Type ?u.35770} [inst : Mul M] [inst_1 : Mul N] (f : M β†’β‚™* N) (a b : M), ↑f (a * b) = ↑f a * ↑f b
map_mul
x: ?m.35753
x
y: ?m.35756
y
) (g.
map_mul: βˆ€ {M : Type ?u.35791} {N : Type ?u.35792} [inst : Mul M] [inst_1 : Mul N] (f : M β†’β‚™* N) (a b : M), ↑f (a * b) = ↑f a * ↑f b
map_mul
x: ?m.35753
x
y: ?m.35756
y
) #align mul_hom.prod
MulHom.prod: {M : Type u_1} β†’ {N : Type u_2} β†’ {P : Type u_3} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
MulHom.prod
#align add_hom.prod
AddHom.prod: {M : Type u_1} β†’ {N : Type u_2} β†’ {P : Type u_3} β†’ [inst : Add M] β†’ [inst_1 : Add N] β†’ [inst_2 : Add P] β†’ AddHom M N β†’ AddHom M P β†’ AddHom M (N Γ— P)
AddHom.prod
@[to_additive
coe_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), ↑(AddHom.prod f g) = Pi.prod ↑f ↑g
coe_prod
] theorem
coe_prod: βˆ€ (f : M β†’β‚™* N) (g : M β†’β‚™* P), ↑(MulHom.prod f g) = Pi.prod ↑f ↑g
coe_prod
(f :
M: Type ?u.36210
M
β†’β‚™*
N: Type ?u.36213
N
) (g :
M: Type ?u.36210
M
β†’β‚™*
P: Type ?u.36216
P
) : ⇑(f.
prod: {M : Type ?u.36261} β†’ {N : Type ?u.36260} β†’ {P : Type ?u.36259} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
g) =
Pi.prod: {I : Type ?u.36468} β†’ {f : I β†’ Type ?u.36467} β†’ {g : I β†’ Type ?u.36466} β†’ ((i : I) β†’ f i) β†’ ((i : I) β†’ g i) β†’ (i : I) β†’ f i Γ— g i
Pi.prod
f g :=
rfl: βˆ€ {Ξ± : Sort ?u.36824} {a : Ξ±}, a = a
rfl
#align mul_hom.coe_prod
MulHom.coe_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N) (g : M β†’β‚™* P), ↑(MulHom.prod f g) = Pi.prod ↑f ↑g
MulHom.coe_prod
#align add_hom.coe_prod
AddHom.coe_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), ↑(AddHom.prod f g) = Pi.prod ↑f ↑g
AddHom.coe_prod
@[to_additive (attr := simp)
prod_apply: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P) (x : M), ↑(AddHom.prod f g) x = (↑f x, ↑g x)
prod_apply
] theorem
prod_apply: βˆ€ (f : M β†’β‚™* N) (g : M β†’β‚™* P) (x : M), ↑(MulHom.prod f g) x = (↑f x, ↑g x)
prod_apply
(f :
M: Type ?u.36904
M
β†’β‚™*
N: Type ?u.36907
N
) (g :
M: Type ?u.36904
M
β†’β‚™*
P: Type ?u.36910
P
) (
x: M
x
) : f.
prod: {M : Type ?u.36958} β†’ {N : Type ?u.36957} β†’ {P : Type ?u.36956} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
g
x: ?m.36952
x
= (f
x: ?m.36952
x
, g
x: ?m.36952
x
) :=
rfl: βˆ€ {Ξ± : Sort ?u.37507} {a : Ξ±}, a = a
rfl
#align mul_hom.prod_apply
MulHom.prod_apply: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N) (g : M β†’β‚™* P) (x : M), ↑(MulHom.prod f g) x = (↑f x, ↑g x)
MulHom.prod_apply
#align add_hom.prod_apply
AddHom.prod_apply: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P) (x : M), ↑(AddHom.prod f g) x = (↑f x, ↑g x)
AddHom.prod_apply
@[to_additive (attr := simp)
fst_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), AddHom.comp (AddHom.fst N P) (AddHom.prod f g) = f
fst_comp_prod
] theorem
fst_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N) (g : M β†’β‚™* P), comp (fst N P) (MulHom.prod f g) = f
fst_comp_prod
(f :
M: Type ?u.37662
M
β†’β‚™*
N: Type ?u.37665
N
) (g :
M: Type ?u.37662
M
β†’β‚™*
P: Type ?u.37668
P
) : (
fst: (M : Type ?u.37712) β†’ (N : Type ?u.37711) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* M
fst
N: Type ?u.37665
N
P: Type ?u.37668
P
).
comp: {M : Type ?u.37717} β†’ {N : Type ?u.37716} β†’ {P : Type ?u.37715} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (N β†’β‚™* P) β†’ (M β†’β‚™* N) β†’ M β†’β‚™* P
comp
(f.
prod: {M : Type ?u.37739} β†’ {N : Type ?u.37738} β†’ {P : Type ?u.37737} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
g) = f :=
ext: βˆ€ {M : Type ?u.37824} {N : Type ?u.37825} [inst : Mul M] [inst_1 : Mul N] ⦃f g : M β†’β‚™* N⦄, (βˆ€ (x : M), ↑f x = ↑g x) β†’ f = g
ext
fun
_: ?m.37880
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.37882} {a : Ξ±}, a = a
rfl
#align mul_hom.fst_comp_prod
MulHom.fst_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N) (g : M β†’β‚™* P), comp (fst N P) (MulHom.prod f g) = f
MulHom.fst_comp_prod
#align add_hom.fst_comp_prod
AddHom.fst_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), AddHom.comp (AddHom.fst N P) (AddHom.prod f g) = f
AddHom.fst_comp_prod
@[to_additive (attr := simp)
snd_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), AddHom.comp (AddHom.snd N P) (AddHom.prod f g) = g
snd_comp_prod
] theorem
snd_comp_prod: βˆ€ (f : M β†’β‚™* N) (g : M β†’β‚™* P), comp (snd N P) (MulHom.prod f g) = g
snd_comp_prod
(f :
M: Type ?u.38036
M
β†’β‚™*
N: Type ?u.38039
N
) (g :
M: Type ?u.38036
M
β†’β‚™*
P: Type ?u.38042
P
) : (
snd: (M : Type ?u.38086) β†’ (N : Type ?u.38085) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* N
snd
N: Type ?u.38039
N
P: Type ?u.38042
P
).
comp: {M : Type ?u.38091} β†’ {N : Type ?u.38090} β†’ {P : Type ?u.38089} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (N β†’β‚™* P) β†’ (M β†’β‚™* N) β†’ M β†’β‚™* P
comp
(f.
prod: {M : Type ?u.38113} β†’ {N : Type ?u.38112} β†’ {P : Type ?u.38111} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
g) = g :=
ext: βˆ€ {M : Type ?u.38198} {N : Type ?u.38199} [inst : Mul M] [inst_1 : Mul N] ⦃f g : M β†’β‚™* N⦄, (βˆ€ (x : M), ↑f x = ↑g x) β†’ f = g
ext
fun
_: ?m.38254
_
=>
rfl: βˆ€ {Ξ± : Sort ?u.38256} {a : Ξ±}, a = a
rfl
#align mul_hom.snd_comp_prod
MulHom.snd_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N) (g : M β†’β‚™* P), comp (snd N P) (MulHom.prod f g) = g
MulHom.snd_comp_prod
#align add_hom.snd_comp_prod
AddHom.snd_comp_prod: βˆ€ {M : Type u_1} {N : Type u_2} {P : Type u_3} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M N) (g : AddHom M P), AddHom.comp (AddHom.snd N P) (AddHom.prod f g) = g
AddHom.snd_comp_prod
@[to_additive (attr := simp)
prod_unique: βˆ€ {M : Type u_1} {N : Type u_3} {P : Type u_2} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M (N Γ— P)), AddHom.prod (AddHom.comp (AddHom.fst N P) f) (AddHom.comp (AddHom.snd N P) f) = f
prod_unique
] theorem
prod_unique: βˆ€ (f : M β†’β‚™* N Γ— P), MulHom.prod (comp (fst N P) f) (comp (snd N P) f) = f
prod_unique
(f :
M: Type ?u.38410
M
β†’β‚™*
N: Type ?u.38413
N
Γ—
P: Type ?u.38416
P
) : ((
fst: (M : Type ?u.38470) β†’ (N : Type ?u.38469) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* M
fst
N: Type ?u.38413
N
P: Type ?u.38416
P
).
comp: {M : Type ?u.38483} β†’ {N : Type ?u.38482} β†’ {P : Type ?u.38481} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (N β†’β‚™* P) β†’ (M β†’β‚™* N) β†’ M β†’β‚™* P
comp
f).
prod: {M : Type ?u.38530} β†’ {N : Type ?u.38529} β†’ {P : Type ?u.38528} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (M β†’β‚™* N) β†’ (M β†’β‚™* P) β†’ M β†’β‚™* N Γ— P
prod
((
snd: (M : Type ?u.38550) β†’ (N : Type ?u.38549) β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ M Γ— N β†’β‚™* N
snd
N: Type ?u.38413
N
P: Type ?u.38416
P
).
comp: {M : Type ?u.38555} β†’ {N : Type ?u.38554} β†’ {P : Type ?u.38553} β†’ [inst : Mul M] β†’ [inst_1 : Mul N] β†’ [inst_2 : Mul P] β†’ (N β†’β‚™* P) β†’ (M β†’β‚™* N) β†’ M β†’β‚™* P
comp
f) = f :=
ext: βˆ€ {M : Type ?u.38608} {N : Type ?u.38609} [inst : Mul M] [inst_1 : Mul N] ⦃f g : M β†’β‚™* N⦄, (βˆ€ (x : M), ↑f x = ↑g x) β†’ f = g
ext
fun
x: ?m.38664
x
=>

Goals accomplished! πŸ™
A: Type ?u.38398

B: Type ?u.38401

G: Type ?u.38404

H: Type ?u.38407

M: Type u_1

N: Type u_3

P: Type u_2

inst✝²: Mul M

inst✝¹: Mul N

inst✝: Mul P

f: M β†’β‚™* N Γ— P

x: M


↑(MulHom.prod (comp (fst N P) f) (comp (snd N P) f)) x = ↑f x

Goals accomplished! πŸ™
#align mul_hom.prod_unique
MulHom.prod_unique: βˆ€ {M : Type u_1} {N : Type u_3} {P : Type u_2} [inst : Mul M] [inst_1 : Mul N] [inst_2 : Mul P] (f : M β†’β‚™* N Γ— P), MulHom.prod (comp (fst N P) f) (comp (snd N P) f) = f
MulHom.prod_unique
#align add_hom.prod_unique
AddHom.prod_unique: βˆ€ {M : Type u_1} {N : Type u_3} {P : Type u_2} [inst : Add M] [inst_1 : Add N] [inst_2 : Add P] (f : AddHom M (N Γ— P)), AddHom.prod (AddHom.comp (AddHom.fst N P) f) (AddHom.comp (AddHom.snd N P) f) = f
AddHom.prod_unique
end Prod section Prod_map variable {
M': Type ?u.40314
M'
:
Type _: Type (?u.39705+1)
Type _
} {
N': Type ?u.40317
N'
:
Type _: Type (?u.39708+1)
Type _
} [
Mul: Type ?u.39711 β†’ Type ?u.39711
Mul
M: Type ?u.39696
M
] [
Mul: Type ?u.40649 β†’ Type ?u.40649
Mul
N: Type ?u.39777
N
] [
Mul: Type ?u.41496 β†’ Type ?u.41496
Mul
M': Type ?u.40314
M'
] [
Mul: Type ?u.40329 β†’ Type ?u.40329
Mul
N': Type ?u.40317
N'
] [
Mul: Type ?u.40332 β†’ Type ?u.40332
Mul
P: Type ?u.40311
P
] (