# Cartesian morphisms of arrows
```agda
module foundation.cartesian-morphisms-arrows where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-triangles-of-maps
open import foundation.commuting-triangles-of-morphisms-arrows
open import foundation.cones-over-cospan-diagrams
open import foundation.coproducts-pullbacks
open import foundation.dependent-pair-types
open import foundation.dependent-products-pullbacks
open import foundation.dependent-sums-pullbacks
open import foundation.diagonal-maps-cartesian-products-of-types
open import foundation.equivalences
open import foundation.fibers-of-maps
open import foundation.function-types
open import foundation.functoriality-cartesian-product-types
open import foundation.functoriality-coproduct-types
open import foundation.functoriality-dependent-pair-types
open import foundation.functoriality-fibers-of-maps
open import foundation.homotopies-morphisms-arrows
open import foundation.identity-types
open import foundation.morphisms-arrows
open import foundation.postcomposition-functions
open import foundation.postcomposition-pullbacks
open import foundation.products-pullbacks
open import foundation.pullbacks
open import foundation.standard-pullbacks
open import foundation.unit-type
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.commuting-squares-of-maps
open import foundation-core.homotopies
open import foundation-core.propositions
open import foundation-core.universal-property-pullbacks
```
</details>
## Idea
A [morphism of arrows](foundation.morphisms-arrows.md) `h : f → g` is said to be
{{#concept "cartesian" Disambiguation="morphism of arrows" Agda=is-cartesian-hom-arrow}}
if the [commuting square](foundation-core.commuting-squares-of-maps.md)
```text
i
A -----> X
| |
f | h | g
∨ ∨
B -----> Y
j
```
is a [pullback](foundation.pullbacks.md) square. In this instance, we also say
that `f` is a {{#concept "base change" Disambiguation="maps of types"}} of `g`.
## Definitions
### The predicate of being a cartesian morphism of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (h : hom-arrow f g)
where
is-cartesian-hom-arrow : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
is-cartesian-hom-arrow =
is-pullback (map-codomain-hom-arrow f g h) g (cone-hom-arrow f g h)
is-prop-is-cartesian-hom-arrow : is-prop is-cartesian-hom-arrow
is-prop-is-cartesian-hom-arrow =
is-prop-is-pullback (map-codomain-hom-arrow f g h) g (cone-hom-arrow f g h)
is-cartesian-hom-arrow-Prop : Prop (l1 ⊔ l2 ⊔ l3 ⊔ l4)
pr1 is-cartesian-hom-arrow-Prop = is-cartesian-hom-arrow
pr2 is-cartesian-hom-arrow-Prop = is-prop-is-cartesian-hom-arrow
```
### The type of cartesian morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y)
where
cartesian-hom-arrow : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
cartesian-hom-arrow = Σ (hom-arrow f g) (is-cartesian-hom-arrow f g)
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (h : cartesian-hom-arrow f g)
where
hom-arrow-cartesian-hom-arrow : hom-arrow f g
hom-arrow-cartesian-hom-arrow = pr1 h
is-cartesian-cartesian-hom-arrow :
is-cartesian-hom-arrow f g hom-arrow-cartesian-hom-arrow
is-cartesian-cartesian-hom-arrow = pr2 h
map-domain-cartesian-hom-arrow : A → X
map-domain-cartesian-hom-arrow =
map-domain-hom-arrow f g hom-arrow-cartesian-hom-arrow
map-codomain-cartesian-hom-arrow : B → Y
map-codomain-cartesian-hom-arrow =
map-codomain-hom-arrow f g hom-arrow-cartesian-hom-arrow
coh-cartesian-hom-arrow :
coherence-square-maps
( map-domain-cartesian-hom-arrow)
( f)
( g)
( map-codomain-cartesian-hom-arrow)
coh-cartesian-hom-arrow =
coh-hom-arrow f g hom-arrow-cartesian-hom-arrow
cone-cartesian-hom-arrow :
cone map-codomain-cartesian-hom-arrow g A
cone-cartesian-hom-arrow =
cone-hom-arrow f g hom-arrow-cartesian-hom-arrow
universal-property-cartesian-hom-arrow :
universal-property-pullback
( map-codomain-cartesian-hom-arrow)
( g)
( cone-cartesian-hom-arrow)
universal-property-cartesian-hom-arrow =
universal-property-pullback-is-pullback
( map-codomain-cartesian-hom-arrow)
( g)
( cone-cartesian-hom-arrow)
( is-cartesian-cartesian-hom-arrow)
```
## Properties
### Cartesian morphisms of arrows arising from standard pullbacks
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X)
where
standard-pullback-cartesian-hom-arrow :
cartesian-hom-arrow vertical-map-standard-pullback g
standard-pullback-cartesian-hom-arrow =
( hom-arrow-cone f g (cone-standard-pullback f g) , is-equiv-id)
```
### Cartesian morphisms of arrows arising from fibers
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) (y : B)
where
fiber-cartesian-hom-arrow :
cartesian-hom-arrow (terminal-map (fiber f y)) f
pr1 fiber-cartesian-hom-arrow =
hom-arrow-cone (point y) f (swap-cone f (point y) (cone-fiber f y))
pr2 fiber-cartesian-hom-arrow =
is-pullback-swap-cone f (point y)
( cone-fiber f y)
( is-pullback-cone-fiber f y)
```
### The induced family of equivalences of fibers of cartesian morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (h : cartesian-hom-arrow f g)
where
equiv-fibers-cartesian-hom-arrow :
(b : B) → fiber f b ≃ fiber g (map-codomain-cartesian-hom-arrow f g h b)
equiv-fibers-cartesian-hom-arrow b =
( map-fiber-vertical-map-cone
( map-codomain-cartesian-hom-arrow f g h)
( g)
( cone-cartesian-hom-arrow f g h)
( b)) ,
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( map-codomain-cartesian-hom-arrow f g h)
( g)
( cone-cartesian-hom-arrow f g h)
( is-cartesian-cartesian-hom-arrow f g h)
( b))
```
### Transposing cartesian morphisms of arrows
The {{#concept "transposition" Disambiguation="cartesian morphism of arrows"}}
of a cartesian morphism of arrows
```text
i
A -----> X
| ⌟ |
f | | g
∨ ∨
B -----> Y
j
```
is the cartesian morphism of arrows
```text
f
A -----> B
| ⌟ |
i | | j
∨ ∨
X -----> Y.
g
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : cartesian-hom-arrow f g)
where
is-cartesian-transpose-cartesian-hom-arrow :
is-cartesian-hom-arrow
( map-domain-cartesian-hom-arrow f g α)
( map-codomain-cartesian-hom-arrow f g α)
( transpose-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α))
is-cartesian-transpose-cartesian-hom-arrow =
is-pullback-swap-cone
( map-codomain-cartesian-hom-arrow f g α)
( g)
( cone-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow f g α)
transpose-cartesian-hom-arrow :
cartesian-hom-arrow
( map-domain-cartesian-hom-arrow f g α)
( map-codomain-cartesian-hom-arrow f g α)
transpose-cartesian-hom-arrow =
( transpose-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α) ,
is-cartesian-transpose-cartesian-hom-arrow)
```
### If the target of a cartesian morphism is an equivalence then so is the source
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : cartesian-hom-arrow f g)
where
is-equiv-source-is-equiv-target-cartesian-hom-arrow : is-equiv g → is-equiv f
is-equiv-source-is-equiv-target-cartesian-hom-arrow G =
is-equiv-vertical-map-is-pullback
( map-codomain-cartesian-hom-arrow f g α)
( g)
( cone-cartesian-hom-arrow f g α)
( G)
( is-cartesian-cartesian-hom-arrow f g α)
```
### If the target and source of a morphism of arrows are equivalences then the morphism is cartesian
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
is-cartesian-hom-arrow-is-equiv-source-is-equiv-target :
is-equiv g → is-equiv f → is-cartesian-hom-arrow f g α
is-cartesian-hom-arrow-is-equiv-source-is-equiv-target =
is-pullback-is-equiv-vertical-maps
( map-codomain-hom-arrow f g α)
( g)
( cone-hom-arrow f g α)
```
### Cartesian morphisms of arrows are preserved under homotopies of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
where
abstract
is-cartesian-hom-arrow-htpy :
{f f' : A → B} (F' : f' ~ f) {g g' : X → Y} (G : g ~ g')
(α : hom-arrow f g) →
is-cartesian-hom-arrow f g α →
is-cartesian-hom-arrow f' g' (hom-arrow-htpy F' G α)
is-cartesian-hom-arrow-htpy {f} F' {g} G α =
is-pullback-htpy
( refl-htpy)
( inv-htpy G)
( cone-hom-arrow f g α)
( ( F') ,
( refl-htpy) ,
( ( assoc-htpy
( map-codomain-hom-arrow f g α ·l F' ∙h coh-hom-arrow f g α)
( G ·r map-domain-hom-arrow f g α)
( inv-htpy (G ·r map-domain-hom-arrow f g α))) ∙h
( ap-concat-htpy
( map-codomain-hom-arrow f g α ·l F' ∙h coh-hom-arrow f g α)
( right-inv-htpy G ·r map-domain-hom-arrow f g α)) ∙h
( right-unit-htpy) ∙h
( ap-concat-htpy' (coh-hom-arrow f g α) inv-htpy-right-unit-htpy)))
cartesian-hom-arrow-htpy :
{f f' : A → B} (F' : f' ~ f) {g g' : X → Y} (G : g ~ g') →
cartesian-hom-arrow f g → cartesian-hom-arrow f' g'
cartesian-hom-arrow-htpy F' G (α , H) =
( hom-arrow-htpy F' G α , is-cartesian-hom-arrow-htpy F' G α H)
```
### Cartesian morphisms of arrows are preserved under homotopies of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y)
where
abstract
is-cartesian-htpy-hom-arrow :
(α β : hom-arrow f g)
(H : htpy-hom-arrow f g β α) →
is-cartesian-hom-arrow f g α →
is-cartesian-hom-arrow f g β
is-cartesian-htpy-hom-arrow α β H =
is-pullback-htpy
( htpy-codomain-htpy-hom-arrow f g β α H)
( refl-htpy)
( cone-hom-arrow f g α)
( htpy-parallell-cone-htpy-hom-arrow f g β α H)
```
### The identity cartesian morphism of arrows
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
where
is-cartesian-id-hom-arrow : is-cartesian-hom-arrow f f id-hom-arrow
is-cartesian-id-hom-arrow =
is-pullback-is-equiv-horizontal-maps id f
( f , id , refl-htpy)
( is-equiv-id)
( is-equiv-id)
id-cartesian-hom-arrow : cartesian-hom-arrow f f
id-cartesian-hom-arrow = (id-hom-arrow , is-cartesian-id-hom-arrow)
```
### Composition of cartesian morphisms of arrows
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V) (b : hom-arrow g h) (a : hom-arrow f g)
where
is-cartesian-comp-hom-arrow :
is-cartesian-hom-arrow g h b →
is-cartesian-hom-arrow f g a →
is-cartesian-hom-arrow f h (comp-hom-arrow f g h b a)
is-cartesian-comp-hom-arrow =
is-pullback-rectangle-is-pullback-left-square
( map-codomain-hom-arrow f g a)
( map-codomain-hom-arrow g h b)
( h)
( cone-hom-arrow g h b)
( cone-hom-arrow f g a)
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(b : cartesian-hom-arrow g h) (a : cartesian-hom-arrow f g)
where
comp-cartesian-hom-arrow : cartesian-hom-arrow f h
comp-cartesian-hom-arrow =
( ( comp-hom-arrow f g h
( hom-arrow-cartesian-hom-arrow g h b)
( hom-arrow-cartesian-hom-arrow f g a)) ,
( is-cartesian-comp-hom-arrow f g h
( hom-arrow-cartesian-hom-arrow g h b)
( hom-arrow-cartesian-hom-arrow f g a)
( is-cartesian-cartesian-hom-arrow g h b)
( is-cartesian-cartesian-hom-arrow f g a)))
```
### Left cancellation of cartesian morphisms of arrows
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V) (b : hom-arrow g h) (a : hom-arrow f g)
where
is-cartesian-hom-arrow-right-factor :
is-cartesian-hom-arrow g h b →
is-cartesian-hom-arrow f h (comp-hom-arrow f g h b a) →
is-cartesian-hom-arrow f g a
is-cartesian-hom-arrow-right-factor =
is-pullback-left-square-is-pullback-rectangle
( map-codomain-hom-arrow f g a)
( map-codomain-hom-arrow g h b)
( h)
( cone-hom-arrow g h b)
( cone-hom-arrow f g a)
```
### The left morphism in a commuting triangle of morphisms of arrows is cartesian if the other two are
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(left : hom-arrow f h) (right : hom-arrow g h) (top : hom-arrow f g)
(H : coherence-triangle-hom-arrow f g h left right top)
where
abstract
is-cartesian-left-hom-arrow-triangle :
is-cartesian-hom-arrow g h right →
is-cartesian-hom-arrow f g top →
is-cartesian-hom-arrow f h left
is-cartesian-left-hom-arrow-triangle R T =
is-cartesian-htpy-hom-arrow f h
( comp-hom-arrow f g h right top)
( left)
( H)
( is-cartesian-comp-hom-arrow f g h right top R T)
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(top : cartesian-hom-arrow f g)
(left : hom-arrow f h)
(right : cartesian-hom-arrow g h)
(H :
coherence-triangle-hom-arrow f g h
( left)
( hom-arrow-cartesian-hom-arrow g h right)
( hom-arrow-cartesian-hom-arrow f g top))
where
abstract
is-cartesian-left-cartesian-hom-arrow-triangle :
is-cartesian-hom-arrow f h left
is-cartesian-left-cartesian-hom-arrow-triangle =
is-cartesian-left-hom-arrow-triangle f g h
( left)
( hom-arrow-cartesian-hom-arrow g h right)
( hom-arrow-cartesian-hom-arrow f g top)
( H)
( is-cartesian-cartesian-hom-arrow g h right)
( is-cartesian-cartesian-hom-arrow f g top)
```
### The top morphism in a commuting triangle of morphisms of arrows is cartesian if the other two are
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(left : hom-arrow f h) (right : hom-arrow g h) (top : hom-arrow f g)
where
abstract
is-cartesian-top-hom-arrow-triangle' :
(H : coherence-triangle-hom-arrow' f g h left right top) →
is-cartesian-hom-arrow g h right →
is-cartesian-hom-arrow f h left →
is-cartesian-hom-arrow f g top
is-cartesian-top-hom-arrow-triangle' H R L =
is-cartesian-hom-arrow-right-factor f g h right top R
( is-cartesian-htpy-hom-arrow f h
( left)
( comp-hom-arrow f g h right top)
( H)
( L))
abstract
is-cartesian-top-hom-arrow-triangle :
(H : coherence-triangle-hom-arrow f g h left right top) →
is-cartesian-hom-arrow g h right →
is-cartesian-hom-arrow f h left →
is-cartesian-hom-arrow f g top
is-cartesian-top-hom-arrow-triangle H =
is-cartesian-top-hom-arrow-triangle'
( inv-htpy-hom-arrow f h left (comp-hom-arrow f g h right top) H)
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(top : hom-arrow f g)
(left : cartesian-hom-arrow f h)
(right : cartesian-hom-arrow g h)
where
abstract
is-cartesian-top-cartesian-hom-arrow-triangle' :
(H :
coherence-triangle-hom-arrow' f g h
( hom-arrow-cartesian-hom-arrow f h left)
( hom-arrow-cartesian-hom-arrow g h right)
( top)) →
is-cartesian-hom-arrow f g top
is-cartesian-top-cartesian-hom-arrow-triangle' H =
is-cartesian-top-hom-arrow-triangle' f g h
( hom-arrow-cartesian-hom-arrow f h left)
( hom-arrow-cartesian-hom-arrow g h right)
( top)
( H)
( is-cartesian-cartesian-hom-arrow g h right)
( is-cartesian-cartesian-hom-arrow f h left)
abstract
is-cartesian-top-cartesian-hom-arrow-triangle :
(H :
coherence-triangle-hom-arrow f g h
( hom-arrow-cartesian-hom-arrow f h left)
( hom-arrow-cartesian-hom-arrow g h right)
( top)) →
is-cartesian-hom-arrow f g top
is-cartesian-top-cartesian-hom-arrow-triangle H =
is-cartesian-top-hom-arrow-triangle f g h
( hom-arrow-cartesian-hom-arrow f h left)
( hom-arrow-cartesian-hom-arrow g h right)
( top)
( H)
( is-cartesian-cartesian-hom-arrow g h right)
( is-cartesian-cartesian-hom-arrow f h left)
```
### Dependent products of cartesian morphisms of arrows
Given a family of cartesian morphisms of arrows `αᵢ : fᵢ → gᵢ`, then there is a
cartesian morphism of arrows `map-Π f → map-Π g`.
```agda
module _
{l1 l2 l3 l4 l5 : Level}
{I : UU l5} {A : I → UU l1} {B : I → UU l2} {X : I → UU l3} {Y : I → UU l4}
(f : (i : I) → A i → B i) (g : (i : I) → X i → Y i)
(α : (i : I) → cartesian-hom-arrow (f i) (g i))
where
hom-arrow-Π-cartesian-hom-arrow :
hom-arrow (map-Π f) (map-Π g)
hom-arrow-Π-cartesian-hom-arrow =
Π-hom-arrow f g (λ i → hom-arrow-cartesian-hom-arrow (f i) (g i) (α i))
is-cartesian-Π-cartesian-hom-arrow :
is-cartesian-hom-arrow (map-Π f) (map-Π g) hom-arrow-Π-cartesian-hom-arrow
is-cartesian-Π-cartesian-hom-arrow =
is-pullback-Π
( λ i → map-codomain-cartesian-hom-arrow (f i) (g i) (α i))
( g)
( λ i → cone-cartesian-hom-arrow (f i) (g i) (α i))
( λ i → is-cartesian-cartesian-hom-arrow (f i) (g i) (α i))
Π-cartesian-hom-arrow :
cartesian-hom-arrow (map-Π f) (map-Π g)
pr1 Π-cartesian-hom-arrow = hom-arrow-Π-cartesian-hom-arrow
pr2 Π-cartesian-hom-arrow = is-cartesian-Π-cartesian-hom-arrow
```
### Dependent sums of cartesian morphisms of arrows
Given a family of cartesian morphisms of arrows `αᵢ : fᵢ → gᵢ`, then there is a
cartesian morphism of arrows `tot f → tot g`.
```agda
module _
{l1 l2 l3 l4 l5 : Level}
{I : UU l5} {A : I → UU l1} {B : I → UU l2} {X : I → UU l3} {Y : I → UU l4}
(f : (i : I) → A i → B i) (g : (i : I) → X i → Y i)
(α : (i : I) → cartesian-hom-arrow (f i) (g i))
where
hom-arrow-tot-cartesian-hom-arrow :
hom-arrow (tot f) (tot g)
hom-arrow-tot-cartesian-hom-arrow =
tot-hom-arrow f g (λ i → hom-arrow-cartesian-hom-arrow (f i) (g i) (α i))
is-cartesian-tot-cartesian-hom-arrow :
is-cartesian-hom-arrow (tot f) (tot g) hom-arrow-tot-cartesian-hom-arrow
is-cartesian-tot-cartesian-hom-arrow =
is-pullback-tot-is-pullback-family-id-cone
( λ i → map-codomain-cartesian-hom-arrow (f i) (g i) (α i))
( g)
( λ i → cone-cartesian-hom-arrow (f i) (g i) (α i))
( λ i → is-cartesian-cartesian-hom-arrow (f i) (g i) (α i))
tot-cartesian-hom-arrow :
cartesian-hom-arrow (tot f) (tot g)
pr1 tot-cartesian-hom-arrow = hom-arrow-tot-cartesian-hom-arrow
pr2 tot-cartesian-hom-arrow = is-cartesian-tot-cartesian-hom-arrow
```
### Cartesian morphisms of arrows are preserved under products
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
{C : UU l5} {D : UU l6} {Z : UU l7} {W : UU l8}
(f : A → B) (g : X → Y) (h : C → D) (i : Z → W)
(α : cartesian-hom-arrow f g) (β : cartesian-hom-arrow h i)
where
is-cartesian-product-cartesian-hom-arrow :
is-cartesian-hom-arrow
( map-product f h)
( map-product g i)
( product-hom-arrow f g h i
( hom-arrow-cartesian-hom-arrow f g α)
( hom-arrow-cartesian-hom-arrow h i β))
is-cartesian-product-cartesian-hom-arrow =
is-pullback-product-is-pullback
( map-codomain-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α))
( g)
( map-codomain-hom-arrow h i (hom-arrow-cartesian-hom-arrow h i β))
( i)
( cone-cartesian-hom-arrow f g α)
( cone-cartesian-hom-arrow h i β)
( is-cartesian-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow h i β)
product-cartesian-hom-arrow :
cartesian-hom-arrow (map-product f h) (map-product g i)
product-cartesian-hom-arrow =
( ( product-hom-arrow f g h i
( hom-arrow-cartesian-hom-arrow f g α)
( hom-arrow-cartesian-hom-arrow h i β)) ,
( is-cartesian-product-cartesian-hom-arrow))
```
### Cartesian morphisms of arrows are preserved under coproducts
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
{C : UU l5} {D : UU l6} {Z : UU l7} {W : UU l8}
(f : A → B) (g : X → Y) (h : C → D) (i : Z → W)
(α : cartesian-hom-arrow f g) (β : cartesian-hom-arrow h i)
where
is-cartesian-coproduct-cartesian-hom-arrow :
is-cartesian-hom-arrow
( map-coproduct f h)
( map-coproduct g i)
( coproduct-hom-arrow f g h i
( hom-arrow-cartesian-hom-arrow f g α)
( hom-arrow-cartesian-hom-arrow h i β))
is-cartesian-coproduct-cartesian-hom-arrow =
is-pullback-coproduct-is-pullback
( map-codomain-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α))
( g)
( map-codomain-hom-arrow h i (hom-arrow-cartesian-hom-arrow h i β))
( i)
( cone-cartesian-hom-arrow f g α)
( cone-cartesian-hom-arrow h i β)
( is-cartesian-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow h i β)
coproduct-cartesian-hom-arrow :
cartesian-hom-arrow (map-coproduct f h) (map-coproduct g i)
coproduct-cartesian-hom-arrow =
( ( coproduct-hom-arrow f g h i
( hom-arrow-cartesian-hom-arrow f g α)
( hom-arrow-cartesian-hom-arrow h i β)) ,
( is-cartesian-coproduct-cartesian-hom-arrow))
```
### Cartesian morphisms of arrows are preserved under exponentiation
```agda
module _
{l1 l2 l3 l4 l5 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : cartesian-hom-arrow f g) (S : UU l5)
where
hom-arrow-postcomp-cartesian-hom-arrow :
hom-arrow (postcomp S f) (postcomp S g)
hom-arrow-postcomp-cartesian-hom-arrow =
postcomp-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α) S
is-cartesian-postcomp-cartesian-hom-arrow :
is-cartesian-hom-arrow
( postcomp S f)
( postcomp S g)
( hom-arrow-postcomp-cartesian-hom-arrow)
is-cartesian-postcomp-cartesian-hom-arrow =
is-pullback-postcomp-is-pullback
( map-codomain-cartesian-hom-arrow f g α)
( g)
( cone-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow f g α)
( S)
postcomp-cartesian-hom-arrow :
cartesian-hom-arrow (postcomp S f) (postcomp S g)
pr1 postcomp-cartesian-hom-arrow =
hom-arrow-postcomp-cartesian-hom-arrow
pr2 postcomp-cartesian-hom-arrow = is-cartesian-postcomp-cartesian-hom-arrow
```
### A folding operation on cartesian morphisms of arrows
A morphism of arrows
```text
i
A ------> X
| |
f | | g
∨ ∨
B ------> Y
j
```
is cartesian if and only if either of the folded morphisms
```text
(f , i) (f , i)
A ------> B × X A ------> B × X
| | | |
g ∘ i | | j × g j ∘ f | | j × g
∨ ∨ ∨ ∨
Y ------> Y × Y Y ------> Y × Y
Δ Δ
```
is.
It remains to formalize the right-hand version.
```agda
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y)
(α : hom-arrow f g)
where
transpose-fold-hom-arrow :
hom-arrow
( λ x → (f x , map-domain-hom-arrow f g α x))
( diagonal-product Y)
transpose-fold-hom-arrow =
hom-arrow-cone
( map-product (map-codomain-hom-arrow f g α) g)
( diagonal-product Y)
( fold-cone (map-codomain-hom-arrow f g α) g (cone-hom-arrow f g α))
fold-hom-arrow :
hom-arrow
( g ∘ map-domain-hom-arrow f g α)
( map-product (map-codomain-hom-arrow f g α) g)
fold-hom-arrow =
transpose-hom-arrow
( λ a → f a , map-domain-hom-arrow f g α a)
( diagonal-product Y)
( transpose-fold-hom-arrow)
is-cartesian-transpose-fold-hom-arrow :
is-cartesian-hom-arrow f g α →
is-cartesian-hom-arrow
( λ x → (f x , map-domain-hom-arrow f g α x))
( diagonal-product Y)
( transpose-fold-hom-arrow)
is-cartesian-transpose-fold-hom-arrow =
is-pullback-fold-cone-is-pullback
( map-codomain-hom-arrow f g α)
( g)
( cone-hom-arrow f g α)
is-cartesian-is-cartesian-transpose-fold-hom-arrow :
is-cartesian-hom-arrow
( λ x → (f x , map-domain-hom-arrow f g α x))
( diagonal-product Y)
( transpose-fold-hom-arrow) →
is-cartesian-hom-arrow f g α
is-cartesian-is-cartesian-transpose-fold-hom-arrow =
is-pullback-is-pullback-fold-cone
( map-codomain-hom-arrow f g α)
( g)
( cone-hom-arrow f g α)
is-cartesian-fold-hom-arrow :
is-cartesian-hom-arrow f g α →
is-cartesian-hom-arrow
( g ∘ map-domain-hom-arrow f g α)
( map-product (map-codomain-hom-arrow f g α) g)
( fold-hom-arrow)
is-cartesian-fold-hom-arrow H =
is-cartesian-transpose-cartesian-hom-arrow
( λ x → (f x , map-domain-hom-arrow f g α x))
( diagonal-product Y)
( transpose-fold-hom-arrow , is-cartesian-transpose-fold-hom-arrow H)
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y)
(α : cartesian-hom-arrow f g)
where
transpose-fold-cartesian-hom-arrow :
cartesian-hom-arrow
( λ x → (f x , map-domain-cartesian-hom-arrow f g α x))
( diagonal-product Y)
pr1 transpose-fold-cartesian-hom-arrow =
transpose-fold-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α)
pr2 transpose-fold-cartesian-hom-arrow =
is-cartesian-transpose-fold-hom-arrow f g
( hom-arrow-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow f g α)
fold-cartesian-hom-arrow :
cartesian-hom-arrow
( g ∘ map-domain-cartesian-hom-arrow f g α)
( map-product (map-codomain-cartesian-hom-arrow f g α) g)
pr1 fold-cartesian-hom-arrow =
fold-hom-arrow f g (hom-arrow-cartesian-hom-arrow f g α)
pr2 fold-cartesian-hom-arrow =
is-cartesian-fold-hom-arrow f g
( hom-arrow-cartesian-hom-arrow f g α)
( is-cartesian-cartesian-hom-arrow f g α)
```
### Lifting cartesian morphisms along lifts of the codomain
Suppose given a cospan diagram of arrows
```text
A ------> C <------ B
| | ⌞ |
f | α h β | g
∨ ∨ ∨
A' -----> C' <----- B'
```
where `β` is cartesian. Moreover, suppose we have a map `i : A' → B'` from the
codomain of the source of `α` to the codomain of the source of `β` such that the
triangle
```text
i
A' ---> B'
\ /
\ /
∨ ∨
C'
```
commutes. Then there is a unique morphism of arrows `γ : f → g` with a homotopy
`β ~ α ∘ γ` extending the triangle, and this morphism is cartesian if and only
if `α` is.
**Proof.** The unique existence of `γ` and the homotopy follows from the
pullback property of `β`. The rest is a reiteration of the 3-for-2 property of
cartesian morphisms.
We begin by constructing the commuting triangle of morphisms of arrows:
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {A' : UU l2} {B : UU l3} {B' : UU l4} {C : UU l5} {C' : UU l6}
(f : A → A') (g : B → B') (h : C → C')
(β : cartesian-hom-arrow g h)
(α : hom-arrow f h)
(i : A' → B')
(H :
coherence-triangle-maps'
( map-codomain-hom-arrow f h α)
( map-codomain-cartesian-hom-arrow g h β)
( i))
where
cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow :
cone (map-codomain-cartesian-hom-arrow g h β) h A
cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
( i ∘ f , map-domain-hom-arrow f h α , H ·r f ∙h coh-hom-arrow f h α)
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow : A → B
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( is-cartesian-cartesian-hom-arrow g h β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)
hom-arrow-lift-map-codomain-cartesian-hom-arrow : hom-arrow f g
pr1 hom-arrow-lift-map-codomain-cartesian-hom-arrow =
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow
pr1 (pr2 hom-arrow-lift-map-codomain-cartesian-hom-arrow) = i
pr2 (pr2 hom-arrow-lift-map-codomain-cartesian-hom-arrow) =
inv-htpy
( htpy-vertical-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( is-cartesian-cartesian-hom-arrow g h β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow))
abstract
inv-coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow :
coherence-triangle-hom-arrow' f g h
( α)
( hom-arrow-cartesian-hom-arrow g h β)
( hom-arrow-lift-map-codomain-cartesian-hom-arrow)
inv-coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
( htpy-horizontal-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( is-cartesian-cartesian-hom-arrow g h β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)) ,
( H) ,
( ( ap-concat-htpy'
( ( h) ·l
( htpy-horizontal-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( pr2 β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)))
( ap-concat-htpy'
( coh-cartesian-hom-arrow g h β ·r
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow)
( left-whisker-inv-htpy
( map-codomain-cartesian-hom-arrow g h β)
( htpy-vertical-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( pr2 β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow))))) ∙h
( assoc-htpy
( inv-htpy
( ( map-codomain-cartesian-hom-arrow g h β) ·l
( htpy-vertical-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( pr2 β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow))))
( coh-cartesian-hom-arrow g h β ·r
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow)
( ( h) ·l
( htpy-horizontal-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( pr2 β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)))) ∙h
( inv-htpy-left-transpose-htpy-concat
( ( map-codomain-cartesian-hom-arrow g h β) ·l
( htpy-vertical-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( pr2 β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)))
( H ·r f ∙h coh-hom-arrow f h α)
( ( coh-cartesian-hom-arrow g h β ·r
map-domain-hom-arrow-lift-map-codomain-cartesian-hom-arrow) ∙h
( h) ·l
( htpy-horizontal-map-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( is-cartesian-cartesian-hom-arrow g h β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)))
( inv-htpy
( coh-htpy-cone-gap-is-pullback
( map-codomain-cartesian-hom-arrow g h β)
( h)
( cone-cartesian-hom-arrow g h β)
( is-cartesian-cartesian-hom-arrow g h β)
( cone-hom-arrow-lift-map-codomain-cartesian-hom-arrow)))))
coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow :
coherence-triangle-hom-arrow f g h
( α)
( hom-arrow-cartesian-hom-arrow g h β)
( hom-arrow-lift-map-codomain-cartesian-hom-arrow)
coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
inv-htpy-hom-arrow f h
( comp-hom-arrow f g h
( hom-arrow-cartesian-hom-arrow g h β)
( hom-arrow-lift-map-codomain-cartesian-hom-arrow))
( α)
( inv-coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow)
```
Now, if `α` was cartesian to begin with, the lift is also.
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {A' : UU l2} {B : UU l3} {B' : UU l4} {C : UU l5} {C' : UU l6}
(f : A → A') (g : B → B') (h : C → C')
(β : cartesian-hom-arrow g h)
(α : cartesian-hom-arrow f h)
(i : A' → B')
(H :
coherence-triangle-maps'
( map-codomain-cartesian-hom-arrow f h α)
( map-codomain-cartesian-hom-arrow g h β)
( i))
where
abstract
is-cartesian-cartesian-hom-arrow-lift-map-codomain-cartesian-hom-arrow :
is-cartesian-hom-arrow f g
( hom-arrow-lift-map-codomain-cartesian-hom-arrow f g h
( β)
( hom-arrow-cartesian-hom-arrow f h α)
( i)
( H))
is-cartesian-cartesian-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
is-cartesian-top-cartesian-hom-arrow-triangle' f g h
( hom-arrow-lift-map-codomain-cartesian-hom-arrow
( f) g h β (hom-arrow-cartesian-hom-arrow f h α) i H)
( α)
( β)
( inv-coherence-triangle-hom-arrow-lift-map-codomain-cartesian-hom-arrow
( f) g h β (hom-arrow-cartesian-hom-arrow f h α) i H)
cartesian-hom-arrow-lift-map-codomain-cartesian-hom-arrow :
cartesian-hom-arrow f g
cartesian-hom-arrow-lift-map-codomain-cartesian-hom-arrow =
( hom-arrow-lift-map-codomain-cartesian-hom-arrow
( f) g h β (hom-arrow-cartesian-hom-arrow f h α) i H) ,
( is-cartesian-cartesian-hom-arrow-lift-map-codomain-cartesian-hom-arrow)
```
## See also
- [Cocartesian morphisms of arrows](synthetic-homotopy-theory.cocartesian-morphisms-arrows.md)
for the dual.
- [Diagonals of morphisms of arrows](foundation.diagonals-of-morphisms-arrows.md)
is another operation that preserves cartesianness.