/-
Copyright (c) 2020 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Morrison, Bhavik Mehta

! This file was ported from Lean 3 source module category_theory.limits.preserves.limits
! leanprover-community/mathlib commit 832f7b9162039c28b9361289c8681f155cae758f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.CategoryTheory.Limits.Preserves.Basic

/-!
# Isomorphisms about functors which preserve (co)limits

> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
> Any changes to this file require a corresponding PR to mathlib4.

If `G` preserves limits, and `C` and `D` have limits, then for any diagram `F : J ⥤ C` we have a
canonical isomorphism `preserves_limit_iso : G.obj (limit F) ≅ limit (F ⋙ G)`.
We also show that we can commute `is_limit.lift` of a preserved limit with `functor.map_cone`:
`(preserves_limit.preserves t).lift (G.map_cone c₂) = G.map (t.lift c₂)`.

The duals of these are also given. For functors which preserve (co)limits of specific shapes, see
`preserves/shapes.lean`.
-/

universe w' w v₁ v₂ u₁ u₂

noncomputable section

namespace CategoryTheory

open Category Limits

variable {C : Type u₁} [Category.{v₁} C]

variable {D : Type u₂} [Category.{v₂} D]

variable (G : C ⥤ D)

variable {J : Type w} [Category.{w'} J]

variable (F : J ⥤ C)

section

variable [PreservesLimit F G]

/- warning: category_theory.preserves_lift_map_cone -> CategoryTheory.preserves_lift_mapCone is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] (c₁ : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (c₂ : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (t : CategoryTheory.Limits.IsLimit.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.Cone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₂)) (CategoryTheory.Limits.Cone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₁))) (CategoryTheory.Limits.IsLimit.lift.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₁) (CategoryTheory.Limits.PreservesLimit.preserves.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G _inst_4 c₁ t) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₂)) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₂) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁) (CategoryTheory.Limits.IsLimit.lift.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁ t c₂))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] (c₁ : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (c₂ : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (t : CategoryTheory.Limits.IsLimit.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.Cone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₂)) (CategoryTheory.Limits.Cone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₁))) (CategoryTheory.Limits.IsLimit.lift.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₁) (CategoryTheory.Limits.PreservesLimit.preserves.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G _inst_4 c₁ t) (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₂)) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₂) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁) (CategoryTheory.Limits.IsLimit.lift.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁ t c₂))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_lift_map_cone CategoryTheory.preserves_lift_mapConeₓ'. -/
@[simp]
theorem preserves_lift_mapCone (c₁ c₂ : Cone F) (t : IsLimit c₁) :
    (PreservesLimit.preserves t).lift (G.mapCone c₂) = G.map (t.lift c₂) :=
  ((PreservesLimit.preserves t).uniq (G.mapCone c₂) _ (by simp [← G.map_comp])).symm
#align category_theory.preserves_lift_map_cone CategoryTheory.preserves_lift_mapCone

variable [HasLimit F] [HasLimit (F ⋙ G)]

/- warning: category_theory.preserves_limit_iso -> CategoryTheory.preservesLimitIso is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)], CategoryTheory.Iso.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)], CategoryTheory.Iso.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_limit_iso CategoryTheory.preservesLimitIsoₓ'. -/
/-- If `G` preserves limits, we have an isomorphism from the image of the limit of a functor `F`
to the limit of the functor `F ⋙ G`.
-/
def preservesLimitIso : G.obj (limit F) ≅ limit (F ⋙ G) :=
  (PreservesLimit.preserves (limit.isLimit _)).conePointUniqueUpToIso (limit.isLimit _)
#align category_theory.preserves_limit_iso CategoryTheory.preservesLimitIso

/- warning: category_theory.preserves_limits_iso_hom_π -> CategoryTheory.preservesLimitsIso_hom_π is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Functor.obj.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) j)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) j) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (CategoryTheory.Limits.limit.π.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j) (CategoryTheory.Limits.limit.π.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (Prefunctor.obj.{succ u1, succ u4, u2, u6} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)) j)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u1, succ u4, u2, u6} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)) j) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (CategoryTheory.Limits.limit.π.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j) (CategoryTheory.Limits.limit.π.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_limits_iso_hom_π CategoryTheory.preservesLimitsIso_hom_πₓ'. -/
@[simp, reassoc.1]
theorem preservesLimitsIso_hom_π (j) :
    (preservesLimitIso G F).Hom ≫ limit.π _ j = G.map (limit.π F j) :=
  IsLimit.conePointUniqueUpToIso_hom_comp _ _ j
#align category_theory.preserves_limits_iso_hom_π CategoryTheory.preservesLimitsIso_hom_π

/- warning: category_theory.preserves_limits_iso_inv_π -> CategoryTheory.preservesLimitsIso_inv_π is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j)) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j) (CategoryTheory.Limits.limit.π.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))) (CategoryTheory.Limits.limit.π.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j)) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j) (CategoryTheory.Limits.limit.π.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))) (CategoryTheory.Limits.limit.π.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_limits_iso_inv_π CategoryTheory.preservesLimitsIso_inv_πₓ'. -/
@[simp, reassoc.1]
theorem preservesLimitsIso_inv_π (j) :
    (preservesLimitIso G F).inv ≫ G.map (limit.π F j) = limit.π _ j :=
  IsLimit.conePointUniqueUpToIso_inv_comp _ _ j
#align category_theory.preserves_limits_iso_inv_π CategoryTheory.preservesLimitsIso_inv_π

/- warning: category_theory.lift_comp_preserves_limits_iso_hom -> CategoryTheory.lift_comp_preservesLimitsIso_hom is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (t : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.limit.lift.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 t)) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (CategoryTheory.Limits.limit.lift.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G t))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesLimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasLimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasLimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (t : CategoryTheory.Limits.Cone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.limit.lift.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 t)) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.limit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.limit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesLimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (CategoryTheory.Limits.limit.lift.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 (CategoryTheory.Functor.mapCone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F t))
Case conversion may be inaccurate. Consider using '#align category_theory.lift_comp_preserves_limits_iso_hom CategoryTheory.lift_comp_preservesLimitsIso_homₓ'. -/
@[simp, reassoc.1]
theorem lift_comp_preservesLimitsIso_hom (t : Cone F) :
    G.map (limit.lift _ t) ≫ (preservesLimitIso G F).Hom = limit.lift (F ⋙ G) (G.mapCone _) :=
  by
  ext
  simp [← G.map_comp]
#align category_theory.lift_comp_preserves_limits_iso_hom CategoryTheory.lift_comp_preservesLimitsIso_hom

variable [PreservesLimitsOfShape J G] [HasLimitsOfShape J D] [HasLimitsOfShape J C]

/- warning: category_theory.preserves_limit_nat_iso -> CategoryTheory.preservesLimitNatIso is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] [_inst_7 : CategoryTheory.Limits.PreservesLimitsOfShape.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 G] [_inst_8 : CategoryTheory.Limits.HasLimitsOfShape.{u1, u2, u4, u6} J _inst_3 D _inst_2] [_inst_9 : CategoryTheory.Limits.HasLimitsOfShape.{u1, u2, u3, u5} J _inst_3 C _inst_1], CategoryTheory.Iso.{max (max u1 u3 u2 u5) u4, max (max u2 u3) u4 (max u1 u3 u2 u5) u6} (CategoryTheory.Functor.{max u2 u3, u4, max u1 u3 u2 u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.category.{max u2 u3, u4, max u1 u3 u2 u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.comp.{max u2 u3, u3, u4, max u1 u3 u2 u5, u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) C _inst_1 D _inst_2 (CategoryTheory.Limits.lim.{u1, u2, u3, u5} J _inst_3 C _inst_1 _inst_9) G) (CategoryTheory.Functor.comp.{max u2 u3, max u2 u4, u4, max u1 u3 u2 u5, max u1 u4 u2 u6, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2) D _inst_2 (CategoryTheory.Functor.obj.{max u5 u4, max (max u1 u3 u2 u5) u2 u4, max u3 u4 u5 u6, max (max u2 u3) (max u2 u4) (max u1 u3 u2 u5) u1 u4 u2 u6} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max u1 u3 u2 u5, max u1 u4 u2 u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max u1 u3 u2 u5, max u1 u4 u2 u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.whiskeringRight.{u2, u1, u5, u3, u6, u4} J _inst_3 C _inst_1 D _inst_2) G) (CategoryTheory.Limits.lim.{u1, u2, u4, u6} J _inst_3 D _inst_2 _inst_8))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] [_inst_7 : CategoryTheory.Limits.PreservesLimitsOfShape.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 G] [_inst_8 : CategoryTheory.Limits.HasLimitsOfShape.{u1, u2, u4, u6} J _inst_3 D _inst_2] [_inst_9 : CategoryTheory.Limits.HasLimitsOfShape.{u1, u2, u3, u5} J _inst_3 C _inst_1], CategoryTheory.Iso.{max (max (max (max u5 u3) u4) u2) u1, max (max (max u6 (max (max u5 u3) u2) u1) u4) u3 u2} (CategoryTheory.Functor.{max u3 u2, u4, max (max (max u5 u3) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.category.{max u3 u2, u4, max (max (max u5 u3) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.comp.{max u3 u2, u3, u4, max (max (max u5 u3) u2) u1, u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) C _inst_1 D _inst_2 (CategoryTheory.Limits.lim.{u1, u2, u3, u5} J _inst_3 C _inst_1 _inst_9) G) (CategoryTheory.Functor.comp.{max u3 u2, max u4 u2, u4, max (max (max u5 u3) u2) u1, max (max (max u6 u4) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2) D _inst_2 (Prefunctor.obj.{max (succ u5) (succ u4), max (max (max (max (succ u5) (succ u3)) (succ u4)) (succ u2)) (succ u1), max (max (max u5 u6) u3) u4, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.CategoryStruct.toQuiver.{max u5 u4, max (max (max u5 u6) u3) u4} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Category.toCategoryStruct.{max u5 u4, max (max (max u5 u6) u3) u4} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2))) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.CategoryStruct.toQuiver.{max (max (max (max u5 u3) u4) u2) u1, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Category.toCategoryStruct.{max (max (max (max u5 u3) u4) u2) u1, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max (max (max u2 u5) u1) u3, max (max (max u2 u6) u1) u4} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)))) (CategoryTheory.Functor.toPrefunctor.{max u5 u4, max (max (max (max u5 u3) u4) u2) u1, max (max (max u5 u6) u3) u4, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max (max (max u2 u5) u1) u3, max (max (max u2 u6) u1) u4} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.whiskeringRight.{u2, u1, u5, u3, u6, u4} J _inst_3 C _inst_1 D _inst_2)) G) (CategoryTheory.Limits.lim.{u1, u2, u4, u6} J _inst_3 D _inst_2 _inst_8))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_limit_nat_iso CategoryTheory.preservesLimitNatIsoₓ'. -/
/-- If `C, D` has all limits of shape `J`, and `G` preserves them, then `preserves_limit_iso` is
functorial wrt `F`. -/
@[simps]
def preservesLimitNatIso : lim ⋙ G ≅ (whiskeringRight J C D).obj G ⋙ lim :=
  NatIso.ofComponents (fun F => preservesLimitIso G F)
    (by
      intro _ _ f
      ext
      dsimp
      simp only [preserves_limits_iso_hom_π, whisker_right_app, lim_map_π, category.assoc,
        preserves_limits_iso_hom_π_assoc, ← G.map_comp])
#align category_theory.preserves_limit_nat_iso CategoryTheory.preservesLimitNatIso

end

section

variable [PreservesColimit F G]

/- warning: category_theory.preserves_desc_map_cocone -> CategoryTheory.preserves_desc_mapCocone is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] (c₁ : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (c₂ : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (t : CategoryTheory.Limits.IsColimit.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.Cocone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₁)) (CategoryTheory.Limits.Cocone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₂))) (CategoryTheory.Limits.IsColimit.desc.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₁) (CategoryTheory.Limits.PreservesColimit.preserves.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G _inst_4 c₁ t) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G c₂)) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₂) (CategoryTheory.Limits.IsColimit.desc.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁ t c₂))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] (c₁ : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (c₂ : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) (t : CategoryTheory.Limits.IsColimit.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.Cocone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₁)) (CategoryTheory.Limits.Cocone.pt.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₂))) (CategoryTheory.Limits.IsColimit.desc.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₁) (CategoryTheory.Limits.PreservesColimit.preserves.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G _inst_4 c₁ t) (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F c₂)) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₂) (CategoryTheory.Limits.IsColimit.desc.{u1, u3, u2, u5} J _inst_3 C _inst_1 F c₁ t c₂))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_desc_map_cocone CategoryTheory.preserves_desc_mapCoconeₓ'. -/
@[simp]
theorem preserves_desc_mapCocone (c₁ c₂ : Cocone F) (t : IsColimit c₁) :
    (PreservesColimit.preserves t).desc (G.mapCocone _) = G.map (t.desc c₂) :=
  ((PreservesColimit.preserves t).uniq (G.mapCocone _) _ (by simp [← G.map_comp])).symm
#align category_theory.preserves_desc_map_cocone CategoryTheory.preserves_desc_mapCocone

variable [HasColimit F] [HasColimit (F ⋙ G)]

/- warning: category_theory.preserves_colimit_iso -> CategoryTheory.preservesColimitIso is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)], CategoryTheory.Iso.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)], CategoryTheory.Iso.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_colimit_iso CategoryTheory.preservesColimitIsoₓ'. -/
-- TODO: think about swapping the order here
/-- If `G` preserves colimits, we have an isomorphism from the image of the colimit of a functor `F`
to the colimit of the functor `F ⋙ G`.
-/
def preservesColimitIso : G.obj (colimit F) ≅ colimit (F ⋙ G) :=
  (PreservesColimit.preserves (colimit.isColimit _)).coconePointUniqueUpToIso (colimit.isColimit _)
#align category_theory.preserves_colimit_iso CategoryTheory.preservesColimitIso

/- warning: category_theory.ι_preserves_colimits_iso_inv -> CategoryTheory.ι_preservesColimitsIso_inv is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.obj.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) j) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Functor.obj.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) j) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.ι.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.colimit.ι.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (Prefunctor.obj.{succ u1, succ u4, u2, u6} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)) j) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (Prefunctor.obj.{succ u1, succ u4, u2, u6} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)) j) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.ι.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.colimit.ι.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j))
Case conversion may be inaccurate. Consider using '#align category_theory.ι_preserves_colimits_iso_inv CategoryTheory.ι_preservesColimitsIso_invₓ'. -/
@[simp, reassoc.1]
theorem ι_preservesColimitsIso_inv (j : J) :
    colimit.ι _ j ≫ (preservesColimitIso G F).inv = G.map (colimit.ι F j) :=
  IsColimit.comp_coconePointUniqueUpToIso_inv _ (colimit.isColimit (F ⋙ G)) j
#align category_theory.ι_preserves_colimits_iso_inv CategoryTheory.ι_preservesColimitsIso_inv

/- warning: category_theory.ι_preserves_colimits_iso_hom -> CategoryTheory.ι_preservesColimitsIso_hom is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Functor.obj.{u1, u3, u2, u5} J _inst_3 C _inst_1 F j) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.colimit.ι.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j)) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (CategoryTheory.Limits.colimit.ι.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (j : J), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6)) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (Prefunctor.obj.{succ u1, succ u3, u2, u5} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_3)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u1, u3, u2, u5} J _inst_3 C _inst_1 F) j) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.colimit.ι.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 j)) (CategoryTheory.Iso.hom.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6))) (CategoryTheory.Limits.colimit.ι.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 j)
Case conversion may be inaccurate. Consider using '#align category_theory.ι_preserves_colimits_iso_hom CategoryTheory.ι_preservesColimitsIso_homₓ'. -/
@[simp, reassoc.1]
theorem ι_preservesColimitsIso_hom (j : J) :
    G.map (colimit.ι F j) ≫ (preservesColimitIso G F).Hom = colimit.ι (F ⋙ G) j :=
  (PreservesColimit.preserves (colimit.isColimit _)).comp_coconePointUniqueUpToIso_hom _ j
#align category_theory.ι_preserves_colimits_iso_hom CategoryTheory.ι_preservesColimitsIso_hom

/- warning: category_theory.preserves_colimits_iso_inv_comp_desc -> CategoryTheory.preservesColimitsIso_inv_comp_desc is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (t : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (CategoryTheory.Functor.obj.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (CategoryTheory.Functor.map.{u3, u4, u5, u6} C _inst_1 D _inst_2 G (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t) (CategoryTheory.Limits.colimit.desc.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 t))) (CategoryTheory.Limits.colimit.desc.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G t))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] (F : CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) [_inst_4 : CategoryTheory.Limits.PreservesColimit.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 F G] [_inst_5 : CategoryTheory.Limits.HasColimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F] [_inst_6 : CategoryTheory.Limits.HasColimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G)] (t : CategoryTheory.Limits.Cocone.{u1, u3, u2, u5} J _inst_3 C _inst_1 F), Eq.{succ u4} (Quiver.Hom.{succ u4, u6} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t))) (CategoryTheory.CategoryStruct.comp.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t)) (CategoryTheory.Iso.inv.{u4, u6} D _inst_2 (Prefunctor.obj.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5)) (CategoryTheory.Limits.colimit.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6) (CategoryTheory.preservesColimitIso.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 G J _inst_3 F _inst_4 _inst_5 _inst_6)) (Prefunctor.map.{succ u3, succ u4, u5, u6} C (CategoryTheory.CategoryStruct.toQuiver.{u3, u5} C (CategoryTheory.Category.toCategoryStruct.{u3, u5} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u6} D (CategoryTheory.Category.toCategoryStruct.{u4, u6} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u3, u4, u5, u6} C _inst_1 D _inst_2 G) (CategoryTheory.Limits.colimit.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5) (CategoryTheory.Limits.Cocone.pt.{u1, u3, u2, u5} J _inst_3 C _inst_1 F t) (CategoryTheory.Limits.colimit.desc.{u1, u2, u3, u5} J _inst_3 C _inst_1 F _inst_5 t))) (CategoryTheory.Limits.colimit.desc.{u1, u2, u4, u6} J _inst_3 D _inst_2 (CategoryTheory.Functor.comp.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 F G) _inst_6 (CategoryTheory.Functor.mapCocone.{u1, u3, u4, u2, u5, u6} J _inst_3 C _inst_1 D _inst_2 G F t))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_colimits_iso_inv_comp_desc CategoryTheory.preservesColimitsIso_inv_comp_descₓ'. -/
@[simp, reassoc.1]
theorem preservesColimitsIso_inv_comp_desc (t : Cocone F) :
    (preservesColimitIso G F).inv ≫ G.map (colimit.desc _ t) = colimit.desc _ (G.mapCocone t) :=
  by
  ext
  simp [← G.map_comp]
#align category_theory.preserves_colimits_iso_inv_comp_desc CategoryTheory.preservesColimitsIso_inv_comp_desc

variable [PreservesColimitsOfShape J G] [HasColimitsOfShape J D] [HasColimitsOfShape J C]

/- warning: category_theory.preserves_colimit_nat_iso -> CategoryTheory.preservesColimitNatIso is a dubious translation:
lean 3 declaration is
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] [_inst_7 : CategoryTheory.Limits.PreservesColimitsOfShape.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 G] [_inst_8 : CategoryTheory.Limits.HasColimitsOfShape.{u1, u2, u4, u6} J _inst_3 D _inst_2] [_inst_9 : CategoryTheory.Limits.HasColimitsOfShape.{u1, u2, u3, u5} J _inst_3 C _inst_1], CategoryTheory.Iso.{max (max u1 u3 u2 u5) u4, max (max u2 u3) u4 (max u1 u3 u2 u5) u6} (CategoryTheory.Functor.{max u2 u3, u4, max u1 u3 u2 u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.category.{max u2 u3, u4, max u1 u3 u2 u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.comp.{max u2 u3, u3, u4, max u1 u3 u2 u5, u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) C _inst_1 D _inst_2 (CategoryTheory.Limits.colim.{u1, u2, u3, u5} J _inst_3 C _inst_1 _inst_9) G) (CategoryTheory.Functor.comp.{max u2 u3, max u2 u4, u4, max u1 u3 u2 u5, max u1 u4 u2 u6, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2) D _inst_2 (CategoryTheory.Functor.obj.{max u5 u4, max (max u1 u3 u2 u5) u2 u4, max u3 u4 u5 u6, max (max u2 u3) (max u2 u4) (max u1 u3 u2 u5) u1 u4 u2 u6} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max u1 u3 u2 u5, max u1 u4 u2 u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max u1 u3 u2 u5, max u1 u4 u2 u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.whiskeringRight.{u2, u1, u5, u3, u6, u4} J _inst_3 C _inst_1 D _inst_2) G) (CategoryTheory.Limits.colim.{u1, u2, u4, u6} J _inst_3 D _inst_2 _inst_8))
but is expected to have type
  forall {C : Type.{u5}} [_inst_1 : CategoryTheory.Category.{u3, u5} C] {D : Type.{u6}} [_inst_2 : CategoryTheory.Category.{u4, u6} D] (G : CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) {J : Type.{u2}} [_inst_3 : CategoryTheory.Category.{u1, u2} J] [_inst_7 : CategoryTheory.Limits.PreservesColimitsOfShape.{u1, u2, u3, u4, u5, u6} C _inst_1 D _inst_2 J _inst_3 G] [_inst_8 : CategoryTheory.Limits.HasColimitsOfShape.{u1, u2, u4, u6} J _inst_3 D _inst_2] [_inst_9 : CategoryTheory.Limits.HasColimitsOfShape.{u1, u2, u3, u5} J _inst_3 C _inst_1], CategoryTheory.Iso.{max (max (max (max u5 u3) u4) u2) u1, max (max (max u6 (max (max u5 u3) u2) u1) u4) u3 u2} (CategoryTheory.Functor.{max u3 u2, u4, max (max (max u5 u3) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.category.{max u3 u2, u4, max (max (max u5 u3) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) D _inst_2) (CategoryTheory.Functor.comp.{max u3 u2, u3, u4, max (max (max u5 u3) u2) u1, u5, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) C _inst_1 D _inst_2 (CategoryTheory.Limits.colim.{u1, u2, u3, u5} J _inst_3 C _inst_1 _inst_9) G) (CategoryTheory.Functor.comp.{max u3 u2, max u4 u2, u4, max (max (max u5 u3) u2) u1, max (max (max u6 u4) u2) u1, u6} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2) D _inst_2 (Prefunctor.obj.{max (succ u5) (succ u4), max (max (max (max (succ u5) (succ u3)) (succ u4)) (succ u2)) (succ u1), max (max (max u5 u6) u3) u4, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.CategoryStruct.toQuiver.{max u5 u4, max (max (max u5 u6) u3) u4} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Category.toCategoryStruct.{max u5 u4, max (max (max u5 u6) u3) u4} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2))) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.CategoryStruct.toQuiver.{max (max (max (max u5 u3) u4) u2) u1, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Category.toCategoryStruct.{max (max (max (max u5 u3) u4) u2) u1, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max (max (max u2 u5) u1) u3, max (max (max u2 u6) u1) u4} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)))) (CategoryTheory.Functor.toPrefunctor.{max u5 u4, max (max (max (max u5 u3) u4) u2) u1, max (max (max u5 u6) u3) u4, max (max (max (max (max u5 u6) u3) u4) u2) u1} (CategoryTheory.Functor.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u3, u4, u5, u6} C _inst_1 D _inst_2) (CategoryTheory.Functor.{max u2 u3, max u2 u4, max (max (max u5 u2) u3) u1, max (max (max u6 u2) u4) u1} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.Functor.category.{max u2 u3, max u2 u4, max (max (max u2 u5) u1) u3, max (max (max u2 u6) u1) u4} (CategoryTheory.Functor.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.category.{u1, u3, u2, u5} J _inst_3 C _inst_1) (CategoryTheory.Functor.{u1, u4, u2, u6} J _inst_3 D _inst_2) (CategoryTheory.Functor.category.{u1, u4, u2, u6} J _inst_3 D _inst_2)) (CategoryTheory.whiskeringRight.{u2, u1, u5, u3, u6, u4} J _inst_3 C _inst_1 D _inst_2)) G) (CategoryTheory.Limits.colim.{u1, u2, u4, u6} J _inst_3 D _inst_2 _inst_8))
Case conversion may be inaccurate. Consider using '#align category_theory.preserves_colimit_nat_iso CategoryTheory.preservesColimitNatIsoₓ'. -/
/-- If `C, D` has all colimits of shape `J`, and `G` preserves them, then `preserves_colimit_iso`
is functorial wrt `F`. -/
@[simps]
def preservesColimitNatIso : colim ⋙ G ≅ (whiskeringRight J C D).obj G ⋙ colim :=
  NatIso.ofComponents (fun F => preservesColimitIso G F)
    (by
      intro _ _ f
      rw [← iso.inv_comp_eq, ← category.assoc, ← iso.eq_comp_inv]
      ext
      dsimp
      erw [ι_colim_map_assoc]
      simp only [ι_preserves_colimits_iso_inv, whisker_right_app, category.assoc,
        ι_preserves_colimits_iso_inv_assoc, ← G.map_comp]
      erw [ι_colim_map])
#align category_theory.preserves_colimit_nat_iso CategoryTheory.preservesColimitNatIso

end

end CategoryTheory


/-
Copyright (c) 2018 Patrick Massot. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Massot, Johannes Hölzl

! This file was ported from Lean 3 source module topology.algebra.uniform_ring
! leanprover-community/mathlib commit 9a59dcb7a2d06bf55da57b9030169219980660cd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Algebra.Basic
import Mathlib.Topology.Algebra.GroupCompletion
import Mathlib.Topology.Algebra.Ring.Ideal

/-!
# Completion of topological rings:

This files endows the completion of a topological ring with a ring structure.
More precisely the instance `UniformSpace.Completion.ring` builds a ring structure
on the completion of a ring endowed with a compatible uniform structure in the sense of
`UniformAddGroup`. There is also a commutative version when the original ring is commutative.
Moreover, if a topological ring is an algebra over a commutative semiring, then so is its
`UniformSpace.Completion`.

The last part of the file builds a ring structure on the biggest separated quotient of a ring.

## Main declarations:

Beyond the instances explained above (that don't have to be explicitly invoked),
the main constructions deal with continuous ring morphisms.

* `UniformSpace.Completion.extensionHom`: extends a continuous ring morphism from `R`
  to a complete separated group `S` to `Completion R`.
* `UniformSpace.Completion.mapRingHom` : promotes a continuous ring morphism
  from `R` to `S` into a continuous ring morphism from `Completion R` to `Completion S`.

TODO: Generalise the results here from the concrete `Completion` to any `AbstractCompletion`.
-/

open Classical Set Filter TopologicalSpace AddCommGroup

open Classical

noncomputable section

universe u
namespace UniformSpace.Completion

open DenseInducing UniformSpace Function

section one_and_mul
variable (α : Type _) [Ring α] [UniformSpace α]

instance one : One (Completion α) :=
  ⟨(1 : α)⟩

instance mul : Mul (Completion α) :=
  ⟨curry <| (denseInducing_coe.prod denseInducing_coe).extend ((↑) ∘ uncurry (· * ·))⟩

@[norm_cast]
theorem coe_one : ((1 : α) : Completion α) = 1 :=
  rfl
#align uniform_space.completion.coe_one UniformSpace.Completion.coe_one

end one_and_mul

variable {α : Type _} [Ring α] [UniformSpace α] [TopologicalRing α]

@[norm_cast]
theorem coe_mul (a b : α) : ((a * b : α) : Completion α) = a * b :=
  ((denseInducing_coe.prod denseInducing_coe).extend_eq
      ((continuous_coe α).comp (@continuous_mul α _ _ _)) (a, b)).symm
#align uniform_space.completion.coe_mul UniformSpace.Completion.coe_mul

variable [UniformAddGroup α]

theorem continuous_mul : Continuous fun p : Completion α × Completion α => p.1 * p.2 := by
  let m := (AddMonoidHom.mul : α →+ α →+ α).compr₂ toCompl
  have : Continuous fun p : α × α => m p.1 p.2 := by
    apply (continuous_coe α).comp _
    simp only [AddMonoidHom.coe_mul, AddMonoidHom.coe_mul_left]
    exact _root_.continuous_mul
  have di : DenseInducing (toCompl : α → Completion α) := denseInducing_coe
  convert di.extend_Z_bilin di this
#align uniform_space.completion.continuous_mul UniformSpace.Completion.continuous_mul

theorem Continuous.mul {β : Type _} [TopologicalSpace β] {f g : β → Completion α}
    (hf : Continuous f) (hg : Continuous g) : Continuous fun b => f b * g b :=
  Continuous.comp continuous_mul (Continuous.prod_mk hf hg : _)
#align uniform_space.completion.continuous.mul UniformSpace.Completion.Continuous.mul

instance ring : Ring (Completion α) :=
  { AddMonoidWithOne.unary, (inferInstanceAs (AddCommGroup (Completion α))),
      (inferInstanceAs (Mul (Completion α))), (inferInstanceAs (One (Completion α))) with
    zero_mul := fun a =>
      Completion.induction_on a
        (isClosed_eq (Continuous.mul continuous_const continuous_id) continuous_const)
        fun a => by rw [← coe_zero, ← coe_mul, zero_mul]
    mul_zero := fun a =>
      Completion.induction_on a
        (isClosed_eq (Continuous.mul continuous_id continuous_const) continuous_const)
        fun a => by rw [← coe_zero, ← coe_mul, mul_zero]
    one_mul := fun a =>
      Completion.induction_on a
        (isClosed_eq (Continuous.mul continuous_const continuous_id) continuous_id) fun a => by
        rw [← coe_one, ← coe_mul, one_mul]
    mul_one := fun a =>
      Completion.induction_on a
        (isClosed_eq (Continuous.mul continuous_id continuous_const) continuous_id) fun a => by
        rw [← coe_one, ← coe_mul, mul_one]
    mul_assoc := fun a b c =>
      Completion.induction_on₃ a b c
        (isClosed_eq
          (Continuous.mul (Continuous.mul continuous_fst (continuous_fst.comp continuous_snd))
            (continuous_snd.comp continuous_snd))
          (Continuous.mul continuous_fst
            (Continuous.mul (continuous_fst.comp continuous_snd)
              (continuous_snd.comp continuous_snd))))
                fun a b c => by rw [← coe_mul, ← coe_mul, ← coe_mul, ← coe_mul, mul_assoc]
    left_distrib := fun a b c =>
      Completion.induction_on₃ a b c
        (isClosed_eq
          (Continuous.mul continuous_fst
            (Continuous.add (continuous_fst.comp continuous_snd)
              (continuous_snd.comp continuous_snd)))
          (Continuous.add (Continuous.mul continuous_fst (continuous_fst.comp continuous_snd))
            (Continuous.mul continuous_fst (continuous_snd.comp continuous_snd))))
        fun a b c => by rw [← coe_add, ← coe_mul, ← coe_mul, ← coe_mul, ← coe_add, mul_add]
    right_distrib := fun a b c =>
      Completion.induction_on₃ a b c
        (isClosed_eq
          (Continuous.mul (Continuous.add continuous_fst (continuous_fst.comp continuous_snd))
            (continuous_snd.comp continuous_snd))
          (Continuous.add (Continuous.mul continuous_fst (continuous_snd.comp continuous_snd))
            (Continuous.mul (continuous_fst.comp continuous_snd)
              (continuous_snd.comp continuous_snd))))
        fun a b c => by rw [← coe_add, ← coe_mul, ← coe_mul, ← coe_mul, ← coe_add, add_mul] }

/-- The map from a uniform ring to its completion, as a ring homomorphism. -/
def coeRingHom : α →+* Completion α where
  toFun := (↑)
  map_one' := coe_one α
  map_zero' := coe_zero
  map_add' := coe_add
  map_mul' := coe_mul
#align uniform_space.completion.coe_ring_hom UniformSpace.Completion.coeRingHom

theorem continuous_coeRingHom : Continuous (coeRingHom : α → Completion α) :=
  continuous_coe α
#align uniform_space.completion.continuous_coe_ring_hom UniformSpace.Completion.continuous_coeRingHom

variable {β : Type u} [UniformSpace β] [Ring β] [UniformAddGroup β] [TopologicalRing β]
  (f : α →+* β) (hf : Continuous f)

/-- The completion extension as a ring morphism. -/
def extensionHom [CompleteSpace β] [SeparatedSpace β] : Completion α →+* β :=
  have hf' : Continuous (f : α →+ β) := hf
  -- helping the elaborator
  have hf : UniformContinuous f := uniformContinuous_addMonoidHom_of_continuous hf'
  { toFun := Completion.extension f
    map_zero' := by simp_rw [← coe_zero, extension_coe hf, f.map_zero]
    map_add' := fun a b =>
      Completion.induction_on₂ a b
        (isClosed_eq (continuous_extension.comp continuous_add)
          ((continuous_extension.comp continuous_fst).add
            (continuous_extension.comp continuous_snd)))
        fun a b => by
        simp_rw [← coe_add, extension_coe hf, extension_coe hf, extension_coe hf, f.map_add]
    map_one' := by rw [← coe_one, extension_coe hf, f.map_one]
    map_mul' := fun a b =>
      Completion.induction_on₂ a b
        (isClosed_eq (continuous_extension.comp continuous_mul)
          ((continuous_extension.comp continuous_fst).mul
            (continuous_extension.comp continuous_snd)))
        fun a b => by
        simp_rw [← coe_mul, extension_coe hf, extension_coe hf, extension_coe hf, f.map_mul] }
#align uniform_space.completion.extension_hom UniformSpace.Completion.extensionHom

instance topologicalRing : TopologicalRing (Completion α) where
  continuous_add := continuous_add
  continuous_mul := continuous_mul
#align uniform_space.completion.top_ring_compl UniformSpace.Completion.topologicalRing

/-- The completion map as a ring morphism. -/
def mapRingHom (hf : Continuous f) : Completion α →+* Completion β :=
  extensionHom (coeRingHom.comp f) (continuous_coeRingHom.comp hf)
#align uniform_space.completion.map_ring_hom UniformSpace.Completion.mapRingHom

section Algebra

variable (A : Type _) [Ring A] [UniformSpace A] [UniformAddGroup A] [TopologicalRing A] (R : Type _)
  [CommSemiring R] [Algebra R A] [UniformContinuousConstSMul R A]

@[simp]
theorem map_smul_eq_mul_coe (r : R) :
    Completion.map ((· • ·) r) = (· * ·) (algebraMap R A r : Completion A) := by
  ext x
  refine' Completion.induction_on x _ fun a => _
  · exact isClosed_eq Completion.continuous_map (continuous_mul_left _)
  · simp_rw [map_coe (uniformContinuous_const_smul r) a, Algebra.smul_def, coe_mul]
#align uniform_space.completion.map_smul_eq_mul_coe UniformSpace.Completion.map_smul_eq_mul_coe

instance algebra : Algebra R (Completion A) :=
  { (UniformSpace.Completion.coeRingHom : A →+* Completion A).comp (algebraMap R A) with
    commutes' := fun r x =>
      Completion.induction_on x (isClosed_eq (continuous_mul_left _) (continuous_mul_right _))
        fun a => by
        simpa only [coe_mul] using congr_arg ((↑) : A → Completion A) (Algebra.commutes r a)
    smul_def' := fun r x => congr_fun (map_smul_eq_mul_coe A R r) x }

theorem algebraMap_def (r : R) :
    algebraMap R (Completion A) r = (algebraMap R A r : Completion A) :=
  rfl
#align uniform_space.completion.algebra_map_def UniformSpace.Completion.algebraMap_def

end Algebra

section CommRing

variable (R : Type _) [CommRing R] [UniformSpace R] [UniformAddGroup R] [TopologicalRing R]

instance commRing : CommRing (Completion R) :=
  { Completion.ring with
    mul_comm := fun a b =>
      Completion.induction_on₂ a b
        (isClosed_eq (continuous_fst.mul continuous_snd) (continuous_snd.mul continuous_fst))
        fun a b => by rw [← coe_mul, ← coe_mul, mul_comm] }

/-- A shortcut instance for the common case -/
instance algebra' : Algebra R (Completion R) := by infer_instance
#align uniform_space.completion.algebra' UniformSpace.Completion.algebra'

end CommRing

end UniformSpace.Completion

namespace UniformSpace

variable {α : Type _}

theorem ring_sep_quot (α : Type u) [r : CommRing α] [UniformSpace α] [UniformAddGroup α]
    [TopologicalRing α] : Quotient (separationSetoid α) = (α ⧸ (⊥ : Ideal α).closure) := by
  rw [@ring_sep_rel α r]
  rfl
#align uniform_space.ring_sep_quot UniformSpace.ring_sep_quot

/-- Given a topological ring `α` equipped with a uniform structure that makes subtraction uniformly
continuous, get an equivalence between the separated quotient of `α` and the quotient ring
corresponding to the closure of zero. -/
def sepQuotEquivRingQuot (α) [r : CommRing α] [UniformSpace α] [UniformAddGroup α]
    [TopologicalRing α] : Quotient (separationSetoid α) ≃ α ⧸ (⊥ : Ideal α).closure :=
  Quotient.congrRight fun x y =>
    (addGroup_separationRel x y).trans <| Iff.trans (by rfl) (Submodule.quotientRel_r_def _).symm
#align uniform_space.sep_quot_equiv_ring_quot UniformSpace.sepQuotEquivRingQuot

-- TODO: use a form of transport a.k.a. lift definition a.k.a. transfer
instance commRing [CommRing α] [UniformSpace α] [UniformAddGroup α] [TopologicalRing α] :
    CommRing (Quotient (separationSetoid α)) := by
  rw [ring_sep_quot α]; infer_instance
#align uniform_space.comm_ring UniformSpace.commRing

instance topologicalRing [CommRing α] [UniformSpace α] [UniformAddGroup α] [TopologicalRing α] :
    TopologicalRing (Quotient (separationSetoid α)) := by
  convert topologicalRing_quotient (⊥ : Ideal α).closure
  <;> (try congr; apply ring_sep_rel)
  simp [commRing]
#align uniform_space.topological_ring UniformSpace.topologicalRing

end UniformSpace

section UniformExtension

variable {α : Type _} [UniformSpace α] [Semiring α]

variable {β : Type _} [UniformSpace β] [Semiring β] [TopologicalSemiring β]

variable {γ : Type _} [UniformSpace γ] [Semiring γ] [TopologicalSemiring γ]

variable [T2Space γ] [CompleteSpace γ]

/-- The dense inducing extension as a ring homomorphism. -/
noncomputable def DenseInducing.extendRingHom {i : α →+* β} {f : α →+* γ} (ue : UniformInducing i)
    (dr : DenseRange i) (hf : UniformContinuous f) : β →+* γ where
  toFun := (ue.denseInducing dr).extend f
  map_one' := by
    convert DenseInducing.extend_eq (ue.denseInducing dr) hf.continuous 1
    exacts[i.map_one.symm, f.map_one.symm]
  map_zero' := by
    convert DenseInducing.extend_eq (ue.denseInducing dr) hf.continuous 0 <;>
    simp only [map_zero]
  map_add' := by
    have h := (uniformContinuous_uniformly_extend ue dr hf).continuous
    refine' fun x y => DenseRange.induction_on₂ dr _ (fun a b => _) x y
    · exact isClosed_eq (Continuous.comp h continuous_add)
        ((h.comp continuous_fst).add (h.comp continuous_snd))
    · simp_rw [← i.map_add, DenseInducing.extend_eq (ue.denseInducing dr) hf.continuous _,
        ← f.map_add]
  map_mul' := by
    have h := (uniformContinuous_uniformly_extend ue dr hf).continuous
    refine' fun x y => DenseRange.induction_on₂ dr _ (fun a b => _) x y
    · exact isClosed_eq (Continuous.comp h continuous_mul)
        ((h.comp continuous_fst).mul (h.comp continuous_snd))
    · simp_rw [← i.map_mul, DenseInducing.extend_eq (ue.denseInducing dr) hf.continuous _,
        ← f.map_mul]
#align dense_inducing.extend_ring_hom DenseInducing.extendRingHom

end UniformExtension