# The category of "structured arrows" #

For T : C ⥤ D, a T-structured arrow with source S : D is just a morphism S ⟶ T.obj Y, for some Y : C.

These form a category with morphisms g : Y ⟶ Y' making the obvious diagram commute.

We prove that 𝟙 (T.obj Y) is the initial object in T-structured objects with source T.obj Y.

def CategoryTheory.StructuredArrow {C : Type u₁} [] {D : Type u₂} [] (S : D) (T : ) :
Type (max u₁ v₂)

The category of T-structured arrows with domain S : D (here T : C ⥤ D), has as its objects D-morphisms of the form S ⟶ T Y, for some Y : C, and morphisms C-morphisms Y ⟶ Y' making the obvious triangle commute.

Equations
Instances For
instance CategoryTheory.instCategoryStructuredArrow {C : Type u₁} [] {D : Type u₂} [] (S : D) (T : ) :
Equations
• = CategoryTheory.commaCategory
@[simp]
theorem CategoryTheory.StructuredArrow.proj_map {C : Type u₁} [] {D : Type u₂} [] (S : D) (T : ) :
∀ {X Y : } (f : X Y), .map f = f.right
@[simp]
theorem CategoryTheory.StructuredArrow.proj_obj {C : Type u₁} [] {D : Type u₂} [] (S : D) (T : ) :
.obj X = X.right
def CategoryTheory.StructuredArrow.proj {C : Type u₁} [] {D : Type u₂} [] (S : D) (T : ) :

The obvious projection functor from structured arrows.

Equations
Instances For
theorem CategoryTheory.StructuredArrow.hom_ext {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {X : } {Y : } (f : X Y) (g : X Y) (h : f.right = g.right) :
f = g
@[simp]
theorem CategoryTheory.StructuredArrow.hom_eq_iff {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {X : } {Y : } (f : X Y) (g : X Y) :
f = g f.right = g.right
def CategoryTheory.StructuredArrow.mk {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :

Construct a structured arrow from a morphism.

Equations
• = { left := { as := PUnit.unit }, right := Y, hom := f }
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.mk_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :
.left = { as := PUnit.unit }
@[simp]
theorem CategoryTheory.StructuredArrow.mk_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :
.right = Y
@[simp]
theorem CategoryTheory.StructuredArrow.mk_hom_eq_self {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :
= f
@[simp]
theorem CategoryTheory.StructuredArrow.w_assoc {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) {Z : D} (h : T.obj B.right Z) :
@[simp]
theorem CategoryTheory.StructuredArrow.w {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) :
CategoryTheory.CategoryStruct.comp A.hom (T.map f.right) = B.hom
@[simp]
theorem CategoryTheory.StructuredArrow.comp_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {X : } {Y : } {Z : } (f : X Y) (g : Y Z) :
.right = CategoryTheory.CategoryStruct.comp f.right g.right
@[simp]
theorem CategoryTheory.StructuredArrow.id_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (X : ) :
.right =
@[simp]
theorem CategoryTheory.StructuredArrow.eqToHom_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {X : } {Y : } (h : X = Y) :
.right =
@[simp]
theorem CategoryTheory.StructuredArrow.left_eq_id {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {X : } {Y : } (f : X Y) :
f.left =
@[simp]
theorem CategoryTheory.StructuredArrow.homMk_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g) = f'.hom) _auto✝) :
.left =
@[simp]
theorem CategoryTheory.StructuredArrow.homMk_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g) = f'.hom) _auto✝) :
.right = g
def CategoryTheory.StructuredArrow.homMk {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g) = f'.hom) _auto✝) :
f f'

To construct a morphism of structured arrows, we need a morphism of the objects underlying the target, and to check that the triangle commutes.

Equations
• = { left := , right := g, w := }
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.homMk'_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y' : C} {T : } (f : ) (g : f.right Y') :
(f.homMk' g).left =
@[simp]
theorem CategoryTheory.StructuredArrow.homMk'_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y' : C} {T : } (f : ) (g : f.right Y') :
(f.homMk' g).right = g
def CategoryTheory.StructuredArrow.homMk' {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y' : C} {T : } (f : ) (g : f.right Y') :

Given a structured arrow X ⟶ T(Y), and an arrow Y ⟶ Y', we can construct a morphism of structured arrows given by (X ⟶ T(Y)) ⟶ (X ⟶ T(Y) ⟶ T(Y')).

Equations
• f.homMk' g = { left := , right := g, w := }
Instances For
theorem CategoryTheory.StructuredArrow.homMk'_id {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
f.homMk' () =
theorem CategoryTheory.StructuredArrow.homMk'_mk_id {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :
theorem CategoryTheory.StructuredArrow.homMk'_comp {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y' : C} {Y'' : C} {T : } (f : ) (g : f.right Y') (g' : Y' Y'') :
theorem CategoryTheory.StructuredArrow.homMk'_mk_comp {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {Y' : C} {Y'' : C} {T : } (f : S T.obj Y) (g : Y Y') (g' : Y' Y'') :
@[simp]
theorem CategoryTheory.StructuredArrow.mkPostcomp_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {Y' : C} {T : } (f : S T.obj Y) (g : Y Y') :
@[simp]
theorem CategoryTheory.StructuredArrow.mkPostcomp_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {Y' : C} {T : } (f : S T.obj Y) (g : Y Y') :
.right = g
def CategoryTheory.StructuredArrow.mkPostcomp {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {Y' : C} {T : } (f : S T.obj Y) (g : Y Y') :

Variant of homMk' where both objects are applications of mk.

Equations
• = { left := , right := g, w := }
Instances For
theorem CategoryTheory.StructuredArrow.mkPostcomp_id {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {T : } (f : S T.obj Y) :
theorem CategoryTheory.StructuredArrow.mkPostcomp_comp {C : Type u₁} [] {D : Type u₂} [] {S : D} {Y : C} {Y' : C} {Y'' : C} {T : } (f : S T.obj Y) (g : Y Y') (g' : Y' Y'') :
@[simp]
theorem CategoryTheory.StructuredArrow.isoMk_inv_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g.hom) = f'.hom) _auto✝) :
.inv.right = g.inv
@[simp]
theorem CategoryTheory.StructuredArrow.isoMk_hom_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g.hom) = f'.hom) _auto✝) :
.hom.right = g.hom
@[simp]
theorem CategoryTheory.StructuredArrow.isoMk_inv_left_down_down {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g.hom) = f'.hom) _auto✝) :
=
@[simp]
theorem CategoryTheory.StructuredArrow.isoMk_hom_left_down_down {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g.hom) = f'.hom) _auto✝) :
=
def CategoryTheory.StructuredArrow.isoMk {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {f' : } (g : f.right f'.right) (w : autoParam (CategoryTheory.CategoryStruct.comp f.hom (T.map g.hom) = f'.hom) _auto✝) :
f f'

To construct an isomorphism of structured arrows, we need an isomorphism of the objects underlying the target, and to check that the triangle commutes.

Equations
Instances For
theorem CategoryTheory.StructuredArrow.ext {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) (g : A B) :
f.right = g.rightf = g
theorem CategoryTheory.StructuredArrow.ext_iff {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) (g : A B) :
f = g f.right = g.right
instance CategoryTheory.StructuredArrow.proj_faithful {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } :
.Faithful
Equations
• =
theorem CategoryTheory.StructuredArrow.mono_of_mono_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) [h : CategoryTheory.Mono f.right] :

The converse of this is true with additional assumptions, see mono_iff_mono_right.

theorem CategoryTheory.StructuredArrow.epi_of_epi_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A B) [h : CategoryTheory.Epi f.right] :
instance CategoryTheory.StructuredArrow.mono_homMk {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A.right B.right) (w : CategoryTheory.CategoryStruct.comp A.hom (T.map f) = B.hom) [h : ] :
Equations
• =
instance CategoryTheory.StructuredArrow.epi_homMk {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {A : } {B : } (f : A.right B.right) (w : CategoryTheory.CategoryStruct.comp A.hom (T.map f) = B.hom) [h : ] :
Equations
• =
theorem CategoryTheory.StructuredArrow.eq_mk {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :

Eta rule for structured arrows. Prefer StructuredArrow.eta for rewriting, since equality of objects tends to cause problems.

@[simp]
theorem CategoryTheory.StructuredArrow.eta_inv_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
f.eta.inv.right =
@[simp]
theorem CategoryTheory.StructuredArrow.eta_hom_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
f.eta.hom.right =
@[simp]
theorem CategoryTheory.StructuredArrow.eta_inv_left_down_down {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
=
@[simp]
theorem CategoryTheory.StructuredArrow.eta_hom_left_down_down {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
=
def CategoryTheory.StructuredArrow.eta {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :

Eta rule for structured arrows.

Equations
• f.eta =
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.map_map_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') :
∀ {X Y : } (f_1 : X Y), ( f_1).right = f_1.right
@[simp]
theorem CategoryTheory.StructuredArrow.map_map_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') :
∀ {X Y : } (f_1 : X Y), ( f_1).left =
@[simp]
theorem CategoryTheory.StructuredArrow.map_obj_left {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') (X : ) :
( X).left = X.left
@[simp]
theorem CategoryTheory.StructuredArrow.map_obj_right {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') (X : ) :
( X).right = X.right
@[simp]
theorem CategoryTheory.StructuredArrow.map_obj_hom {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') (X : ) :
( X).hom =
def CategoryTheory.StructuredArrow.map {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (f : S S') :

A morphism between source objects S ⟶ S' contravariantly induces a functor between structured arrows, StructuredArrow S' T ⥤ StructuredArrow S T.

Ideally this would be described as a 2-functor from D (promoted to a 2-category with equations as 2-morphisms) to Cat.

Equations
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.map_mk {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {Y : C} {T : } {f : S' T.obj Y} (g : S S') :
@[simp]
theorem CategoryTheory.StructuredArrow.map_id {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } :
@[simp]
theorem CategoryTheory.StructuredArrow.map_comp {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {S'' : D} {T : } {f : S S'} {f' : S' S''} {h : } :
= (.obj h)
def CategoryTheory.StructuredArrow.mapIso {C : Type u₁} [] {D : Type u₂} [] {S : D} {S' : D} {T : } (i : S S') :

An isomorphism S ≅ S' induces an equivalence StructuredArrow S T ≌ StructuredArrow S' T.

Equations
Instances For
def CategoryTheory.StructuredArrow.mapNatIso {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {T' : } (i : T T') :

A natural isomorphism T ≅ T' induces an equivalence StructuredArrow S T ≌ StructuredArrow S T'.

Equations
Instances For
instance CategoryTheory.StructuredArrow.proj_reflectsIsomorphisms {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } :
.ReflectsIsomorphisms
Equations
• =
noncomputable def CategoryTheory.StructuredArrow.mkIdInitial {C : Type u₁} [] {D : Type u₂} [] {Y : C} {T : } [T.Full] [T.Faithful] :

The identity structured arrow is initial.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.pre_obj_right {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) (X : CategoryTheory.Comma (F.comp G)) :
(.obj X).right = F.obj X.right
@[simp]
theorem CategoryTheory.StructuredArrow.pre_obj_hom {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) (X : CategoryTheory.Comma (F.comp G)) :
(.obj X).hom = X.hom
@[simp]
theorem CategoryTheory.StructuredArrow.pre_obj_left {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) (X : CategoryTheory.Comma (F.comp G)) :
(.obj X).left = X.left
@[simp]
theorem CategoryTheory.StructuredArrow.pre_map_right {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) :
∀ {X Y : CategoryTheory.Comma (F.comp G)} (f : X Y), (.map f).right = F.map f.right
@[simp]
theorem CategoryTheory.StructuredArrow.pre_map_left {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) :
∀ {X Y : CategoryTheory.Comma (F.comp G)} (f : X Y), (.map f).left =
def CategoryTheory.StructuredArrow.pre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) :

The functor (S, F ⋙ G) ⥤ (S, G).

Equations
Instances For
instance CategoryTheory.StructuredArrow.instFaithfulCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) [F.Faithful] :
.Faithful
Equations
• =
instance CategoryTheory.StructuredArrow.instFullCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) [F.Full] :
.Full
Equations
• =
instance CategoryTheory.StructuredArrow.instEssSurjCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) [F.EssSurj] :
.EssSurj
Equations
• =
instance CategoryTheory.StructuredArrow.isEquivalence_pre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : D) (F : ) (G : ) [F.IsEquivalence] :
.IsEquivalence

If F is an equivalence, then so is the functor (S, F ⋙ G) ⥤ (S, G).

Equations
• =
@[simp]
theorem CategoryTheory.StructuredArrow.post_obj {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) (X : ) :
@[simp]
theorem CategoryTheory.StructuredArrow.post_map {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) :
∀ {X Y : } (f : X Y), .map f =
def CategoryTheory.StructuredArrow.post {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) :

The functor (S, F) ⥤ (G(S), F ⋙ G).

Equations
• One or more equations did not get rendered due to their size.
Instances For
instance CategoryTheory.StructuredArrow.instFaithfulObjCompPost {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) :
.Faithful
Equations
• =
instance CategoryTheory.StructuredArrow.instFullObjCompPostOfFaithful {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) [G.Faithful] :
.Full
Equations
• =
instance CategoryTheory.StructuredArrow.instEssSurjObjCompPostOfFull {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) [G.Full] :
.EssSurj
Equations
• =
instance CategoryTheory.StructuredArrow.isEquivalence_post {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) [G.Full] [G.Faithful] :
.IsEquivalence

If G is fully faithful, then post S F G : (S, F) ⥤ (G(S), F ⋙ G) is an equivalence.

Equations
• =
@[simp]
theorem CategoryTheory.StructuredArrow.map₂_map_left {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') (φ : X Y) :
(.map φ).left =
@[simp]
theorem CategoryTheory.StructuredArrow.map₂_map_right {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') (φ : X Y) :
(.map φ).right = F.map φ.right
@[simp]
theorem CategoryTheory.StructuredArrow.map₂_obj_right {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') :
(.obj X).right = F.obj X.right
@[simp]
theorem CategoryTheory.StructuredArrow.map₂_obj_left {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') :
(.obj X).left = X.left
@[simp]
theorem CategoryTheory.StructuredArrow.map₂_obj_hom {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') :
(.obj X).hom = CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp (G.map X.hom) (β.app X.right))
def CategoryTheory.StructuredArrow.map₂ {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') :

The functor StructuredArrow L R ⥤ StructuredArrow L' R' that is deduced from a natural transformation R ⋙ G ⟶ F ⋙ R' and a morphism L' ⟶ G.obj L.

Equations
Instances For
instance CategoryTheory.StructuredArrow.faithful_map₂ {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') [F.Faithful] :
.Faithful
Equations
• =
instance CategoryTheory.StructuredArrow.full_map₂ {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') [G.Faithful] [F.Full] :
.Full
Equations
• =
instance CategoryTheory.StructuredArrow.essSurj_map₂ {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') [F.EssSurj] [G.Full] :
.EssSurj
Equations
• =
noncomputable instance CategoryTheory.StructuredArrow.isEquivalenceMap₂ {C : Type u₁} [] {D : Type u₂} [] {A : Type u₃} [] {B : Type u₄} [] {L : D} {R : } {L' : B} {R' : } {F : } {G : } (α : L' G.obj L) (β : R.comp G F.comp R') [F.IsEquivalence] [G.Faithful] [G.Full] :
.IsEquivalence
Equations
• =
instance CategoryTheory.StructuredArrow.small_proj_preimage_of_locallySmall {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {𝒢 : Set C} [] [] :
Equations
• =
@[reducible, inline]
abbrev CategoryTheory.StructuredArrow.IsUniversal {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } (f : ) :
Type (max (max u₁ v₂) v₁)

A structured arrow is called universal if it is initial.

Equations
• f.IsUniversal =
Instances For
theorem CategoryTheory.StructuredArrow.IsUniversal.uniq {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } {g : } (h : f.IsUniversal) (η : f g) :
def CategoryTheory.StructuredArrow.IsUniversal.desc {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) (g : ) :
f.right g.right

The family of morphisms out of a universal arrow.

Equations
• h.desc g = .right
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.IsUniversal.fac_assoc {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) (g : ) {Z : D} (h : T.obj g.right Z) :
@[simp]
theorem CategoryTheory.StructuredArrow.IsUniversal.fac {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) (g : ) :
CategoryTheory.CategoryStruct.comp f.hom (T.map (h.desc g)) = g.hom

Any structured arrow factors through a universal arrow.

theorem CategoryTheory.StructuredArrow.IsUniversal.hom_desc {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) {c : C} (η : f.right c) :
theorem CategoryTheory.StructuredArrow.IsUniversal.hom_ext {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) {c : C} {η : f.right c} {η' : f.right c} (w : CategoryTheory.CategoryStruct.comp f.hom (T.map η) = CategoryTheory.CategoryStruct.comp f.hom (T.map η')) :
η = η'

Two morphisms out of a universal T-structured arrow are equal if their image under T are equal after precomposing the universal arrow.

theorem CategoryTheory.StructuredArrow.IsUniversal.existsUnique {C : Type u₁} [] {D : Type u₂} [] {S : D} {T : } {f : } (h : f.IsUniversal) (g : ) :
∃! η : f.right g.right, CategoryTheory.CategoryStruct.comp f.hom (T.map η) = g.hom
def CategoryTheory.CostructuredArrow {C : Type u₁} [] {D : Type u₂} [] (S : ) (T : D) :
Type (max u₁ v₂)

The category of S-costructured arrows with target T : D (here S : C ⥤ D), has as its objects D-morphisms of the form S Y ⟶ T, for some Y : C, and morphisms C-morphisms Y ⟶ Y' making the obvious triangle commute.

Equations
Instances For
instance CategoryTheory.instCategoryCostructuredArrow {C : Type u₁} [] {D : Type u₂} [] (S : ) (T : D) :
Equations
• = CategoryTheory.commaCategory
@[simp]
theorem CategoryTheory.CostructuredArrow.proj_map {C : Type u₁} [] {D : Type u₂} [] (S : ) (T : D) :
∀ {X Y : } (f : X Y), .map f = f.left
@[simp]
theorem CategoryTheory.CostructuredArrow.proj_obj {C : Type u₁} [] {D : Type u₂} [] (S : ) (T : D) :
.obj X = X.left
def CategoryTheory.CostructuredArrow.proj {C : Type u₁} [] {D : Type u₂} [] (S : ) (T : D) :

The obvious projection functor from costructured arrows.

Equations
Instances For
theorem CategoryTheory.CostructuredArrow.hom_ext {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {X : } {Y : } (f : X Y) (g : X Y) (h : f.left = g.left) :
f = g
@[simp]
theorem CategoryTheory.CostructuredArrow.hom_eq_iff {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {X : } {Y : } (f : X Y) (g : X Y) :
f = g f.left = g.left
def CategoryTheory.CostructuredArrow.mk {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :

Construct a costructured arrow from a morphism.

Equations
• = { left := Y, right := { as := PUnit.unit }, hom := f }
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.mk_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :
.left = Y
@[simp]
theorem CategoryTheory.CostructuredArrow.mk_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :
.right = { as := PUnit.unit }
@[simp]
theorem CategoryTheory.CostructuredArrow.mk_hom_eq_self {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :
= f
theorem CategoryTheory.CostructuredArrow.w_assoc {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) {Z : D} (h : .obj B.right Z) :
theorem CategoryTheory.CostructuredArrow.w {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) :
CategoryTheory.CategoryStruct.comp (S.map f.left) B.hom = A.hom
@[simp]
theorem CategoryTheory.CostructuredArrow.comp_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {X : } {Y : } {Z : } (f : X Y) (g : Y Z) :
@[simp]
theorem CategoryTheory.CostructuredArrow.id_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (X : ) :
@[simp]
theorem CategoryTheory.CostructuredArrow.eqToHom_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {X : } {Y : } (h : X = Y) :
@[simp]
theorem CategoryTheory.CostructuredArrow.right_eq_id {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {X : } {Y : } (f : X Y) :
f.right =
@[simp]
theorem CategoryTheory.CostructuredArrow.homMk_right_down_down {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g) f'.hom = f.hom) _auto✝) :
=
@[simp]
theorem CategoryTheory.CostructuredArrow.homMk_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g) f'.hom = f.hom) _auto✝) :
.left = g
def CategoryTheory.CostructuredArrow.homMk {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g) f'.hom = f.hom) _auto✝) :
f f'

To construct a morphism of costructured arrows, we need a morphism of the objects underlying the source, and to check that the triangle commutes.

Equations
• = { left := g, right := , w := }
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.homMk'_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y' : C} {S : } (f : ) (g : Y' f.left) :
@[simp]
theorem CategoryTheory.CostructuredArrow.homMk'_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y' : C} {S : } (f : ) (g : Y' f.left) :
(f.homMk' g).left = g
def CategoryTheory.CostructuredArrow.homMk' {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y' : C} {S : } (f : ) (g : Y' f.left) :

Given a costructured arrow S(Y) ⟶ X, and an arrow Y' ⟶ Y', we can construct a morphism of costructured arrows given by (S(Y) ⟶ X) ⟶ (S(Y') ⟶ S(Y) ⟶ X).

Equations
Instances For
theorem CategoryTheory.CostructuredArrow.homMk'_id {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
f.homMk' () =
theorem CategoryTheory.CostructuredArrow.homMk'_mk_id {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :
theorem CategoryTheory.CostructuredArrow.homMk'_comp {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y' : C} {Y'' : C} {S : } (f : ) (g : Y' f.left) (g' : Y'' Y') :
theorem CategoryTheory.CostructuredArrow.homMk'_mk_comp {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {Y' : C} {Y'' : C} {S : } (f : S.obj Y T) (g : Y' Y) (g' : Y'' Y') :
@[simp]
theorem CategoryTheory.CostructuredArrow.mkPrecomp_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {Y' : C} {S : } (f : S.obj Y T) (g : Y' Y) :
.right =
@[simp]
theorem CategoryTheory.CostructuredArrow.mkPrecomp_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {Y' : C} {S : } (f : S.obj Y T) (g : Y' Y) :
.left = g
def CategoryTheory.CostructuredArrow.mkPrecomp {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {Y' : C} {S : } (f : S.obj Y T) (g : Y' Y) :

Variant of homMk' where both objects are applications of mk.

Equations
• One or more equations did not get rendered due to their size.
Instances For
theorem CategoryTheory.CostructuredArrow.mkPrecomp_id {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {S : } (f : S.obj Y T) :
theorem CategoryTheory.CostructuredArrow.mkPrecomp_comp {C : Type u₁} [] {D : Type u₂} [] {T : D} {Y : C} {Y' : C} {Y'' : C} {S : } (f : S.obj Y T) (g : Y' Y) (g' : Y'' Y') :
@[simp]
theorem CategoryTheory.CostructuredArrow.isoMk_hom_right_down_down {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g.hom) f'.hom = f.hom) _auto✝) :
=
@[simp]
theorem CategoryTheory.CostructuredArrow.isoMk_hom_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g.hom) f'.hom = f.hom) _auto✝) :
.hom.left = g.hom
@[simp]
theorem CategoryTheory.CostructuredArrow.isoMk_inv_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g.hom) f'.hom = f.hom) _auto✝) :
.inv.left = g.inv
@[simp]
theorem CategoryTheory.CostructuredArrow.isoMk_inv_right_down_down {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g.hom) f'.hom = f.hom) _auto✝) :
=
def CategoryTheory.CostructuredArrow.isoMk {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {f' : } (g : f.left f'.left) (w : autoParam (CategoryTheory.CategoryStruct.comp (S.map g.hom) f'.hom = f.hom) _auto✝) :
f f'

To construct an isomorphism of costructured arrows, we need an isomorphism of the objects underlying the source, and to check that the triangle commutes.

Equations
Instances For
theorem CategoryTheory.CostructuredArrow.ext {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) (g : A B) (h : f.left = g.left) :
f = g
theorem CategoryTheory.CostructuredArrow.ext_iff {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) (g : A B) :
f = g f.left = g.left
instance CategoryTheory.CostructuredArrow.proj_faithful {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } :
.Faithful
Equations
• =
theorem CategoryTheory.CostructuredArrow.mono_of_mono_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) [h : CategoryTheory.Mono f.left] :
theorem CategoryTheory.CostructuredArrow.epi_of_epi_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A B) [h : CategoryTheory.Epi f.left] :

The converse of this is true with additional assumptions, see epi_iff_epi_left.

instance CategoryTheory.CostructuredArrow.mono_homMk {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A.left B.left) (w : CategoryTheory.CategoryStruct.comp (S.map f) B.hom = A.hom) [h : ] :
Equations
• =
instance CategoryTheory.CostructuredArrow.epi_homMk {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : } {B : } (f : A.left B.left) (w : CategoryTheory.CategoryStruct.comp (S.map f) B.hom = A.hom) [h : ] :
Equations
• =
theorem CategoryTheory.CostructuredArrow.eq_mk {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :

Eta rule for costructured arrows. Prefer CostructuredArrow.eta for rewriting, as equality of objects tends to cause problems.

@[simp]
theorem CategoryTheory.CostructuredArrow.eta_hom_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
f.eta.hom.left =
@[simp]
theorem CategoryTheory.CostructuredArrow.eta_inv_right_down_down {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
=
@[simp]
theorem CategoryTheory.CostructuredArrow.eta_hom_right_down_down {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
=
@[simp]
theorem CategoryTheory.CostructuredArrow.eta_inv_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
f.eta.inv.left =
def CategoryTheory.CostructuredArrow.eta {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :

Eta rule for costructured arrows.

Equations
• f.eta =
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.map_obj_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :
( X).right = X.right
@[simp]
theorem CategoryTheory.CostructuredArrow.map_map_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :
∀ {X Y : } (f_1 : X Y), ( f_1).left = f_1.left
@[simp]
theorem CategoryTheory.CostructuredArrow.map_map_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :
∀ {X Y : } (f_1 : X Y), ( f_1).right =
@[simp]
theorem CategoryTheory.CostructuredArrow.map_obj_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :
( X).left = X.left
@[simp]
theorem CategoryTheory.CostructuredArrow.map_obj_hom {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :
( X).hom =
def CategoryTheory.CostructuredArrow.map {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (f : T T') :

A morphism between target objects T ⟶ T' covariantly induces a functor between costructured arrows, CostructuredArrow S T ⥤ CostructuredArrow S T'.

Ideally this would be described as a 2-functor from D (promoted to a 2-category with equations as 2-morphisms) to Cat.

Equations
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.map_mk {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {Y : C} {S : } {f : S.obj Y T} (g : T T') :
@[simp]
theorem CategoryTheory.CostructuredArrow.map_id {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } :
@[simp]
theorem CategoryTheory.CostructuredArrow.map_comp {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {T'' : D} {S : } {f : T T'} {f' : T' T''} {h : } :
= .obj ( h)
def CategoryTheory.CostructuredArrow.mapIso {C : Type u₁} [] {D : Type u₂} [] {T : D} {T' : D} {S : } (i : T T') :

An isomorphism T ≅ T' induces an equivalence CostructuredArrow S T ≌ CostructuredArrow S T'.

Equations
Instances For
def CategoryTheory.CostructuredArrow.mapNatIso {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {S' : } (i : S S') :

A natural isomorphism S ≅ S' induces an equivalence CostrucutredArrow S T ≌ CostructuredArrow S' T.

Equations
Instances For
instance CategoryTheory.CostructuredArrow.proj_reflectsIsomorphisms {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } :
.ReflectsIsomorphisms
Equations
• =
noncomputable def CategoryTheory.CostructuredArrow.mkIdTerminal {C : Type u₁} [] {D : Type u₂} [] {Y : C} {S : } [S.Full] [S.Faithful] :

The identity costructured arrow is terminal.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.pre_map_right {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) :
∀ {X Y : CategoryTheory.Comma (F.comp G) } (f : X Y), (.map f).right =
@[simp]
theorem CategoryTheory.CostructuredArrow.pre_obj_hom {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) (X : CategoryTheory.Comma (F.comp G) ) :
(.obj X).hom = X.hom
@[simp]
theorem CategoryTheory.CostructuredArrow.pre_obj_left {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) (X : CategoryTheory.Comma (F.comp G) ) :
(.obj X).left = F.obj X.left
@[simp]
theorem CategoryTheory.CostructuredArrow.pre_map_left {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) :
∀ {X Y : CategoryTheory.Comma (F.comp G) } (f : X Y), (.map f).left = F.map f.left
@[simp]
theorem CategoryTheory.CostructuredArrow.pre_obj_right {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) (X : CategoryTheory.Comma (F.comp G) ) :
(.obj X).right = X.right
def CategoryTheory.CostructuredArrow.pre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) :

The functor (F ⋙ G, S) ⥤ (G, S).

Equations
Instances For
instance CategoryTheory.CostructuredArrow.instFaithfulCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) [F.Faithful] :
.Faithful
Equations
• =
instance CategoryTheory.CostructuredArrow.instFullCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) [F.Full] :
.Full
Equations
• =
instance CategoryTheory.CostructuredArrow.instEssSurjCompPre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) [F.EssSurj] :
.EssSurj
Equations
• =
instance CategoryTheory.CostructuredArrow.isEquivalence_pre {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : D) [F.IsEquivalence] :
.IsEquivalence

If F is an equivalence, then so is the functor (F ⋙ G, S) ⥤ (G, S).

Equations
• =
@[simp]
theorem CategoryTheory.CostructuredArrow.post_obj {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) (X : ) :
@[simp]
theorem CategoryTheory.CostructuredArrow.post_map {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) :
∀ {X Y : } (f : X Y), .map f =
def CategoryTheory.CostructuredArrow.post {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) :

The functor (F, S) ⥤ (F ⋙ G, G(S)).

Equations
• One or more equations did not get rendered due to their size.
Instances For
instance CategoryTheory.CostructuredArrow.instFaithfulCompObjPost {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) :
.Faithful
Equations
• =
instance CategoryTheory.CostructuredArrow.instFullCompObjPostOfFaithful {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) [G.Faithful] :
.Full
Equations
• =
instance CategoryTheory.CostructuredArrow.instEssSurjCompObjPostOfFull {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (F : ) (G : ) (S : C) [G.Full] :
.EssSurj
Equations
• =
instance CategoryTheory.CostructuredArrow.isEquivalence_post {C : Type u₁} [] {D : Type u₂} [] {B : Type u₄} [] (S : C) (F : ) (G : ) [G.Full] [G.Faithful] :
.IsEquivalence

If G is fully faithful, then post F G S : (F, S) ⥤ (F ⋙ G, G(S)) is an equivalence.

Equations
• =
@[simp]
theorem CategoryTheory.CostructuredArrow.map₂_map_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) (φ : X Y) :
(.map φ).right =
@[simp]
theorem CategoryTheory.CostructuredArrow.map₂_map_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) (φ : X Y) :
(.map φ).left = F.map φ.left
@[simp]
theorem CategoryTheory.CostructuredArrow.map₂_obj_hom {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) :
(.obj X).hom = CategoryTheory.CategoryStruct.comp (α.app X.left) (CategoryTheory.CategoryStruct.comp (G.map X.hom) β)
@[simp]
theorem CategoryTheory.CostructuredArrow.map₂_obj_right {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) :
(.obj X).right = X.right
@[simp]
theorem CategoryTheory.CostructuredArrow.map₂_obj_left {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) :
(.obj X).left = F.obj X.left
def CategoryTheory.CostructuredArrow.map₂ {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) :

The functor CostructuredArrow S T ⥤ CostructuredArrow U V that is deduced from a natural transformation F ⋙ U ⟶ S ⋙ G and a morphism G.obj T ⟶ V

Equations
Instances For
instance CategoryTheory.CostructuredArrow.faithful_map₂ {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) [F.Faithful] :
.Faithful
Equations
• =
instance CategoryTheory.CostructuredArrow.full_map₂ {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) [G.Faithful] [F.Full] :
.Full
Equations
• =
instance CategoryTheory.CostructuredArrow.essSurj_map₂ {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) [F.EssSurj] [G.Full] :
.EssSurj
Equations
• =
noncomputable instance CategoryTheory.CostructuredArrow.isEquivalenceMap₂ {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {A : Type u₃} [] {B : Type u₄} [] {U : } {V : B} {F : } {G : } (α : F.comp U S.comp G) (β : G.obj T V) [F.IsEquivalence] [G.Faithful] [G.Full] :
.IsEquivalence
Equations
• =
instance CategoryTheory.CostructuredArrow.small_proj_preimage_of_locallySmall {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {𝒢 : Set C} [] [] :
Equations
• =
@[reducible, inline]
abbrev CategoryTheory.CostructuredArrow.IsUniversal {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } (f : ) :
Type (max (max u₁ v₂) v₁)

A costructured arrow is called universal if it is terminal.

Equations
• f.IsUniversal =
Instances For
theorem CategoryTheory.CostructuredArrow.IsUniversal.uniq {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } {g : } (h : f.IsUniversal) (η : g f) :
def CategoryTheory.CostructuredArrow.IsUniversal.lift {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) (g : ) :
g.left f.left

The family of morphisms into a universal arrow.

Equations
• h.lift g = .left
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.IsUniversal.fac_assoc {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) (g : ) {Z : D} (h : .obj f.right Z) :
CategoryTheory.CategoryStruct.comp (S.map (h✝.lift g)) () =
@[simp]
theorem CategoryTheory.CostructuredArrow.IsUniversal.fac {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) (g : ) :
CategoryTheory.CategoryStruct.comp (S.map (h.lift g)) f.hom = g.hom

Any costructured arrow factors through a universal arrow.

theorem CategoryTheory.CostructuredArrow.IsUniversal.hom_desc {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) {c : C} (η : c f.left) :
theorem CategoryTheory.CostructuredArrow.IsUniversal.hom_ext {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) {c : C} {η : c f.left} {η' : c f.left} (w : CategoryTheory.CategoryStruct.comp (S.map η) f.hom = CategoryTheory.CategoryStruct.comp (S.map η') f.hom) :
η = η'

Two morphisms into a universal S-costructured arrow are equal if their image under S are equal after postcomposing the universal arrow.

theorem CategoryTheory.CostructuredArrow.IsUniversal.existsUnique {C : Type u₁} [] {D : Type u₂} [] {T : D} {S : } {f : } (h : f.IsUniversal) (g : ) :
∃! η : g.left f.left, CategoryTheory.CategoryStruct.comp (S.map η) f.hom = g.hom
@[simp]
theorem CategoryTheory.Functor.toStructuredArrow_map {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (X : D) (F : ) (f : (Y : E) → X F.obj (G.obj Y)) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (f Y) (F.map (G.map g)) = f Z) :
∀ {X_1 Y : E} (g : X_1 Y), (G.toStructuredArrow X F f h).map g = CategoryTheory.StructuredArrow.homMk (G.map g)
@[simp]
theorem CategoryTheory.Functor.toStructuredArrow_obj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (X : D) (F : ) (f : (Y : E) → X F.obj (G.obj Y)) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (f Y) (F.map (G.map g)) = f Z) (Y : E) :
(G.toStructuredArrow X F f h).obj Y =
def CategoryTheory.Functor.toStructuredArrow {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (X : D) (F : ) (f : (Y : E) → X F.obj (G.obj Y)) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (f Y) (F.map (G.map g)) = f Z) :

Given X : D and F : C ⥤ D, to upgrade a functor G : E ⥤ C to a functor E ⥤ StructuredArrow X F, it suffices to provide maps X ⟶ F.obj (G.obj Y) for all Y making the obvious triangles involving all F.map (G.map g) commute.

This is of course the same as providing a cone over F ⋙ G with cone point X, see Functor.toStructuredArrowIsoToStructuredArrow.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.Functor.toStructuredArrowCompProj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (X : D) (F : ) (f : (Y : E) → X F.obj (G.obj Y)) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (f Y) (F.map (G.map g)) = f Z) :
(G.toStructuredArrow X F f ).comp G

Upgrading a functor E ⥤ C to a functor E ⥤ StructuredArrow X F and composing with the forgetful functor StructuredArrow X F ⥤ C recovers the original functor.

Equations
Instances For
@[simp]
theorem CategoryTheory.Functor.toStructuredArrow_comp_proj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (X : D) (F : ) (f : (Y : E) → X F.obj (G.obj Y)) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (f Y) (F.map (G.map g)) = f Z) :
(G.toStructuredArrow X F f ).comp = G
@[simp]
theorem CategoryTheory.Functor.toCostructuredArrow_map {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (F : ) (X : D) (f : (Y : E) → F.obj (G.obj Y) X) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (F.map (G.map g)) (f Z) = f Y) :
∀ {X_1 Y : E} (g : X_1 Y), (G.toCostructuredArrow F X f h).map g = CategoryTheory.CostructuredArrow.homMk (G.map g)
@[simp]
theorem CategoryTheory.Functor.toCostructuredArrow_obj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (F : ) (X : D) (f : (Y : E) → F.obj (G.obj Y) X) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (F.map (G.map g)) (f Z) = f Y) (Y : E) :
(G.toCostructuredArrow F X f h).obj Y =
def CategoryTheory.Functor.toCostructuredArrow {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (F : ) (X : D) (f : (Y : E) → F.obj (G.obj Y) X) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (F.map (G.map g)) (f Z) = f Y) :

Given F : C ⥤ D and X : D, to upgrade a functor G : E ⥤ C to a functor E ⥤ CostructuredArrow F X, it suffices to provide maps F.obj (G.obj Y) ⟶ X for all Y making the obvious triangles involving all F.map (G.map g) commute.

This is of course the same as providing a cocone over F ⋙ G with cocone point X, see Functor.toCostructuredArrowIsoToCostructuredArrow.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.Functor.toCostructuredArrowCompProj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (F : ) (X : D) (f : (Y : E) → F.obj (G.obj Y) X) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (F.map (G.map g)) (f Z) = f Y) :
(G.toCostructuredArrow F X f ).comp G

Upgrading a functor E ⥤ C to a functor E ⥤ CostructuredArrow F X and composing with the forgetful functor CostructuredArrow F X ⥤ C recovers the original functor.

Equations
Instances For
@[simp]
theorem CategoryTheory.Functor.toCostructuredArrow_comp_proj {C : Type u₁} [] {D : Type u₂} [] {E : Type u₃} [] (G : ) (F : ) (X : D) (f : (Y : E) → F.obj (G.obj Y) X) (h : ∀ {Y Z : E} (g : Y Z), CategoryTheory.CategoryStruct.comp (F.map (G.map g)) (f Z) = f Y) :
(G.toCostructuredArrow F X f ).comp = G
@[simp]
theorem CategoryTheory.StructuredArrow.toCostructuredArrow_obj {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) (X : ) :
@[simp]
theorem CategoryTheory.StructuredArrow.toCostructuredArrow_map {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :
∀ {X Y : } (f : X Y), = CategoryTheory.CostructuredArrow.homMk f.unop.right.op

For a functor F : C ⥤ D and an object d : D, we obtain a contravariant functor from the category of structured arrows d ⟶ F.obj c to the category of costructured arrows F.op.obj c ⟶ (op d).

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.StructuredArrow.toCostructuredArrow'_obj {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) (X : (CategoryTheory.StructuredArrow { unop := d } F.op)ᵒᵖ) :
@[simp]
theorem CategoryTheory.StructuredArrow.toCostructuredArrow'_map {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :
∀ {X Y : (CategoryTheory.StructuredArrow { unop := d } F.op)ᵒᵖ} (f : X Y), = CategoryTheory.CostructuredArrow.homMk f.unop.right.unop

For a functor F : C ⥤ D and an object d : D, we obtain a contravariant functor from the category of structured arrows op d ⟶ F.op.obj c to the category of costructured arrows F.obj c ⟶ d.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.toStructuredArrow_obj {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) (X : ) :
@[simp]
theorem CategoryTheory.CostructuredArrow.toStructuredArrow_map {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :
∀ {X Y : } (f : X Y), = CategoryTheory.StructuredArrow.homMk f.unop.left.op

For a functor F : C ⥤ D and an object d : D, we obtain a contravariant functor from the category of costructured arrows F.obj c ⟶ d to the category of structured arrows op d ⟶ F.op.obj c.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.CostructuredArrow.toStructuredArrow'_obj {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) (X : (CategoryTheory.CostructuredArrow F.op { unop := d })ᵒᵖ) :
@[simp]
theorem CategoryTheory.CostructuredArrow.toStructuredArrow'_map {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :
∀ {X Y : (CategoryTheory.CostructuredArrow F.op { unop := d })ᵒᵖ} (f : X Y), = CategoryTheory.StructuredArrow.homMk f.unop.left.unop

For a functor F : C ⥤ D and an object d : D, we obtain a contravariant functor from the category of costructured arrows F.op.obj c ⟶ op d to the category of structured arrows d ⟶ F.obj c.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.structuredArrowOpEquivalence {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :

For a functor F : C ⥤ D and an object d : D, the category of structured arrows d ⟶ F.obj c is contravariantly equivalent to the category of costructured arrows F.op.obj c ⟶ op d.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.costructuredArrowOpEquivalence {C : Type u₁} [] {D : Type u₂} [] (F : ) (d : D) :

For a functor F : C ⥤ D and an object d : D, the category of costructured arrows F.obj c ⟶ d is contravariantly equivalent to the category of structured arrows op d ⟶ F.op.obj c.

Equations
• One or more equations did not get rendered due to their size.
Instances For