Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit b8b8bf3

Browse files
committed
refactor(category_theory/monoidal): prove coherence lemmas by coherence (#13406)
Now that we have a basic monoidal coherence tactic, we can replace some boring proofs of particular coherence lemmas with `by coherence`. I've also simply deleted a few lemmas which are not actually used elsewhere in mathlib, and can be proved `by coherence`. Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
1 parent 92ca136 commit b8b8bf3

5 files changed

Lines changed: 105 additions & 122 deletions

File tree

src/category_theory/monoidal/Mon_.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Scott Morrison
55
-/
66
import category_theory.monoidal.braided
77
import category_theory.monoidal.discrete
8+
import category_theory.monoidal.coherence_lemmas
89
import category_theory.limits.shapes.terminal
910
import algebra.punit_instances
1011

src/category_theory/monoidal/braided.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Copyright (c) 2020 Scott Morrison. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Scott Morrison
55
-/
6-
import category_theory.monoidal.coherence
6+
import category_theory.monoidal.coherence_lemmas
77
import category_theory.monoidal.natural_transformation
88
import category_theory.monoidal.discrete
99

src/category_theory/monoidal/category.lean

Lines changed: 24 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -160,22 +160,6 @@ by { ext, simp [←tensor_comp], }
160160

161161
variables {U V W X Y Z : C}
162162

163-
-- When `rewrite_search` lands, add @[search] attributes to
164-
165-
-- monoidal_category.tensor_id monoidal_category.tensor_comp monoidal_category.associator_naturality
166-
-- monoidal_category.left_unitor_naturality monoidal_category.right_unitor_naturality
167-
-- monoidal_category.pentagon monoidal_category.triangle
168-
169-
-- tensor_comp_id tensor_id_comp comp_id_tensor_tensor_id
170-
-- triangle_assoc_comp_left triangle_assoc_comp_right
171-
-- triangle_assoc_comp_left_inv triangle_assoc_comp_right_inv
172-
-- left_unitor_tensor left_unitor_tensor_inv
173-
-- right_unitor_tensor right_unitor_tensor_inv
174-
-- pentagon_inv
175-
-- associator_inv_naturality
176-
-- left_unitor_inv_naturality
177-
-- right_unitor_inv_naturality
178-
179163
lemma tensor_dite {P : Prop} [decidable P]
180164
{W X Y Z : C} (f : W ⟶ X) (g : P → (Y ⟶ Z)) (g' : ¬P → (Y ⟶ Z)) :
181165
f ⊗ (if h : P then g h else g' h) = if h : P then f ⊗ g h else f ⊗ g' h :=
@@ -240,28 +224,15 @@ by { rw [←cancel_mono (λ_ Y).hom, left_unitor_naturality, left_unitor_natural
240224
(f ⊗ (𝟙 (𝟙_ C)) = g ⊗ (𝟙 (𝟙_ C))) ↔ (f = g) :=
241225
by { rw [←cancel_mono (ρ_ Y).hom, right_unitor_naturality, right_unitor_naturality], simp }
242226

243-
-- See Proposition 2.2.4 of <http://www-math.mit.edu/~etingof/egnobookfinal.pdf>
244-
@[reassoc]
245-
lemma left_unitor_tensor' (X Y : C) :
246-
((α_ (𝟙_ C) X Y).hom) ≫ ((λ_ (X ⊗ Y)).hom) = ((λ_ X).hom ⊗ (𝟙 Y)) :=
247-
by
248-
rw [←tensor_left_iff, id_tensor_comp, ←cancel_epi (α_ (𝟙_ C) (𝟙_ C ⊗ X) Y).hom,
249-
←cancel_epi ((α_ (𝟙_ C) (𝟙_ C) X).hom ⊗ 𝟙 Y), pentagon_assoc, triangle, ←associator_naturality,
250-
←comp_tensor_id_assoc, triangle, associator_naturality, tensor_id]
251-
252-
@[reassoc, simp]
253-
lemma left_unitor_tensor (X Y : C) :
254-
((λ_ (X ⊗ Y)).hom) = ((α_ (𝟙_ C) X Y).inv) ≫ ((λ_ X).hom ⊗ (𝟙 Y)) :=
255-
by { rw [←left_unitor_tensor'], simp }
256-
257-
lemma left_unitor_tensor_inv' (X Y : C) :
258-
((λ_ (X ⊗ Y)).inv) ≫ ((α_ (𝟙_ C) X Y).inv) = ((λ_ X).inv ⊗ (𝟙 Y)) :=
259-
eq_of_inv_eq_inv (by simp)
227+
/-! The lemmas in the next section are true by coherence,
228+
but we prove them directly as they are used in proving the coherence theorem. -/
229+
section
260230

261-
@[reassoc, simp]
262-
lemma left_unitor_tensor_inv (X Y : C) :
263-
(λ_ (X ⊗ Y)).inv = ((λ_ X).inv ⊗ (𝟙 Y)) ≫ (α_ (𝟙_ C) X Y).hom :=
264-
by { rw [←left_unitor_tensor_inv'], simp }
231+
@[reassoc]
232+
lemma pentagon_inv (W X Y Z : C) :
233+
((𝟙 W) ⊗ (α_ X Y Z).inv) ≫ (α_ W (X ⊗ Y) Z).inv ≫ ((α_ W X Y).inv ⊗ (𝟙 Z))
234+
= (α_ W X (Y ⊗ Z)).inv ≫ (α_ (W ⊗ X) Y Z).inv :=
235+
category_theory.eq_of_inv_eq_inv (by simp [pentagon])
265236

266237
@[reassoc, simp]
267238
lemma right_unitor_tensor (X Y : C) :
@@ -276,13 +247,23 @@ lemma right_unitor_tensor_inv (X Y : C) :
276247
((ρ_ (X ⊗ Y)).inv) = ((𝟙 X) ⊗ (ρ_ Y).inv) ≫ (α_ X Y (𝟙_ C)).inv :=
277248
eq_of_inv_eq_inv (by simp)
278249

279-
@[reassoc]
280-
lemma id_tensor_right_unitor_inv (X Y : C) : 𝟙 X ⊗ (ρ_ Y).inv = (ρ_ _).inv ≫ (α_ _ _ _).hom :=
281-
by simp only [right_unitor_tensor_inv, category.comp_id, iso.inv_hom_id, category.assoc]
250+
lemma triangle_assoc_comp_left (X Y : C) :
251+
(α_ X (𝟙_ C) Y).hom ≫ ((𝟙 X) ⊗ (λ_ Y).hom) = (ρ_ X).hom ⊗ 𝟙 Y :=
252+
monoidal_category.triangle X Y
282253

283-
@[reassoc]
284-
lemma left_unitor_inv_tensor_id (X Y : C) : (λ_ X).inv ⊗ 𝟙 Y = (λ_ _).inv ≫ (α_ _ _ _).inv :=
285-
by simp only [left_unitor_tensor_inv, assoc, comp_id, hom_inv_id]
254+
@[simp, reassoc] lemma triangle_assoc_comp_right (X Y : C) :
255+
(α_ X (𝟙_ C) Y).inv ≫ ((ρ_ X).hom ⊗ 𝟙 Y) = ((𝟙 X) ⊗ (λ_ Y).hom) :=
256+
by rw [←triangle_assoc_comp_left, iso.inv_hom_id_assoc]
257+
258+
@[simp, reassoc] lemma triangle_assoc_comp_left_inv (X Y : C) :
259+
((𝟙 X) ⊗ (λ_ Y).inv) ≫ (α_ X (𝟙_ C) Y).inv = ((ρ_ X).inv ⊗ 𝟙 Y) :=
260+
begin
261+
apply (cancel_mono ((ρ_ X).hom ⊗ 𝟙 Y)).1,
262+
simp only [triangle_assoc_comp_right, assoc],
263+
rw [←id_tensor_comp, iso.inv_hom_id, ←comp_tensor_id, iso.inv_hom_id]
264+
end
265+
266+
end
286267

287268
@[reassoc]
288269
lemma associator_inv_naturality {X Y Z X' Y' Z' : C} (f : X ⟶ X') (g : Y ⟶ Y') (h : Z ⟶ Z') :
@@ -309,53 +290,6 @@ lemma associator_inv_conjugation {X X' Y Y' Z Z' : C} (f : X ⟶ X') (g : Y ⟶
309290
(α_ X Y Z).inv ≫ ((f ⊗ g) ⊗ h) ≫ (α_ X' Y' Z').hom = f ⊗ g ⊗ h :=
310291
by rw [associator_naturality, inv_hom_id_assoc]
311292

312-
@[reassoc]
313-
lemma pentagon_inv (W X Y Z : C) :
314-
((𝟙 W) ⊗ (α_ X Y Z).inv) ≫ (α_ W (X ⊗ Y) Z).inv ≫ ((α_ W X Y).inv ⊗ (𝟙 Z))
315-
= (α_ W X (Y ⊗ Z)).inv ≫ (α_ (W ⊗ X) Y Z).inv :=
316-
category_theory.eq_of_inv_eq_inv (by simp [pentagon])
317-
318-
@[reassoc]
319-
lemma pentagon_inv_inv_hom (W X Y Z : C) :
320-
(α_ W (X ⊗ Y) Z).inv ≫ ((α_ W X Y).inv ⊗ (𝟙 Z)) ≫ (α_ (W ⊗ X) Y Z).hom
321-
= ((𝟙 W) ⊗ (α_ X Y Z).hom) ≫ (α_ W X (Y ⊗ Z)).inv :=
322-
begin
323-
rw ←((iso.eq_comp_inv _).mp (pentagon_inv W X Y Z)),
324-
slice_rhs 1 2 { rw [←id_tensor_comp, iso.hom_inv_id] },
325-
simp only [tensor_id, assoc, id_comp]
326-
end
327-
328-
lemma triangle_assoc_comp_left (X Y : C) :
329-
(α_ X (𝟙_ C) Y).hom ≫ ((𝟙 X) ⊗ (λ_ Y).hom) = (ρ_ X).hom ⊗ 𝟙 Y :=
330-
monoidal_category.triangle X Y
331-
332-
@[simp, reassoc] lemma triangle_assoc_comp_right (X Y : C) :
333-
(α_ X (𝟙_ C) Y).inv ≫ ((ρ_ X).hom ⊗ 𝟙 Y) = ((𝟙 X) ⊗ (λ_ Y).hom) :=
334-
by rw [←triangle_assoc_comp_left, iso.inv_hom_id_assoc]
335-
336-
@[simp, reassoc] lemma triangle_assoc_comp_right_inv (X Y : C) :
337-
((ρ_ X).inv ⊗ 𝟙 Y) ≫ (α_ X (𝟙_ C) Y).hom = ((𝟙 X) ⊗ (λ_ Y).inv) :=
338-
begin
339-
apply (cancel_mono (𝟙 X ⊗ (λ_ Y).hom)).1,
340-
simp only [assoc, triangle_assoc_comp_left],
341-
rw [←comp_tensor_id, iso.inv_hom_id, ←id_tensor_comp, iso.inv_hom_id]
342-
end
343-
344-
@[simp, reassoc] lemma triangle_assoc_comp_left_inv (X Y : C) :
345-
((𝟙 X) ⊗ (λ_ Y).inv) ≫ (α_ X (𝟙_ C) Y).inv = ((ρ_ X).inv ⊗ 𝟙 Y) :=
346-
begin
347-
apply (cancel_mono ((ρ_ X).hom ⊗ 𝟙 Y)).1,
348-
simp only [triangle_assoc_comp_right, assoc],
349-
rw [←id_tensor_comp, iso.inv_hom_id, ←comp_tensor_id, iso.inv_hom_id]
350-
end
351-
352-
lemma unitors_equal : (λ_ (𝟙_ C)).hom = (ρ_ (𝟙_ C)).hom :=
353-
by rw [←tensor_left_iff, ←cancel_epi (α_ (𝟙_ C) (𝟙_ _) (𝟙_ _)).hom, ←cancel_mono (ρ_ (𝟙_ C)).hom,
354-
triangle, ←right_unitor_tensor, right_unitor_naturality]
355-
356-
lemma unitors_inv_equal : (λ_ (𝟙_ C)).inv = (ρ_ (𝟙_ C)).inv :=
357-
by { ext, simp [←unitors_equal] }
358-
359293
@[reassoc]
360294
lemma right_unitor_inv_comp_tensor (f : W ⟶ X) (g : 𝟙_ C ⟶ Z) :
361295
(ρ_ _).inv ≫ (f ⊗ g) = f ≫ (ρ_ _).inv ≫ (𝟙 _ ⊗ g) :=
@@ -386,34 +320,6 @@ lemma tensor_inv_hom_id {V W X Y Z : C} (f : V ≅ W) (g : X ⟶ Y) (h : Y ⟶ Z
386320
(g ⊗ f.inv) ≫ (h ⊗ f.hom) = (g ≫ h) ⊗ 𝟙 W :=
387321
by rw [←tensor_comp, f.inv_hom_id]
388322

389-
@[reassoc]
390-
lemma pentagon_hom_inv {W X Y Z : C} :
391-
(α_ W X (Y ⊗ Z)).hom ≫ (𝟙 W ⊗ (α_ X Y Z).inv)
392-
= (α_ (W ⊗ X) Y Z).inv ≫ ((α_ W X Y).hom ⊗ 𝟙 Z) ≫ (α_ W (X ⊗ Y) Z).hom :=
393-
begin
394-
have pent := pentagon W X Y Z,
395-
rw ←iso.comp_inv_eq at pent,
396-
rw [iso.eq_inv_comp, ←pent],
397-
simp only [tensor_hom_inv_id, iso.inv_hom_id_assoc, tensor_id, category.comp_id, category.assoc],
398-
end
399-
400-
@[reassoc]
401-
lemma pentagon_inv_hom (W X Y Z : C) :
402-
(α_ (W ⊗ X) Y Z).inv ≫ ((α_ W X Y).hom ⊗ 𝟙 Z)
403-
= (α_ W X (Y ⊗ Z)).hom ≫ (𝟙 W ⊗ (α_ X Y Z).inv) ≫ (α_ W (X ⊗ Y) Z).inv :=
404-
begin
405-
have pent := pentagon W X Y Z,
406-
rw ←iso.inv_comp_eq at pent,
407-
rw [←pent],
408-
simp only [tensor_id, assoc, id_comp, comp_id, hom_inv_id, tensor_hom_inv_id_assoc],
409-
end
410-
411-
@[reassoc]
412-
lemma pentagon_comp_id_tensor {W X Y Z : C} :
413-
(α_ W (X ⊗ Y) Z).hom ≫ ((𝟙 W) ⊗ (α_ X Y Z).hom)
414-
= ((α_ W X Y).inv ⊗ (𝟙 Z)) ≫ (α_ (W ⊗ X) Y Z).hom ≫ (α_ W X (Y ⊗ Z)).hom :=
415-
by { rw ←pentagon W X Y Z, simp }
416-
417323
end
418324

419325
section
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/-
2+
Copyright (c) 2018 Michael Jendrusch. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Michael Jendrusch, Scott Morrison, Bhavik Mehta, Jakob von Raumer
5+
-/
6+
import category_theory.monoidal.coherence
7+
8+
/-!
9+
# Lemmas which are consequences of monoidal coherence
10+
11+
These lemmas are all proved `by coherence`.
12+
13+
## Future work
14+
Investigate whether these lemmas are really needed,
15+
or if they can be replaced by use of the `coherence` tactic.
16+
-/
17+
18+
open category_theory
19+
open category_theory.category
20+
open category_theory.iso
21+
22+
namespace category_theory.monoidal_category
23+
24+
variables {C : Type*} [category C] [monoidal_category C]
25+
26+
-- See Proposition 2.2.4 of <http://www-math.mit.edu/~etingof/egnobookfinal.pdf>
27+
@[reassoc]
28+
lemma left_unitor_tensor' (X Y : C) :
29+
((α_ (𝟙_ C) X Y).hom) ≫ ((λ_ (X ⊗ Y)).hom) = ((λ_ X).hom ⊗ (𝟙 Y)) :=
30+
by coherence
31+
32+
@[reassoc, simp]
33+
lemma left_unitor_tensor (X Y : C) :
34+
((λ_ (X ⊗ Y)).hom) = ((α_ (𝟙_ C) X Y).inv) ≫ ((λ_ X).hom ⊗ (𝟙 Y)) :=
35+
by coherence
36+
37+
@[reassoc]
38+
lemma left_unitor_tensor_inv (X Y : C) :
39+
(λ_ (X ⊗ Y)).inv = ((λ_ X).inv ⊗ (𝟙 Y)) ≫ (α_ (𝟙_ C) X Y).hom :=
40+
by coherence
41+
42+
@[reassoc]
43+
lemma id_tensor_right_unitor_inv (X Y : C) : 𝟙 X ⊗ (ρ_ Y).inv = (ρ_ _).inv ≫ (α_ _ _ _).hom :=
44+
by coherence
45+
46+
@[reassoc]
47+
lemma left_unitor_inv_tensor_id (X Y : C) : (λ_ X).inv ⊗ 𝟙 Y = (λ_ _).inv ≫ (α_ _ _ _).inv :=
48+
by coherence
49+
50+
@[reassoc]
51+
lemma pentagon_inv_inv_hom (W X Y Z : C) :
52+
(α_ W (X ⊗ Y) Z).inv ≫ ((α_ W X Y).inv ⊗ (𝟙 Z)) ≫ (α_ (W ⊗ X) Y Z).hom
53+
= ((𝟙 W) ⊗ (α_ X Y Z).hom) ≫ (α_ W X (Y ⊗ Z)).inv :=
54+
by coherence
55+
56+
@[simp, reassoc] lemma triangle_assoc_comp_right_inv (X Y : C) :
57+
((ρ_ X).inv ⊗ 𝟙 Y) ≫ (α_ X (𝟙_ C) Y).hom = ((𝟙 X) ⊗ (λ_ Y).inv) :=
58+
by coherence
59+
60+
lemma unitors_equal : (λ_ (𝟙_ C)).hom = (ρ_ (𝟙_ C)).hom :=
61+
by coherence
62+
63+
lemma unitors_inv_equal : (λ_ (𝟙_ C)).inv = (ρ_ (𝟙_ C)).inv :=
64+
by coherence
65+
66+
@[reassoc]
67+
lemma pentagon_hom_inv {W X Y Z : C} :
68+
(α_ W X (Y ⊗ Z)).hom ≫ (𝟙 W ⊗ (α_ X Y Z).inv)
69+
= (α_ (W ⊗ X) Y Z).inv ≫ ((α_ W X Y).hom ⊗ 𝟙 Z) ≫ (α_ W (X ⊗ Y) Z).hom :=
70+
by coherence
71+
72+
@[reassoc]
73+
lemma pentagon_inv_hom (W X Y Z : C) :
74+
(α_ (W ⊗ X) Y Z).inv ≫ ((α_ W X Y).hom ⊗ 𝟙 Z)
75+
= (α_ W X (Y ⊗ Z)).hom ≫ (𝟙 W ⊗ (α_ X Y Z).inv) ≫ (α_ W (X ⊗ Y) Z).inv :=
76+
by coherence
77+
78+
end category_theory.monoidal_category

src/category_theory/monoidal/rigid.lean

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ Copyright (c) 2021 Jakob von Raumer. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Jakob von Raumer
55
-/
6-
7-
import category_theory.monoidal.coherence
8-
6+
import category_theory.monoidal.coherence_lemmas
97

108
/-!
119
# Rigid (autonomous) monoidal categories

0 commit comments

Comments
 (0)