# 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.