Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Local Open Scope mc_mult_scope. Generalizable Variables G H A B C f g. Section group_props. Context `{IsGroup G}. (** Group inverses are involutive *)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

Involutive negate
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

Involutive negate
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = mon_unit * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G
mon_unit * x = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = mon_unit * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * - x * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G
- - x * - x * x = mon_unit * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * - x * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * (- x * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G
- - x * (- x * x) = - - x * - x * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * (- x * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * mon_unit
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G
- - x * mon_unit = - - x * (- x * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x: G

- - x = - - x * mon_unit
apply symmetry, right_identity. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

IsInjective negate
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

IsInjective negate
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G
E: - x = - y

x = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G
E: - x = - y

- - x = - - y
apply ap, E. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

- mon_unit = mon_unit
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

- mon_unit = mon_unit
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

(fun x : G => - mon_unit = x) mon_unit
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

- mon_unit = - mon_unit * mon_unit
apply symmetry, right_identity. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

forall z : G, LeftCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

forall z : G, LeftCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

x = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

x = mon_unit * y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

x = - z * z * y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

x = - z * (z * y)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

x = - z * (z * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

- z * (z * x) = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

- z * z * x = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: z * x = z * y

mon_unit * x = x
apply left_identity. Defined.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

forall z : G, RightCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G

forall z : G, RightCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

x = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

x * mon_unit = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

x * (z * - z) = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

x * z * - z = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

y * z * - z = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
z, x, y: G
E: x * z = y * z

y = y
reflexivity. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - y * - x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - y * - x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = mon_unit * (- y * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * y) * (- y * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * y * (- y * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * (y * (- y * - x)))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * (y * - y * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * (mon_unit * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * (x * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsGroup G
x, y: G

- (x * y) = - (x * y) * mon_unit
apply symmetry, right_identity. Qed. End group_props. Section abgroup_props.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G

- (x * y) = - x * - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G

- (x * y) = - x * - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G

- (x * y) = - y * - x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G
- y * - x = - x * - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G

- (x * y) = - y * - x
apply negate_sg_op.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Anegate: Negate G
H: IsAbGroup G
x, y: G

- y * - x = - x * - y
apply commutativity. Qed. End abgroup_props. Section groupmor_props. Context `{IsGroup A} `{IsGroup B} {f : A -> B} `{!IsMonoidPreserving f}.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Anegate0: Negate B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f (- x) = - f x
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Anegate0: Negate B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f (- x) = - f x
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Anegate0: Negate B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f x * f (- x) = f x * - f x
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Anegate0: Negate B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f (x * - x) = f x * - f x
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Anegate0: Negate B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f mon_unit = mon_unit
apply preserves_mon_unit. Qed. End groupmor_props. Section from_another_sg. Context `{IsSemiGroup A} `{IsHSet B} `{Bop : SgOp B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y).
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsSemiGroup B
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsSemiGroup B
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsHSet B
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
Associative sg_op
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsHSet B
apply _.
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

Associative sg_op
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
x, y, z: B

f (x * (y * z)) = f (x * y * z)
A: Type
Aop: SgOp A
H: IsSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
x, y, z: B

f x * (f y * f z) = f x * f y * f z
apply associativity. Qed. End from_another_sg. Section from_another_com. Context `{SgOp A} `{!Commutative (A:=A) sg_op} {B} `{Bop : SgOp B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y).
A: Type
H: SgOp A
Commutative0: Commutative sg_op
B: Type
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

Commutative sg_op
A: Type
H: SgOp A
Commutative0: Commutative sg_op
B: Type
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

Commutative sg_op
A: Type
H: SgOp A
Commutative0: Commutative sg_op
B: Type
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
x, y: B

x * y = y * x
A: Type
H: SgOp A
Commutative0: Commutative sg_op
B: Type
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
x, y: B

f (x * y) = f (y * x)
A: Type
H: SgOp A
Commutative0: Commutative sg_op
B: Type
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
x, y: B

f x * f y = f y * f x
apply commutativity. Qed. End from_another_com. Section from_another_com_sg. Context `{IsCommutativeSemiGroup A} `{IsHSet B} `{Bop : SgOp B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y).
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsCommutativeSemiGroup B
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsCommutativeSemiGroup B
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsSemiGroup B
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
Commutative sg_op
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

IsSemiGroup B
apply (projected_sg f);assumption.
A: Type
Aop: SgOp A
H: IsCommutativeSemiGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y

Commutative sg_op
apply (projected_comm f);assumption. Qed. End from_another_com_sg. Section from_another_monoid. Context `{IsMonoid A} `{IsHSet B} `{Bop : SgOp B} `{Bunit : MonUnit B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y) (unit_correct : f mon_unit = mon_unit).
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsSemiGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
LeftIdentity sg_op mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
RightIdentity sg_op mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsSemiGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

forall x y : B, f (x * y) = f x * f y
assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

LeftIdentity sg_op mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
y: B

f (mon_unit * y) = f y
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
y: B

f y = f y
reflexivity.
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

RightIdentity sg_op mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
x: B

f (x * mon_unit) = f x
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
x: B

f x = f x
reflexivity. Qed. End from_another_monoid. Section from_another_com_monoid. Context `{IsCommutativeMonoid A} `{IsHSet B} `{Bop : SgOp B} `{Bunit : MonUnit B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y) (unit_correct : f mon_unit = mon_unit).
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsCommutativeMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsCommutativeMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
Commutative sg_op
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

IsMonoid B
apply (projected_monoid f);assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
H: IsCommutativeMonoid A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit

Commutative sg_op
apply (projected_comm f);assumption. Qed. End from_another_com_monoid. Section from_another_group. Context `{IsGroup A} `{IsHSet B} `{Bop : SgOp B} `{Bunit : MonUnit B} `{Bnegate : Negate B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y) (unit_correct : f mon_unit = mon_unit) (negate_correct : forall x, f (-x) = -f x).
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
LeftInverse sg_op negate mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
RightInverse sg_op negate mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsMonoid B
apply (projected_monoid f);assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

LeftInverse sg_op negate mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
x: B

f (- x * x) = f mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
x: B

mon_unit = mon_unit
apply reflexivity.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

RightInverse sg_op negate mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
x: B

f (x * - x) = f mon_unit
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
x: B

mon_unit = mon_unit
reflexivity. Qed. End from_another_group. Section from_another_ab_group. Context `{IsAbGroup A} `{IsHSet B} `{Bop : SgOp B} `{Bunit : MonUnit B} `{Bnegate : Negate B} (f : B -> A) `{!IsInjective f} (op_correct : forall x y, f (x * y) = f x * f y) (unit_correct : f mon_unit = mon_unit) (negate_correct : forall x, f (-x) = -f x).
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsAbGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsAbGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x
Commutative sg_op
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

IsGroup B
apply (projected_group f);assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Anegate: Negate A
H: IsAbGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Bnegate: Negate B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f mon_unit = mon_unit
negate_correct: forall x : B, f (- x) = - f x

Commutative sg_op
apply (projected_comm f);assumption. Qed. End from_another_ab_group. Section id_mor. Context `{SgOp A} `{MonUnit A}.
A: Type
H: SgOp A
H0: MonUnit A

IsSemiGroupPreserving id
A: Type
H: SgOp A
H0: MonUnit A

IsSemiGroupPreserving id
split. Defined.
A: Type
H: SgOp A
H0: MonUnit A

IsMonoidPreserving id
A: Type
H: SgOp A
H0: MonUnit A

IsMonoidPreserving id
split; split. Defined. End id_mor. Section compose_mor. Context `{SgOp A} `{MonUnit A} `{SgOp B} `{MonUnit B} `{SgOp C} `{MonUnit C} (f : A -> B) (g : B -> C). (** Making these global instances causes typeclass loops. Instead they are declared below as [Hint Extern]s that apply only when the goal has the specified form. *)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C

IsSemiGroupPreserving f -> IsSemiGroupPreserving g -> IsSemiGroupPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C

IsSemiGroupPreserving f -> IsSemiGroupPreserving g -> IsSemiGroupPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A

(g ∘ f) (x * y) = (g ∘ f) x * (g ∘ f) y
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A

g (f (x * y)) = g (f x) * g (f y)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A

f (x * y) = ?Goal
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A
g ?Goal = g (f x) * g (f y)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A

f (x * y) = ?Goal
apply fp.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
fp: IsSemiGroupPreserving f
gp: IsSemiGroupPreserving g
x, y: A

g (f x * f y) = g (f x) * g (f y)
apply gp. Defined.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C

IsMonoidPreserving f -> IsMonoidPreserving g -> IsMonoidPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C

IsMonoidPreserving f -> IsMonoidPreserving g -> IsMonoidPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g

IsSemiGroupPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g
IsUnitPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g

IsSemiGroupPreserving (g ∘ f)
apply _.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g

IsUnitPreserving (g ∘ f)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g

g (f mon_unit) = mon_unit
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
C: Type
H3: SgOp C
H4: MonUnit C
f: A -> B
g: B -> C
X: IsMonoidPreserving f
X0: IsMonoidPreserving g

g (f mon_unit) = g mon_unit
apply ap,preserves_mon_unit. Defined. End compose_mor. Section invert_mor. Context `{SgOp A} `{MonUnit A} `{SgOp B} `{MonUnit B} (f : A -> B).
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B

forall IsEquiv0 : IsEquiv f, IsSemiGroupPreserving f -> IsSemiGroupPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B

forall IsEquiv0 : IsEquiv f, IsSemiGroupPreserving f -> IsSemiGroupPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

f^-1 (x * y) = f^-1 x * f^-1 y
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

f (f^-1 (x * y)) = f (f^-1 x * f^-1 y)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

f (f^-1 x * f^-1 y) = ?Goal1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B
?Goal1 = ?Goal0
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B
?Goal0 = ?Goal
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B
?Goal = f (f^-1 (x * y))
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

f (f^-1 x * f^-1 y) = ?Goal1
apply fp. (* We could use [apply ap2; apply eisretr] here, but it is convenient to have things in terms of ap. *)
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

f (f^-1 x) * f (f^-1 y) = ?Goal0
refine (ap (fun z => z * _) _); apply eisretr.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

x * f (f^-1 y) = ?Goal
refine (ap (fun z => _ * z) _); apply eisretr.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
E: IsEquiv f
fp: IsSemiGroupPreserving f
x, y: B

x * y = f (f^-1 (x * y))
symmetry; apply eisretr. Defined.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B

forall IsEquiv0 : IsEquiv f, IsMonoidPreserving f -> IsMonoidPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B

forall IsEquiv0 : IsEquiv f, IsMonoidPreserving f -> IsMonoidPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

IsSemiGroupPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f
IsUnitPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

IsSemiGroupPreserving f^-1
apply _.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

IsUnitPreserving f^-1
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

f (f^-1 mon_unit) = f mon_unit
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

f (f^-1 mon_unit) = ?Goal
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f
?Goal = f mon_unit
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

f (f^-1 mon_unit) = ?Goal
apply eisretr.
A: Type
H: SgOp A
H0: MonUnit A
B: Type
H1: SgOp B
H2: MonUnit B
f: A -> B
IsEquiv0: IsEquiv f
X: IsMonoidPreserving f

mon_unit = f mon_unit
symmetry; apply preserves_mon_unit. Defined. End invert_mor. #[export] Hint Extern 4 (IsSemiGroupPreserving (_ ∘ _)) => class_apply @compose_sg_morphism : typeclass_instances. #[export] Hint Extern 4 (IsMonoidPreserving (_ ∘ _)) => class_apply @compose_monoid_morphism : typeclass_instances. #[export] Hint Extern 4 (IsSemiGroupPreserving (_ o _)) => class_apply @compose_sg_morphism : typeclass_instances. #[export] Hint Extern 4 (IsMonoidPreserving (_ o _)) => class_apply @compose_monoid_morphism : typeclass_instances. #[export] Hint Extern 4 (IsSemiGroupPreserving (_^-1)) => class_apply @invert_sg_morphism : typeclass_instances. #[export] Hint Extern 4 (IsMonoidPreserving (_^-1)) => class_apply @invert_monoid_morphism : typeclass_instances.