forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDiscrete.lean
More file actions
108 lines (83 loc) · 4.05 KB
/
Discrete.lean
File metadata and controls
108 lines (83 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/-
Copyright (c) 2020 Kim Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Kim Morrison
-/
module
public import Mathlib.Algebra.Group.Hom.Defs
public import Mathlib.CategoryTheory.Discrete.Basic
public import Mathlib.CategoryTheory.Monoidal.NaturalTransformation
/-!
# Monoids as discrete monoidal categories
The discrete category on a monoid is a monoidal category.
Multiplicative morphisms induce monoidal functors.
-/
@[expose] public section
universe u u'
open CategoryTheory Discrete MonoidalCategory
variable (M : Type u) [Monoid M]
namespace CategoryTheory
@[to_additive (attr := simps tensorObj_as leftUnitor rightUnitor associator) Discrete.addMonoidal]
instance Discrete.monoidal : MonoidalCategory (Discrete M) where
tensorUnit := Discrete.mk 1
tensorObj X Y := Discrete.mk (X.as * Y.as)
whiskerLeft X _ _ f := eqToHom (by rw [eq_of_hom f])
whiskerRight f X := eqToHom (by rw [eq_of_hom f])
tensorHom f g := eqToHom (by rw [eq_of_hom f, eq_of_hom g])
leftUnitor X := Discrete.eqToIso (one_mul X.as)
rightUnitor X := Discrete.eqToIso (mul_one X.as)
associator _ _ _ := Discrete.eqToIso (mul_assoc _ _ _)
@[to_additive (attr := simp) Discrete.addMonoidal_tensorUnit_as]
lemma Discrete.monoidal_tensorUnit_as : (𝟙_ (Discrete M)).as = 1 := rfl
variable {M} {N : Type u'} [Monoid N]
/-- A multiplicative morphism between monoids gives a monoidal functor between the corresponding
discrete monoidal categories.
-/
@[to_additive Discrete.addMonoidalFunctor]
def Discrete.monoidalFunctor (F : M →* N) : Discrete M ⥤ Discrete N :=
Discrete.functor (fun X ↦ Discrete.mk (F X))
@[to_additive (attr := simp) Discrete.addMonoidalFunctor_obj]
lemma Discrete.monoidalFunctor_obj (F : M →* N) (m : M) :
(Discrete.monoidalFunctor F).obj (Discrete.mk m) = Discrete.mk (F m) := rfl
@[to_additive Discrete.addMonoidalFunctorMonoidal]
instance Discrete.monoidalFunctorMonoidal (F : M →* N) :
(Discrete.monoidalFunctor F).Monoidal :=
Functor.CoreMonoidal.toMonoidal
{ εIso := Discrete.eqToIso F.map_one.symm
μIso := fun m₁ m₂ ↦ Discrete.eqToIso (F.map_mul _ _).symm }
open Functor.LaxMonoidal Functor.OplaxMonoidal
@[to_additive Discrete.addMonoidalFunctor_ε]
lemma Discrete.monoidalFunctor_ε (F : M →* N) :
ε (monoidalFunctor F) = Discrete.eqToHom F.map_one.symm := rfl
@[to_additive Discrete.addMonoidalFunctor_η]
lemma Discrete.monoidalFunctor_η (F : M →* N) :
η (monoidalFunctor F) = Discrete.eqToHom F.map_one := rfl
@[to_additive Discrete.addMonoidalFunctor_μ]
lemma Discrete.monoidalFunctor_μ (F : M →* N) (m₁ m₂ : Discrete M) :
μ (monoidalFunctor F) m₁ m₂ = Discrete.eqToHom (F.map_mul _ _).symm := rfl
@[to_additive Discrete.addMonoidalFunctor_δ]
lemma Discrete.monoidalFunctor_δ (F : M →* N) (m₁ m₂ : Discrete M) :
δ (monoidalFunctor F) m₁ m₂ = Discrete.eqToHom (F.map_mul _ _) := rfl
/-- An additive morphism between add_monoids gives a
monoidal functor between the corresponding discrete monoidal categories. -/
add_decl_doc Discrete.addMonoidalFunctor
variable {K : Type u} [Monoid K]
/-- The monoidal natural isomorphism corresponding to composing two multiplicative morphisms.
-/
@[to_additive Discrete.addMonoidalFunctorComp
/-- The monoidal natural isomorphism corresponding to
composing two additive morphisms. -/]
def Discrete.monoidalFunctorComp (F : M →* N) (G : N →* K) :
Discrete.monoidalFunctor F ⋙ Discrete.monoidalFunctor G ≅
Discrete.monoidalFunctor (G.comp F) := Iso.refl _
set_option backward.isDefEq.respectTransparency false in
@[to_additive Discrete.addMonoidalFunctorComp_isMonoidal]
instance Discrete.monoidalFunctorComp_isMonoidal (F : M →* N) (G : N →* K) :
NatTrans.IsMonoidal (Discrete.monoidalFunctorComp F G).hom where
unit := by
dsimp only [comp_ε, monoidalFunctorComp, Iso.refl, Discrete.monoidalFunctor_ε]
simp [eqToHom_map]
tensor _ _ := by
dsimp only [comp_μ, monoidalFunctorComp, Iso.refl, Discrete.monoidalFunctor_μ]
simp [eqToHom_map]
end CategoryTheory