@@ -30,6 +30,8 @@ we put some declarations that are specifically about natural isomorphisms in the
3030namespace so that they are available using dot notation.
3131-/
3232
33+ set_option mathlib.tactic.category.grind true
34+
3335-- declare the `v`'s first; see `CategoryTheory.Category` for an explanation
3436universe v₁ v₂ v₃ v₄ u₁ u₂ u₃ u₄
3537
@@ -49,44 +51,34 @@ def app {F G : C ⥤ D} (α : F ≅ G) (X : C) :
4951 F.obj X ≅ G.obj X where
5052 hom := α.hom.app X
5153 inv := α.inv.app X
52- hom_inv_id := by rw [← comp_app, Iso.hom_inv_id]; rfl
53- inv_hom_id := by rw [← comp_app, Iso.inv_hom_id]; rfl
5454
5555attribute [grind =] app_hom app_inv
5656
5757@ [reassoc (attr := simp), grind =]
5858theorem hom_inv_id_app {F G : C ⥤ D} (α : F ≅ G) (X : C) :
59- α.hom.app X ≫ α.inv.app X = 𝟙 (F.obj X) :=
60- congr_fun (congr_arg NatTrans.app α.hom_inv_id) X
59+ α.hom.app X ≫ α.inv.app X = 𝟙 (F.obj X) := by cat_disch
6160
6261@ [reassoc (attr := simp), grind =]
6362theorem inv_hom_id_app {F G : C ⥤ D} (α : F ≅ G) (X : C) :
64- α.inv.app X ≫ α.hom.app X = 𝟙 (G.obj X) :=
65- congr_fun (congr_arg NatTrans.app α.inv_hom_id) X
63+ α.inv.app X ≫ α.hom.app X = 𝟙 (G.obj X) := by cat_disch
6664
6765@ [reassoc (attr := simp)]
6866lemma hom_inv_id_app_app {F G : C ⥤ D ⥤ E} (e : F ≅ G) (X₁ : C) (X₂ : D) :
69- (e.hom.app X₁).app X₂ ≫ (e.inv.app X₁).app X₂ = 𝟙 _ := by
70- rw [← NatTrans.comp_app, Iso.hom_inv_id_app, NatTrans.id_app]
67+ (e.hom.app X₁).app X₂ ≫ (e.inv.app X₁).app X₂ = 𝟙 _ := by cat_disch
7168
7269@ [reassoc (attr := simp)]
7370lemma inv_hom_id_app_app {F G : C ⥤ D ⥤ E} (e : F ≅ G) (X₁ : C) (X₂ : D) :
74- (e.inv.app X₁).app X₂ ≫ (e.hom.app X₁).app X₂ = 𝟙 _ := by
75- rw [← NatTrans.comp_app, Iso.inv_hom_id_app, NatTrans.id_app]
71+ (e.inv.app X₁).app X₂ ≫ (e.hom.app X₁).app X₂ = 𝟙 _ := by cat_disch
7672
7773@ [reassoc (attr := simp)]
7874lemma hom_inv_id_app_app_app {F G : C ⥤ D ⥤ E ⥤ E'} (e : F ≅ G)
7975 (X₁ : C) (X₂ : D) (X₃ : E) :
80- ((e.hom.app X₁).app X₂).app X₃ ≫ ((e.inv.app X₁).app X₂).app X₃ = 𝟙 _ := by
81- rw [← NatTrans.comp_app, ← NatTrans.comp_app, Iso.hom_inv_id_app,
82- NatTrans.id_app, NatTrans.id_app]
76+ ((e.hom.app X₁).app X₂).app X₃ ≫ ((e.inv.app X₁).app X₂).app X₃ = 𝟙 _ := by cat_disch
8377
8478@ [reassoc (attr := simp)]
8579lemma inv_hom_id_app_app_app {F G : C ⥤ D ⥤ E ⥤ E'} (e : F ≅ G)
8680 (X₁ : C) (X₂ : D) (X₃ : E) :
87- ((e.inv.app X₁).app X₂).app X₃ ≫ ((e.hom.app X₁).app X₂).app X₃ = 𝟙 _ := by
88- rw [← NatTrans.comp_app, ← NatTrans.comp_app, Iso.inv_hom_id_app,
89- NatTrans.id_app, NatTrans.id_app]
81+ ((e.inv.app X₁).app X₂).app X₃ ≫ ((e.hom.app X₁).app X₂).app X₃ = 𝟙 _ := by cat_disch
9082
9183end Iso
9284
@@ -110,12 +102,10 @@ theorem app_inv {F G : C ⥤ D} (α : F ≅ G) (X : C) : (α.app X).inv = α.inv
110102variable {F G : C ⥤ D}
111103
112104instance hom_app_isIso (α : F ≅ G) (X : C) : IsIso (α.hom.app X) :=
113- ⟨⟨α.inv.app X,
114- ⟨by rw [← comp_app, Iso.hom_inv_id, ← id_app], by rw [← comp_app, Iso.inv_hom_id, ← id_app]⟩⟩⟩
105+ ⟨⟨α.inv.app X, ⟨by grind, by grind⟩⟩⟩
115106
116107instance inv_app_isIso (α : F ≅ G) (X : C) : IsIso (α.inv.app X) :=
117- ⟨⟨α.hom.app X,
118- ⟨by rw [← comp_app, Iso.inv_hom_id, ← id_app], by rw [← comp_app, Iso.hom_inv_id, ← id_app]⟩⟩⟩
108+ ⟨⟨α.hom.app X, ⟨by grind, by grind⟩⟩⟩
119109
120110section
121111
@@ -161,8 +151,6 @@ theorem cancel_natIso_inv_right_assoc {W X X' : D} {Y : C} (f : W ⟶ X) (g : X
161151 f ≫ g ≫ α.inv.app Y = f' ≫ g' ≫ α.inv.app Y ↔ f ≫ g = f' ≫ g' := by
162152 simp only [← Category.assoc, cancel_mono, refl]
163153
164- attribute [grind ←=] CategoryTheory.IsIso.inv_eq_of_hom_inv_id
165-
166154@[simp]
167155theorem inv_inv_app {F G : C ⥤ D} (e : F ≅ G) (X : C) : inv (e.inv.app X) = e.hom.app X := by
168156 cat_disch
@@ -182,30 +170,24 @@ theorem naturality_1' (α : F ⟶ G) (f : X ⟶ Y) {_ : IsIso (α.app X)} :
182170
183171@ [reassoc (attr := simp)]
184172theorem naturality_2' (α : F ⟶ G) (f : X ⟶ Y) {_ : IsIso (α.app Y)} :
185- α.app X ≫ G.map f ≫ inv (α.app Y) = F.map f := by
186- rw [← Category.assoc, ← naturality, Category.assoc, IsIso.hom_inv_id, Category.comp_id]
173+ α.app X ≫ G.map f ≫ inv (α.app Y) = F.map f := by cat_disch
187174
188175/-- The components of a natural isomorphism are isomorphisms.
189176-/
190177instance isIso_app_of_isIso (α : F ⟶ G) [IsIso α] (X) : IsIso (α.app X) :=
191- ⟨⟨(inv α).app X,
192- ⟨congr_fun (congr_arg NatTrans.app (IsIso.hom_inv_id α)) X,
193- congr_fun (congr_arg NatTrans.app (IsIso.inv_hom_id α)) X⟩⟩⟩
178+ ⟨⟨(inv α).app X, ⟨by grind, by grind⟩⟩⟩
194179
195180@[simp]
196- theorem isIso_inv_app (α : F ⟶ G) {_ : IsIso α} (X) : (inv α).app X = inv (α.app X) := by
197- -- Porting note: the next lemma used to be in `ext`, but that is no longer allowed.
198- -- We've added an aesop apply rule;
199- -- it would be nice to have a hook to run those without aesop warning it didn't close the goal.
200- apply IsIso.eq_inv_of_hom_inv_id
201- rw [← NatTrans.comp_app]
202- simp
181+ theorem isIso_inv_app (α : F ⟶ G) {_ : IsIso α} (X) : (inv α).app X = inv (α.app X) := by cat_disch
203182
204183@[simp]
205184theorem inv_map_inv_app (F : C ⥤ D ⥤ E) {X Y : C} (e : X ≅ Y) (Z : D) :
206- inv ((F.map e.inv).app Z) = (F.map e.hom).app Z := by
207- cat_disch
185+ inv ((F.map e.inv).app Z) = (F.map e.hom).app Z := by cat_disch
208186
187+ -- TODO: `hom_inv_id` and `inv_hom_id` are not yet working via `grind`,
188+ -- but they work fine in my minimization in the `grind` test suite.
189+ -- Investigate on nightly-testing / the next release?
190+ set_option mathlib.tactic.category.grind false in
209191/-- Construct a natural isomorphism between functors by giving object level isomorphisms,
210192and checking naturality only in the forward direction.
211193-/
@@ -222,9 +204,11 @@ def ofComponents (app : ∀ X : C, F.obj X ≅ G.obj X)
222204 simp only [Iso.inv_hom_id_assoc, Iso.hom_inv_id, assoc, comp_id] at h
223205 exact h }
224206
207+ attribute [grind =] ofComponents_hom_app ofComponents_inv_app
208+
225209@[simp]
226210theorem ofComponents.app (app' : ∀ X : C, F.obj X ≅ G.obj X) (naturality) (X) :
227- (ofComponents app' naturality).app X = app' X := by aesop
211+ (ofComponents app' naturality).app X = app' X := by cat_disch
228212
229213-- Making this an instance would cause a typeclass inference loop with `isIso_app_of_isIso`.
230214/-- A natural transformation is an isomorphism if all its components are isomorphisms.
@@ -234,22 +218,17 @@ theorem isIso_of_isIso_app (α : F ⟶ G) [∀ X : C, IsIso (α.app X)] : IsIso
234218
235219/-- Horizontal composition of natural isomorphisms. -/
236220@[simps]
237- def hcomp {F G : C ⥤ D} {H I : D ⥤ E} (α : F ≅ G) (β : H ≅ I) : F ⋙ H ≅ G ⋙ I := by
238- refine ⟨α.hom ◫ β.hom, α.inv ◫ β.inv, ?_, ?_⟩
239- · ext
240- rw [← NatTrans.exchange]
241- simp
242- ext; rw [← NatTrans.exchange]; simp
221+ def hcomp {F G : C ⥤ D} {H I : D ⥤ E} (α : F ≅ G) (β : H ≅ I) : F ⋙ H ≅ G ⋙ I where
222+ hom := α.hom ◫ β.hom
223+ inv := α.inv ◫ β.inv
243224
244225theorem isIso_map_iff {F₁ F₂ : C ⥤ D} (e : F₁ ≅ F₂) {X Y : C} (f : X ⟶ Y) :
245226 IsIso (F₁.map f) ↔ IsIso (F₂.map f) := by
246227 revert F₁ F₂
247- suffices ∀ {F₁ F₂ : C ⥤ D} (_ : F₁ ≅ F₂) (_ : IsIso (F₁.map f)), IsIso (F₂.map f) by
248- exact fun F₁ F₂ e => ⟨this e, this e.symm⟩
228+ suffices ∀ {F₁ F₂ : C ⥤ D} (_ : F₁ ≅ F₂) (_ : IsIso (F₁.map f)), IsIso (F₂.map f) from
229+ fun F₁ F₂ e => ⟨this e, this e.symm⟩
249230 intro F₁ F₂ e hf
250- refine IsIso.mk ⟨e.inv.app Y ≫ inv (F₁.map f) ≫ e.hom.app X, ?_, ?_⟩
251- · simp only [NatTrans.naturality_assoc, IsIso.hom_inv_id_assoc, Iso.inv_hom_id_app]
252- · simp only [assoc, ← e.hom.naturality, IsIso.inv_hom_id_assoc, Iso.inv_hom_id_app]
231+ exact IsIso.mk ⟨e.inv.app Y ≫ inv (F₁.map f) ≫ e.hom.app X, by cat_disch⟩
253232
254233end NatIso
255234
@@ -261,6 +240,7 @@ namespace Functor
261240
262241variable (F : C ⥤ D) (obj : C → D) (e : ∀ X, F.obj X ≅ obj X)
263242
243+ set_option mathlib.tactic.category.grind false in
264244/-- Constructor for a functor that is isomorphic to a given functor `F : C ⥤ D`,
265245while being definitionally equal on objects to a given map `obj : C → D`
266246such that for all `X : C`, we have an isomorphism `F.obj X ≅ obj X`. -/
0 commit comments