# Cartesian products of set quotients

```agda
module foundation.cartesian-products-set-quotients where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equality-cartesian-product-types
open import foundation.function-extensionality
open import foundation.products-equivalence-relations
open import foundation.reflecting-maps-equivalence-relations
open import foundation.set-quotients
open import foundation.sets
open import foundation.uniqueness-set-quotients
open import foundation.universal-property-set-quotients
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.equivalence-relations
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
```

</details>

## Idea

Given two types `A` and `B`, equipped with equivalence relations `R` and `S`,
respectively, the cartesian product of their set quotients is the set quotient
of their product.

## Definition

### The product of two relations

```agda
module _
  {l1 l2 l3 l4 : Level}
  {A : UU l1} (R : equivalence-relation l2 A)
  {B : UU l3} (S : equivalence-relation l4 B)
  where

  product-set-quotient-Set : Set (l1  l2  l3  l4)
  product-set-quotient-Set = product-Set (quotient-Set R) (quotient-Set S)

  product-set-quotient : UU (l1  l2  l3  l4)
  product-set-quotient = pr1 product-set-quotient-Set

  is-set-product-set-quotient : is-set product-set-quotient
  is-set-product-set-quotient = pr2 product-set-quotient-Set

  product-set-quotient-map : (A × B)  product-set-quotient
  product-set-quotient-map (a , b) =
    pair (quotient-map R a) (quotient-map S b)

  reflecting-map-product-quotient-map :
    reflecting-map-equivalence-relation
      ( product-equivalence-relation R S)
      ( product-set-quotient)
  reflecting-map-product-quotient-map =
    pair
      product-set-quotient-map
      ( λ (p , q) 
        ( eq-pair
          ( apply-effectiveness-quotient-map' R p)
          ( apply-effectiveness-quotient-map' S q)))
```

## Properties

### The product of sets quotients is a set quotient

```agda
  inv-precomp-set-quotient-product-set-quotient :
    {l : Level}
    (X : Set l) 
    reflecting-map-equivalence-relation
      ( product-equivalence-relation R S)
      ( type-Set X) 
    hom-Set product-set-quotient-Set X
  inv-precomp-set-quotient-product-set-quotient X (f , H) (qa , qb) =
    inv-precomp-set-quotient
      ( R)
      ( hom-set-Set (quotient-Set S) X)
      ( pair
        ( λ a qb' 
          inv-precomp-set-quotient S X
            ( pair
               b  f (a , b))
               p  H (refl-equivalence-relation R a , p)))
            qb')
        ( λ {a1} {a2} p 
          ( ap (inv-precomp-set-quotient S X)
            ( eq-pair-Σ
              ( eq-htpy  b  H (p , refl-equivalence-relation S b)))
              ( eq-is-prop
                ( is-prop-reflects-equivalence-relation S X _))))))
      ( qa)
      ( qb)

  is-section-inv-precomp-set-quotient-product-set-quotient :
    { l : Level}
    ( X : Set l) 
    ( precomp-Set-Quotient
      ( product-equivalence-relation R S)
      ( product-set-quotient-Set)
      ( reflecting-map-product-quotient-map)
      ( X) 
      ( inv-precomp-set-quotient-product-set-quotient X)) ~
    ( id)
  is-section-inv-precomp-set-quotient-product-set-quotient X (f , H) =
    eq-pair-Σ
      ( eq-htpy
        ( λ (a , b) 
          ( htpy-eq
            ( is-section-inv-precomp-set-quotient R
              ( hom-set-Set (quotient-Set S) X) _ a)
            ( quotient-map S b) 
          ( is-section-inv-precomp-set-quotient S X _ b))))
      ( eq-is-prop
        ( is-prop-reflects-equivalence-relation
          ( product-equivalence-relation R S) X f))

  is-retraction-inv-precomp-set-quotient-product-set-quotient :
    { l : Level}
    ( X : Set l) 
    ( ( inv-precomp-set-quotient-product-set-quotient X) 
      ( precomp-Set-Quotient
        ( product-equivalence-relation R S)
        ( product-set-quotient-Set)
        ( reflecting-map-product-quotient-map)
        ( X))) ~
    ( id)
  is-retraction-inv-precomp-set-quotient-product-set-quotient X f =
    ( eq-htpy
      ( λ (qa , qb) 
        htpy-eq
        ( htpy-eq
          ( ap
            ( inv-precomp-set-quotient
              ( R)
              ( hom-set-Set (quotient-Set S) X))
              ( eq-pair-Σ
                ( eq-htpy λ a 
                  ( ap
                    ( inv-precomp-set-quotient S X)
                    ( eq-pair-eq-fiber
                      ( eq-is-prop
                        ( is-prop-reflects-equivalence-relation S X _)))) 
                    ( is-retraction-inv-precomp-set-quotient S X _))
                ( eq-is-prop
                  ( is-prop-reflects-equivalence-relation R
                    ( hom-set-Set (quotient-Set S) X) _))) 
            ( is-retraction-inv-precomp-set-quotient R
                ( hom-set-Set (quotient-Set S) X)
                ( λ qa qb  f (qa , qb))))
          ( qa))
          ( qb)))

  is-set-quotient-product-set-quotient :
    is-set-quotient
      ( product-equivalence-relation R S)
      ( product-set-quotient-Set)
      ( reflecting-map-product-quotient-map)
  pr1 (pr1 (is-set-quotient-product-set-quotient X)) =
    inv-precomp-set-quotient-product-set-quotient X
  pr2 (pr1 (is-set-quotient-product-set-quotient X)) =
    is-section-inv-precomp-set-quotient-product-set-quotient X
  pr1 (pr2 (is-set-quotient-product-set-quotient X)) =
    inv-precomp-set-quotient-product-set-quotient X
  pr2 (pr2 (is-set-quotient-product-set-quotient X)) =
    is-retraction-inv-precomp-set-quotient-product-set-quotient X

  quotient-product : Set (l1  l2  l3  l4)
  quotient-product = quotient-Set (product-equivalence-relation R S)

  type-quotient-product : UU (l1  l2  l3  l4)
  type-quotient-product = pr1 quotient-product

  equiv-quotient-product-product-set-quotient :
    product-set-quotient  type-Set (quotient-product)
  equiv-quotient-product-product-set-quotient =
    equiv-uniqueness-set-quotient
      ( product-equivalence-relation R S)
      ( product-set-quotient-Set)
      ( reflecting-map-product-quotient-map)
      ( is-set-quotient-product-set-quotient)
      ( quotient-product)
      ( reflecting-map-quotient-map (product-equivalence-relation R S))
      ( is-set-quotient-set-quotient (product-equivalence-relation R S))

  triangle-uniqueness-product-set-quotient :
    ( map-equiv equiv-quotient-product-product-set-quotient 
      product-set-quotient-map) ~
    quotient-map (product-equivalence-relation R S)
  triangle-uniqueness-product-set-quotient =
    triangle-uniqueness-set-quotient
      ( product-equivalence-relation R S)
      ( product-set-quotient-Set)
      ( reflecting-map-product-quotient-map)
      ( is-set-quotient-product-set-quotient)
      ( quotient-product)
      ( reflecting-map-quotient-map (product-equivalence-relation R S))
      ( is-set-quotient-set-quotient (product-equivalence-relation R S))
```