@@ -360,4 +360,60 @@ lemma preservesFiniteLimits_iff_lan_preservesFiniteLimits (F : C ⥤ D) :
360360
361361end SmallCategory
362362
363+ section
364+
365+ variable {C D E : Type *} [Category* C] [Category* D] [Category* E] (F : C ⥤ D) (G : D ⥤ E)
366+
367+ attribute [local instance] IsCofiltered.isConnected IsFiltered.isConnected
368+
369+ instance (X : E) [RepresentablyFlat F] : (StructuredArrow.pre X F G).Final :=
370+ ⟨fun _ ↦ isConnected_of_equivalent (StructuredArrow.preEquivalence _ _).symm⟩
371+
372+ instance (X : E) [RepresentablyCoflat F] : (CostructuredArrow.pre F G X).Initial :=
373+ ⟨fun _ ↦ isConnected_of_equivalent (CostructuredArrow.preEquivalence _ _).symm⟩
374+
375+ instance (X : E) [RepresentablyFlat F] [IsCofiltered (StructuredArrow X G)] :
376+ IsCofiltered (StructuredArrow X (F ⋙ G)) := by
377+ let T := StructuredArrow.pre X F G
378+ obtain ⟨Y⟩ := IsCofiltered.nonempty (C := StructuredArrow X G)
379+ obtain ⟨A⟩ := IsCofiltered.nonempty (C := StructuredArrow Y.right F)
380+ have : Nonempty (StructuredArrow X (F ⋙ G)) := ⟨.mk (Y.hom ≫ G.map A.hom)⟩
381+ suffices IsCofilteredOrEmpty (StructuredArrow X (F ⋙ G)) by constructor
382+ refine ⟨fun A B ↦ ?_, fun A B f g ↦ ?_⟩
383+ · let U := IsCofiltered.min (T.obj A) (T.obj B)
384+ let A' : StructuredArrow U.right F := .mk (IsCofiltered.minToLeft (T.obj A) (T.obj B)).right
385+ let B' : StructuredArrow U.right F := .mk (IsCofiltered.minToRight (T.obj A) (T.obj B)).right
386+ refine ⟨.mk <| U.hom ≫ G.map (IsCofiltered.min A' B').hom, ?_, ?_, trivial⟩
387+ · refine StructuredArrow.homMk (IsCofiltered.minToLeft A' B').right ?_
388+ simpa [← Functor.map_comp] using StructuredArrow.w _
389+ · refine StructuredArrow.homMk (IsCofiltered.minToRight A' B').right ?_
390+ simpa [← Functor.map_comp] using StructuredArrow.w _
391+ · let U := IsCofiltered.eq (T.map f) (T.map g)
392+ let A' : StructuredArrow _ F := .mk (IsCofiltered.eqHom (T.map f) (T.map g)).right
393+ let B' : StructuredArrow _ F := .mk (IsCofiltered.eqHom (T.map f) (T.map g) ≫ T.map f).right
394+ let f' : A' ⟶ B' := StructuredArrow.homMk f.right rfl
395+ let g' : A' ⟶ B' := StructuredArrow.homMk g.right
396+ congr($(IsCofiltered.eq_condition (T.map f) (T.map g)).right).symm
397+ refine ⟨.mk <| U.hom ≫ G.map (IsCofiltered.eq f' g').hom, ?_, ?_⟩
398+ · refine StructuredArrow.homMk (IsCofiltered.eqHom f' g').right ?_
399+ simpa [← Functor.map_comp] using StructuredArrow.w _
400+ · ext
401+ exact congr($(IsCofiltered.eq_condition f' g').right)
402+
403+ instance (X : E) [RepresentablyCoflat F] [h : IsFiltered (CostructuredArrow G X)] :
404+ IsFiltered (CostructuredArrow (F ⋙ G) X) := by
405+ rw [← isCofiltered_op_iff_isFiltered, IsCofiltered.iff_of_equivalence
406+ (costructuredArrowOpEquivalence _ _)] at h ⊢
407+ exact inferInstanceAs <| IsCofiltered (StructuredArrow (op X) (F.op ⋙ G.op))
408+
409+ instance (G : D ⥤ Type *) [RepresentablyFlat F] [IsCofiltered G.Elements] :
410+ IsCofiltered (F ⋙ G).Elements := by
411+ suffices h : IsCofiltered (StructuredArrow PUnit (F ⋙ G)) from
412+ .of_equivalence (CategoryOfElements.structuredArrowEquivalence _).symm
413+ have : IsCofiltered (StructuredArrow PUnit G) :=
414+ .of_equivalence (CategoryOfElements.structuredArrowEquivalence _)
415+ infer_instance
416+
417+ end
418+
363419end CategoryTheory
0 commit comments