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]
LocalOpen Scope mc_mult_scope.Generalizable VariablesG H A B C f g.Sectiongroup_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
applysymmetry, 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
(funx : 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
applysymmetry, right_identity.Qed.
G: Type Aop: SgOp G Aunit: MonUnit G Anegate: Negate G H: IsGroup G
forallz : G, LeftCancellation sg_op z
G: Type Aop: SgOp G Aunit: MonUnit G Anegate: Negate G H: IsGroup G
forallz : 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
forallz : G, RightCancellation sg_op z
G: Type Aop: SgOp G Aunit: MonUnit G Anegate: Negate G H: IsGroup G
forallz : 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
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.Endgroupmor_props.Sectionfrom_another_sg.Context
`{IsSemiGroup A} `{IsHSet B}
`{Bop : SgOp B} (f : B -> A) `{!IsInjective f}
(op_correct : forallxy, 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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.Endfrom_another_sg.Sectionfrom_another_com.Context `{SgOp A} `{!Commutative (A:=A) sg_op} {B}
`{Bop : SgOp B} (f : B -> A) `{!IsInjective f}
(op_correct : forallxy, 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : B, f (x * y) = f x * f y x, y: B
f x * f y = f y * f x
apply commutativity.Qed.Endfrom_another_com.Sectionfrom_another_com_sg.Context
`{IsCommutativeSemiGroup A} `{IsHSet B}
`{Bop : SgOp B} (f : B -> A) `{!IsInjective f}
(op_correct : forallxy, 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : B, f (x * y) = f x * f y
Commutative sg_op
apply (projected_comm f);assumption.Qed.Endfrom_another_com_sg.Sectionfrom_another_monoid.Context `{IsMonoid A} `{IsHSet B}
`{Bop : SgOp B} `{Bunit : MonUnit B} (f : B -> A) `{!IsInjective f}
(op_correct : forallxy, 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit
forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit x: B
f x = f x
reflexivity.Qed.Endfrom_another_monoid.Sectionfrom_another_com_monoid.Context
`{IsCommutativeMonoid A} `{IsHSet B}
`{Bop : SgOp B} `{Bunit : MonUnit B} (f : B -> A) `{!IsInjective f}
(op_correct : forallxy, 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit
Commutative sg_op
apply (projected_comm f);assumption.Qed.Endfrom_another_com_monoid.Sectionfrom_another_group.Context
`{IsGroup A} `{IsHSet B}
`{Bop : SgOp B} `{Bunit : MonUnit B} `{Bnegate : Negate B}
(f : B -> A) `{!IsInjective f}
(op_correct : forallxy, f (x * y) = f x * f y)
(unit_correct : f mon_unit = mon_unit)
(negate_correct : forallx, 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : B, f (- x) = - f x x: B
mon_unit = mon_unit
applyreflexivity.
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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : B, f (- x) = - f x x: B
mon_unit = mon_unit
reflexivity.Qed.Endfrom_another_group.Sectionfrom_another_ab_group.Context `{IsAbGroup A} `{IsHSet B}
`{Bop : SgOp B} `{Bunit : MonUnit B} `{Bnegate : Negate B}
(f : B -> A) `{!IsInjective f}
(op_correct : forallxy, f (x * y) = f x * f y)
(unit_correct : f mon_unit = mon_unit)
(negate_correct : forallx, 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : 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: forallxy : B, f (x * y) = f x * f y unit_correct: f mon_unit = mon_unit negate_correct: forallx : B, f (- x) = - f x
split; split.Defined.Endid_mor.Sectioncompose_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