# Type arithmetic for cartesian product types ```agda module foundation.type-arithmetic-cartesian-product-types where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.equality-cartesian-product-types open import foundation.type-arithmetic-dependent-pair-types open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.contractible-types 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 We prove laws for the manipulation of cartesian products with respect to themselves and dependent pair types. ## Laws ### Commutativity of cartesian products ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where map-commutative-product : A × B → B × A pr1 (map-commutative-product (pair a b)) = b pr2 (map-commutative-product (pair a b)) = a map-inv-commutative-product : B × A → A × B pr1 (map-inv-commutative-product (pair b a)) = a pr2 (map-inv-commutative-product (pair b a)) = b is-section-map-inv-commutative-product : (map-commutative-product ∘ map-inv-commutative-product) ~ id is-section-map-inv-commutative-product (pair b a) = refl is-retraction-map-inv-commutative-product : (map-inv-commutative-product ∘ map-commutative-product) ~ id is-retraction-map-inv-commutative-product (pair a b) = refl is-equiv-map-commutative-product : is-equiv map-commutative-product is-equiv-map-commutative-product = is-equiv-is-invertible map-inv-commutative-product is-section-map-inv-commutative-product is-retraction-map-inv-commutative-product commutative-product : (A × B) ≃ (B × A) pr1 commutative-product = map-commutative-product pr2 commutative-product = is-equiv-map-commutative-product ``` ### Associativity of cartesian products ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : UU l2) (C : UU l3) where map-associative-product : (A × B) × C → A × (B × C) map-associative-product = map-associative-Σ A (λ _ → B) (λ _ → C) map-inv-associative-product : A × (B × C) → (A × B) × C map-inv-associative-product = map-inv-associative-Σ A (λ _ → B) (λ _ → C) is-section-map-inv-associative-product : (map-associative-product ∘ map-inv-associative-product) ~ id is-section-map-inv-associative-product = is-section-map-inv-associative-Σ A (λ _ → B) (λ _ → C) is-retraction-map-inv-associative-product : (map-inv-associative-product ∘ map-associative-product) ~ id is-retraction-map-inv-associative-product = is-retraction-map-inv-associative-Σ A (λ _ → B) (λ _ → C) is-equiv-map-associative-product : is-equiv map-associative-product is-equiv-map-associative-product = is-equiv-map-associative-Σ A (λ _ → B) (λ _ → C) associative-product : ((A × B) × C) ≃ (A × (B × C)) associative-product = associative-Σ A (λ _ → B) (λ _ → C) ``` ### The unit laws of cartesian product types with respect to contractible types ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (is-contr-B : is-contr B) where right-unit-law-product-is-contr : A × B ≃ A right-unit-law-product-is-contr = right-unit-law-Σ-is-contr (λ _ → is-contr-B) inv-right-unit-law-product-is-contr : A ≃ A × B inv-right-unit-law-product-is-contr = inv-equiv right-unit-law-product-is-contr module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (is-contr-A : is-contr A) where left-unit-law-product-is-contr : A × B ≃ B left-unit-law-product-is-contr = left-unit-law-Σ-is-contr is-contr-A (center is-contr-A) inv-left-unit-law-product-is-contr : B ≃ A × B inv-left-unit-law-product-is-contr = inv-equiv left-unit-law-product-is-contr is-equiv-pr2-product-is-contr : is-equiv (pr2 {B = λ _ → B}) is-equiv-pr2-product-is-contr = is-equiv-comp ( pr1) ( map-commutative-product) ( is-equiv-map-commutative-product) ( is-equiv-pr1-is-contr (λ _ → is-contr-A)) equiv-pr2-product-is-contr : (A × B) ≃ B pr1 equiv-pr2-product-is-contr = pr2 pr2 equiv-pr2-product-is-contr = is-equiv-pr2-product-is-contr ``` ### Adding redundant properties ```agda equiv-add-redundant-prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} → is-prop B → (f : A → B) → A ≃ A × B pr1 (equiv-add-redundant-prop is-prop-B f) a = a , f a pr2 (equiv-add-redundant-prop is-prop-B f) = is-equiv-is-invertible ( pr1) ( λ p → eq-pair refl (eq-is-prop is-prop-B)) ( refl-htpy) ``` ## See also - Functorial properties of cartesian products are recorded in [`foundation.functoriality-cartesian-product-types`](foundation.functoriality-cartesian-product-types.md). - Equality proofs in cartesian product types are characterized in [`foundation.equality-cartesian-product-types`](foundation.equality-cartesian-product-types.md). - The universal property of cartesian product types is treated in [`foundation.universal-property-cartesian-product-types`](foundation.universal-property-cartesian-product-types.md). - Arithmetical laws involving dependent pair types are recorded in [`foundation.type-arithmetic-dependent-pair-types`](foundation.type-arithmetic-dependent-pair-types.md). - Arithmetical laws involving dependent product types are recorded in [`foundation.type-arithmetic-dependent-function-types`](foundation.type-arithmetic-dependent-function-types.md). - Arithmetical laws involving coproduct types are recorded in [`foundation.type-arithmetic-coproduct-types`](foundation.type-arithmetic-coproduct-types.md). - Arithmetical laws involving the unit type are recorded in [`foundation.type-arithmetic-unit-type`](foundation.type-arithmetic-unit-type.md). - Arithmetical laws involving the empty type are recorded in [`foundation.type-arithmetic-empty-type`](foundation.type-arithmetic-empty-type.md).