Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.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
Ainv: Inverse G
H: IsGroup G

Involutive inv
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

Involutive inv
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = 1 * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G
1 * x = x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = 1 * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * x^ * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G
(x^)^ * x^ * x = 1 * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * x^ * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * (x^ * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G
(x^)^ * (x^ * x) = (x^)^ * x^ * x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * (x^ * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * 1
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G
(x^)^ * 1 = (x^)^ * (x^ * x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x: G

(x^)^ = (x^)^ * 1
apply symmetry, right_identity. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

IsInjective inv
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

IsInjective inv
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G
E: x^ = y^

x = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G
E: x^ = y^

(x^)^ = (y^)^
apply ap, E. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

1^ = 1
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

1^ = 1
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

(fun x : G => 1^ = x) 1
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

1^ = 1^ * 1
apply symmetry, right_identity. Qed.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

forall z : G, LeftCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

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

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

x = 1 * y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse G
H: IsGroup G
z, x, y: G
E: z * x = z * y

1 * x = x
apply left_identity. Defined.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

forall z : G, RightCancellation sg_op z
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G

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

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

x * 1 = y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse 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
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = y^ * x^
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = y^ * x^
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = 1 * (- y * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * y) * (- y * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * y * (- y * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * (y * (- y * - x)))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * (y * - y * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * (1 * - x))
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * (x * - x)
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsGroup G
x, y: G

(x * y)^ = (x * y)^ * 1
apply symmetry, right_identity. Qed. End group_props. Section abgroup_props. Local Open Scope mc_add_scope.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G

(x * y)^ = x^ - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G

(x * y)^ = x^ - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G

(x * y)^ = y^ - x
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G
y^ - x = x^ - y
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G

(x * y)^ = y^ - x
rapply inverse_sg_op.
G: Type
Aop: SgOp G
Aunit: MonUnit G
Ainv: Inverse G
H: IsAbGroup G
x, y: G

y^ - x = x^ - y
apply commutativity. Qed. Local Close Scope mc_add_scope. End abgroup_props. Section groupmor_props. Context `{IsGroup A} `{IsGroup B} {f : A -> B} `{!IsMonoidPreserving f}.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Ainv0: Inverse B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f x^ = (f x)^
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Ainv0: Inverse B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f x^ = (f x)^
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Ainv0: Inverse 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
Ainv: Inverse A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Ainv0: Inverse 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
Ainv: Inverse A
H: IsGroup A
B: Type
Aop0: SgOp B
Aunit0: MonUnit B
Ainv0: Inverse B
H0: IsGroup B
f: A -> B
IsMonoidPreserving0: IsMonoidPreserving f
x: A

f 1 = 1
exact 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
exact _.
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 1 = 1

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 1 = 1

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 1 = 1

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 1 = 1
LeftIdentity sg_op 1
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 1 = 1
RightIdentity sg_op 1
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 1 = 1

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 1 = 1

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 1 = 1

LeftIdentity sg_op 1
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 1 = 1
y: B

f (1 * 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 1 = 1
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 1 = 1

RightIdentity sg_op 1
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 1 = 1
x: B

f (x * 1) = 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 1 = 1
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 1 = 1

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 1 = 1

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 1 = 1

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 1 = 1
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 1 = 1

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 1 = 1

Commutative sg_op
apply (projected_comm f);assumption. Qed. End from_another_com_monoid. Section from_another_group. Context `{isg : IsGroup A} `{IsHSet B} `{Bop : SgOp B} `{Bunit : MonUnit B} `{Binv : Inverse 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) (inverse_correct : forall x, f x^ = (f x)^).
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

IsMonoid B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
LeftInverse sg_op inv 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
RightInverse sg_op inv 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

IsMonoid B
apply (projected_monoid f);assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

LeftInverse sg_op inv 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
x: B

f (x^ * x) = f 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
x: B

1 = 1
apply reflexivity.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^

RightInverse sg_op inv 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
x: B

f (x * x^) = f 1
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse A
isg: IsGroup A
B: Type
IsHSet0: IsHSet B
Bop: SgOp B
Bunit: MonUnit B
Binv: Inverse B
f: B -> A
IsInjective0: IsInjective f
op_correct: forall x y : B, f (x * y) = f x * f y
unit_correct: f 1 = 1
inverse_correct: forall x : B, f x^ = (f x)^
x: B

1 = 1
reflexivity. Qed. End from_another_group. Section from_another_ab_group. Local Open Scope mc_add_scope. 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 0 = 0) (negate_correct : forall x, f (-x) = -f x).
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^

IsAbGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^

IsAbGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^

IsGroup B
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^
Commutative Bop
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^

IsGroup B
apply (projected_group f (isg:=abgroup_group _)); assumption.
A: Type
Aop: SgOp A
Aunit: MonUnit A
Ainv: Inverse 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 1 = 1
negate_correct: forall x : B, f x^ = (f x)^

Commutative Bop
apply (projected_comm f); assumption. Qed. Local Close Scope mc_add_scope. End from_another_ab_group.