Built with Alectryon. 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.
Require Import Basics.Overture Basics.Tactics Basics.Equivalences Basics.Trunc.Require Import Basics.Overture Basics.Tactics Basics.Equivalences Basics.Trunc.
Require Import Types.Sigma Types.Forall Types.Prod.
Require Import WildCat.Core WildCat.Induced WildCat.Equiv WildCat.Universe
  WildCat.Products.
Require Import (notations) Classes.interfaces.canonical_names.
Require Export (hints) Classes.interfaces.abstract_algebra.
Require Export (hints) Classes.interfaces.canonical_names.
Require Export Classes.interfaces.canonical_names (SgOp, sg_op,
    MonUnit, mon_unit, LeftIdentity, left_identity, RightIdentity, right_identity,
    Associative, simple_associativity, associativity,
    LeftInverse, left_inverse, RightInverse, right_inverse, Commutative, commutativity).
Export canonical_names.BinOpNotations.
Require Export Classes.interfaces.abstract_algebra (IsSemiGroup(..), sg_set, sg_ass,
    IsMonoid(..), monoid_left_id, monoid_right_id, monoid_semigroup,
    IsMonoidPreserving(..), monmor_unitmor, monmor_sgmor,
    IsSemiGroupPreserving, preserves_sg_op, IsUnitPreserving, preserves_mon_unit).

Local Set Polymorphic Inductive Cumulativity.
Local Set Universe Minimization ToSet.

Local Open Scope mc_mult_scope.

(** * Monoids *)

(** ** Definition *)

Record Monoid := {
  monoid_type :> Type;
  monoid_sgop :: SgOp monoid_type;
  monoid_unit :: MonUnit monoid_type;
  monoid_ismonoid :: IsMonoid monoid_type;
}.

Arguments monoid_sgop {_}.
Arguments monoid_unit {_}.
Arguments monoid_ismonoid {_}.
Global Opaque monoid_ismonoid.

Definition issig_monoid : _ <~> Monoid := ltac:(issig).

Section MonoidLaws.
  Context {M : Monoid} (x y z : M).  
  Definition mnd_assoc := associativity x y z.
  Definition mnd_unit_l := left_identity x.
  Definition mnd_unit_r := right_identity x.
End MonoidLaws.

(** ** Monoid homomorphisms *)

Record MonoidHomomorphism (M N : Monoid) := {
  mnd_homo_map :> monoid_type M -> monoid_type N;
  ismonoidpreserving_mnd_homo :: IsMonoidPreserving mnd_homo_map;
}.

Arguments mnd_homo_map {M N}.
Arguments Build_MonoidHomomorphism {M N} _ _.
Arguments ismonoidpreserving_mnd_homo {M N} f : rename.

Definition issig_MonoidHomomorphism (M N : Monoid)
  : _ <~> MonoidHomomorphism M N
  := ltac:(issig).

(** ** Basics properties of monoid homomorphisms *)

Definition mnd_homo_op {M N : Monoid} (f : MonoidHomomorphism M N)
  : forall (x y : M), f (x * y) = f x * f y
  := monmor_sgmor. 

Definition mnd_homo_unit {M N : Monoid} (f : MonoidHomomorphism M N)
  : f mon_unit = mon_unit
  := monmor_unitmor.

H: Funext
M, N: Monoid
f, g: MonoidHomomorphism M N

f == g <~> f = g
H: Funext
M, N: Monoid
f, g: MonoidHomomorphism M N

f == g <~> f = g
H: Funext
M, N: Monoid
f, g: MonoidHomomorphism M N

f == g <~> (issig_MonoidHomomorphism M N)^-1 f = (issig_MonoidHomomorphism M N)^-1 g
H: Funext
M, N: Monoid
f, g: MonoidHomomorphism M N

f == g <~> ((issig_MonoidHomomorphism M N)^-1 f).1 = ((issig_MonoidHomomorphism M N)^-1 g).1
apply equiv_path_forall. Defined.
H: Funext
M, N: Monoid

IsHSet (MonoidHomomorphism M N)
H: Funext
M, N: Monoid

IsHSet (MonoidHomomorphism M N)
H: Funext
M, N: Monoid

is_mere_relation (MonoidHomomorphism M N) paths
intros f g; apply (istrunc_equiv_istrunc _ equiv_path_monoidhomomorphism). Defined. Definition mnd_homo_id {M : Monoid} : MonoidHomomorphism M M := Build_MonoidHomomorphism idmap _. Definition mnd_homo_compose {M N P : Monoid} : MonoidHomomorphism N P -> MonoidHomomorphism M N -> MonoidHomomorphism M P := fun f g => Build_MonoidHomomorphism (f o g) _. (** ** Monoid Isomorphisms *) Record MonoidIsomorphism (M N : Monoid) := { mnd_iso_homo :> MonoidHomomorphism M N; isequiv_mnd_iso :: IsEquiv mnd_iso_homo; }.
M, N: Monoid
f: M <~> N
h: IsMonoidPreserving f

MonoidHomomorphism M N
M, N: Monoid
f: M <~> N
h: IsMonoidPreserving f

MonoidHomomorphism M N
M, N: Monoid
f: M <~> N
h: IsMonoidPreserving f

MonoidHomomorphism M N
M, N: Monoid
f: M <~> N
h: IsMonoidPreserving f
IsEquiv ?mnd_iso_homo
M, N: Monoid
f: M <~> N
h: IsMonoidPreserving f

IsEquiv {| mnd_homo_map := f; ismonoidpreserving_mnd_homo := h |}
exact _. Defined. Definition issig_MonoidIsomorphism (M N : Monoid) : _ <~> MonoidIsomorphism M N := ltac:(issig). Coercion equiv_mnd_iso {M N : Monoid} : MonoidIsomorphism M N -> M <~> N := fun f => Build_Equiv M N f _. Definition mnd_iso_id {M : Monoid} : MonoidIsomorphism M M := Build_MonoidIsomorphism _ _ mnd_homo_id _. Definition mnd_iso_compose {M N P : Monoid} : MonoidIsomorphism N P -> MonoidIsomorphism M N -> MonoidIsomorphism M P := fun g f => Build_MonoidIsomorphism _ _ (mnd_homo_compose g f) _. Definition mnd_iso_inverse {M N : Monoid} : MonoidIsomorphism M N -> MonoidIsomorphism N M := fun f => Build_MonoidIsomorphism _ _ (Build_MonoidHomomorphism f^-1 _) _. Instance reflexive_monoidisomorphism : Reflexive MonoidIsomorphism := fun M => mnd_iso_id. Instance symmetric_monoidisomorphism : Symmetric MonoidIsomorphism := fun M N => mnd_iso_inverse. Instance transitive_monoidisomorphism : Transitive MonoidIsomorphism := fun M N P f g => mnd_iso_compose g f. (** ** The category of monoids *) Instance isgraph_monoid : IsGraph Monoid := Build_IsGraph Monoid MonoidHomomorphism. Instance is01cat_monoid : Is01Cat Monoid := Build_Is01Cat Monoid _ (@mnd_homo_id) (@mnd_homo_compose). Local Notation mnd_homo_map' M N := (@mnd_homo_map M N : _ -> (monoid_type M $-> _)). Instance is2graph_monoid : Is2Graph Monoid := fun M N => isgraph_induced (mnd_homo_map' M N). Instance isgraph_monoidhomomorphism {M N : Monoid} : IsGraph (M $-> N) := isgraph_induced (mnd_homo_map' M N). Instance is01cat_monoidhomomorphism {M N : Monoid} : Is01Cat (M $-> N) := is01cat_induced (mnd_homo_map' M N). Instance is0gpd_monoidhomomorphism {M N : Monoid} : Is0Gpd (M $-> N) := is0gpd_induced (mnd_homo_map' M N).
M, N, P: Monoid
h: N $-> P

Is0Functor (cat_postcomp M h)
M, N, P: Monoid
h: N $-> P

Is0Functor (cat_postcomp M h)
M, N, P: Monoid
h: N $-> P

forall a b : M $-> N, (a $-> b) -> cat_postcomp M h a $-> cat_postcomp M h b
intros ? ? p a; exact (ap h (p a)). Defined.
M, N, P: Monoid
h: M $-> N

Is0Functor (cat_precomp P h)
M, N, P: Monoid
h: M $-> N

Is0Functor (cat_precomp P h)
M, N, P: Monoid
h: M $-> N

forall a b : N $-> P, (a $-> b) -> cat_precomp P h a $-> cat_precomp P h b
intros ? ? p; exact (p o h). Defined.

Is1Cat Monoid

Is1Cat Monoid
by rapply Build_Is1Cat. Defined.

HasEquivs Monoid

HasEquivs Monoid

Monoid -> Monoid -> Type

forall a b : Monoid, (a $-> b) -> Type

forall a b : Monoid, ?CatEquiv' a b -> a $-> b

forall (a b : Monoid) (f : ?CatEquiv' a b), ?CatIsEquiv' a b (?cate_fun' a b f)

forall (a b : Monoid) (f : a $-> b), ?CatIsEquiv' a b f -> ?CatEquiv' a b

forall (a b : Monoid) (f : a $-> b) (fe : ?CatIsEquiv' a b f), ?cate_fun' a b (?cate_buildequiv' a b f fe) $== f

forall a b : Monoid, ?CatEquiv' a b -> b $-> a

forall (a b : Monoid) (f : ?CatEquiv' a b), ?cate_inv' a b f $o ?cate_fun' a b f $== Id a

forall (a b : Monoid) (f : ?CatEquiv' a b), ?cate_fun' a b f $o ?cate_inv' a b f $== Id b

forall (a b : Monoid) (f : a $-> b) (g : b $-> a), f $o g $== Id b -> g $o f $== Id a -> ?CatIsEquiv' a b f

Monoid -> Monoid -> Type
exact MonoidIsomorphism.

forall a b : Monoid, (a $-> b) -> Type
exact (fun M N f => IsEquiv f).

forall a b : Monoid, MonoidIsomorphism a b -> a $-> b
intros M N f; exact f.

forall (a b : Monoid) (f : MonoidIsomorphism a b), (fun (M N : Monoid) (f0 : M $-> N) => IsEquiv f0) a b ((fun (M N : Monoid) (f0 : MonoidIsomorphism M N) => mnd_iso_homo M N f0) a b f)
cbn; exact _.

forall (a b : Monoid) (f : a $-> b), (fun (M N : Monoid) (f0 : M $-> N) => IsEquiv f0) a b f -> MonoidIsomorphism a b
exact Build_MonoidIsomorphism.

forall (a b : Monoid) (f : a $-> b) (fe : (fun (M N : Monoid) (f0 : M $-> N) => IsEquiv f0) a b f), (fun (M N : Monoid) (f0 : MonoidIsomorphism M N) => mnd_iso_homo M N f0) a b {| mnd_iso_homo := f; isequiv_mnd_iso := fe |} $== f
reflexivity.

forall a b : Monoid, MonoidIsomorphism a b -> b $-> a
intros M N; exact mnd_iso_inverse.

forall (a b : Monoid) (f : MonoidIsomorphism a b), (fun (M N : Monoid) (x : MonoidIsomorphism M N) => mnd_iso_homo N M (mnd_iso_inverse x)) a b f $o (fun (M N : Monoid) (f0 : MonoidIsomorphism M N) => mnd_iso_homo M N f0) a b f $== Id a
intros ????; apply eissect.

forall (a b : Monoid) (f : MonoidIsomorphism a b), (fun (M N : Monoid) (f0 : MonoidIsomorphism M N) => mnd_iso_homo M N f0) a b f $o (fun (M N : Monoid) (x : MonoidIsomorphism M N) => mnd_iso_homo N M (mnd_iso_inverse x)) a b f $== Id b
intros ????; apply eisretr.

forall (a b : Monoid) (f : a $-> b) (g : b $-> a), f $o g $== Id b -> g $o f $== Id a -> (fun (M N : Monoid) (f0 : M $-> N) => IsEquiv f0) a b f
intros M N; exact isequiv_adjointify. Defined. Instance is0functor_monoid_type : Is0Functor monoid_type := Build_Is0Functor monoid_type (@mnd_homo_map).

Is1Functor monoid_type

Is1Functor monoid_type
by apply Build_Is1Functor. Defined. (** ** Direct product of monoids *)

Monoid -> Monoid -> Monoid

Monoid -> Monoid -> Monoid
M, N: Monoid

Monoid
M, N: Monoid

SgOp (M * N)
M, N: Monoid
MonUnit (M * N)
M, N: Monoid
IsMonoid (M * N)
M, N: Monoid

SgOp (M * N)
M, N: Monoid
MonUnit (M * N)
M, N: Monoid
IsHSet (M * N)
M, N: Monoid
Associative sg_op
M, N: Monoid
LeftIdentity sg_op 1
M, N: Monoid
RightIdentity sg_op 1
M, N: Monoid

SgOp (M * N)
M, N: Monoid
m1: M
n1: N
m2: M
n2: N

M * N
exact (m1 * m2, n1 * n2).
M, N: Monoid

MonUnit (M * N)
exact (mon_unit, mon_unit).
M, N: Monoid

IsHSet (M * N)
exact _.
M, N: Monoid

Associative sg_op
intros x y z; snapply path_prod; napply mnd_assoc.
M, N: Monoid

LeftIdentity sg_op 1
intros x; snapply path_prod; napply mnd_unit_l.
M, N: Monoid

RightIdentity sg_op 1
intros x; snapply path_prod; napply mnd_unit_r. Defined.
M, N: Monoid

MonoidHomomorphism (mnd_prod M N) M
M, N: Monoid

MonoidHomomorphism (mnd_prod M N) M
M, N: Monoid

mnd_prod M N -> M
M, N: Monoid
IsMonoidPreserving ?mnd_homo_map
M, N: Monoid

IsMonoidPreserving fst
split; hnf; reflexivity. Defined.
M, N: Monoid

MonoidHomomorphism (mnd_prod M N) N
M, N: Monoid

MonoidHomomorphism (mnd_prod M N) N
M, N: Monoid

mnd_prod M N -> N
M, N: Monoid
IsMonoidPreserving ?mnd_homo_map
M, N: Monoid

IsMonoidPreserving snd
split; hnf; reflexivity. Defined.
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

MonoidHomomorphism P (mnd_prod M N)
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

MonoidHomomorphism P (mnd_prod M N)
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

P -> mnd_prod M N
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N
IsMonoidPreserving ?mnd_homo_map
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

P -> mnd_prod M N
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N
IsSemiGroupPreserving ?mnd_homo_map
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N
IsUnitPreserving ?mnd_homo_map
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

P -> mnd_prod M N
exact (fun x => (f x, g x)).
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

IsSemiGroupPreserving (fun x : P => (f x, g x))
intros x y; snapply path_prod; napply mnd_homo_op.
M, N, P: Monoid
f: MonoidHomomorphism P M
g: MonoidHomomorphism P N

IsUnitPreserving (fun x : P => (f x, g x))
snapply path_prod; napply mnd_homo_unit. Defined.

HasBinaryProducts Monoid

HasBinaryProducts Monoid
M, N: Monoid

BinaryProduct M N
M, N: Monoid

Monoid
M, N: Monoid
?cat_binprod' $-> M
M, N: Monoid
?cat_binprod' $-> N
M, N: Monoid
forall z : Monoid, (z $-> M) -> (z $-> N) -> z $-> ?cat_binprod'
M, N: Monoid
forall (z : Monoid) (f : z $-> M) (g : z $-> N), ?cat_pr1 $o ?cat_binprod_corec z f g $== f
M, N: Monoid
forall (z : Monoid) (f : z $-> M) (g : z $-> N), ?cat_pr2 $o ?cat_binprod_corec z f g $== g
M, N: Monoid
forall (z : Monoid) (f g : z $-> ?cat_binprod'), ?cat_pr1 $o f $== ?cat_pr1 $o g -> ?cat_pr2 $o f $== ?cat_pr2 $o g -> f $== g
M, N: Monoid

Monoid
exact (mnd_prod M N).
M, N: Monoid

mnd_prod M N $-> M
exact mnd_prod_pr1.
M, N: Monoid

mnd_prod M N $-> N
exact mnd_prod_pr2.
M, N: Monoid

forall z : Monoid, (z $-> M) -> (z $-> N) -> z $-> mnd_prod M N
intros P; exact mnd_prod_corec.
M, N: Monoid

forall (z : Monoid) (f : z $-> M) (g : z $-> N), mnd_prod_pr1 $o (fun P : Monoid => mnd_prod_corec) z f g $== f
intros P f g; exact (Id _).
M, N: Monoid

forall (z : Monoid) (f : z $-> M) (g : z $-> N), mnd_prod_pr2 $o (fun P : Monoid => mnd_prod_corec) z f g $== g
intros P f g; exact (Id _).
M, N: Monoid

forall (z : Monoid) (f g : z $-> mnd_prod M N), mnd_prod_pr1 $o f $== mnd_prod_pr1 $o g -> mnd_prod_pr2 $o f $== mnd_prod_pr2 $o g -> f $== g
intros P f g p q a; exact (path_prod' (p a) (q a)). Defined.