# Type arithmetic for coproduct types ```agda module foundation.type-arithmetic-coproduct-types where ``` <details><summary>Imports</summary> ```agda open import foundation.coproduct-types open import foundation.dependent-pair-types open import foundation.equality-coproduct-types open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.contractible-types open import foundation-core.empty-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types ``` </details> ## Idea We prove laws for the manipulation of coproduct types with respect to themselves, cartesian products, and dependent pair types. ## Laws ### Commutativity of coproducts ```agda module _ {l1 l2 : Level} (A : UU l1) (B : UU l2) where map-commutative-coproduct : A + B → B + A map-commutative-coproduct (inl a) = inr a map-commutative-coproduct (inr b) = inl b map-inv-commutative-coproduct : B + A → A + B map-inv-commutative-coproduct (inl b) = inr b map-inv-commutative-coproduct (inr a) = inl a is-section-map-inv-commutative-coproduct : ( map-commutative-coproduct ∘ map-inv-commutative-coproduct) ~ id is-section-map-inv-commutative-coproduct (inl b) = refl is-section-map-inv-commutative-coproduct (inr a) = refl is-retraction-map-inv-commutative-coproduct : ( map-inv-commutative-coproduct ∘ map-commutative-coproduct) ~ id is-retraction-map-inv-commutative-coproduct (inl a) = refl is-retraction-map-inv-commutative-coproduct (inr b) = refl is-equiv-map-commutative-coproduct : is-equiv map-commutative-coproduct is-equiv-map-commutative-coproduct = is-equiv-is-invertible map-inv-commutative-coproduct is-section-map-inv-commutative-coproduct is-retraction-map-inv-commutative-coproduct commutative-coproduct : (A + B) ≃ (B + A) pr1 commutative-coproduct = map-commutative-coproduct pr2 commutative-coproduct = is-equiv-map-commutative-coproduct ``` ### Associativity of coproducts ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} where map-associative-coproduct : (A + B) + C → A + (B + C) map-associative-coproduct (inl (inl x)) = inl x map-associative-coproduct (inl (inr x)) = inr (inl x) map-associative-coproduct (inr x) = inr (inr x) map-inv-associative-coproduct : A + (B + C) → (A + B) + C map-inv-associative-coproduct (inl x) = inl (inl x) map-inv-associative-coproduct (inr (inl x)) = inl (inr x) map-inv-associative-coproduct (inr (inr x)) = inr x is-section-map-inv-associative-coproduct : (map-associative-coproduct ∘ map-inv-associative-coproduct) ~ id is-section-map-inv-associative-coproduct (inl x) = refl is-section-map-inv-associative-coproduct (inr (inl x)) = refl is-section-map-inv-associative-coproduct (inr (inr x)) = refl is-retraction-map-inv-associative-coproduct : (map-inv-associative-coproduct ∘ map-associative-coproduct) ~ id is-retraction-map-inv-associative-coproduct (inl (inl x)) = refl is-retraction-map-inv-associative-coproduct (inl (inr x)) = refl is-retraction-map-inv-associative-coproduct (inr x) = refl is-equiv-map-associative-coproduct : is-equiv map-associative-coproduct is-equiv-map-associative-coproduct = is-equiv-is-invertible map-inv-associative-coproduct is-section-map-inv-associative-coproduct is-retraction-map-inv-associative-coproduct is-equiv-map-inv-associative-coproduct : is-equiv map-inv-associative-coproduct is-equiv-map-inv-associative-coproduct = is-equiv-is-invertible map-associative-coproduct is-retraction-map-inv-associative-coproduct is-section-map-inv-associative-coproduct associative-coproduct : ((A + B) + C) ≃ (A + (B + C)) pr1 associative-coproduct = map-associative-coproduct pr2 associative-coproduct = is-equiv-map-associative-coproduct inv-associative-coproduct : (A + (B + C)) ≃ ((A + B) + C) pr1 inv-associative-coproduct = map-inv-associative-coproduct pr2 inv-associative-coproduct = is-equiv-map-inv-associative-coproduct ``` ### Right distributivity of Σ over coproducts ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : UU l2) (C : A + B → UU l3) where map-right-distributive-Σ-coproduct : Σ (A + B) C → (Σ A (λ x → C (inl x))) + (Σ B (λ y → C (inr y))) map-right-distributive-Σ-coproduct (inl x , z) = inl (x , z) map-right-distributive-Σ-coproduct (inr y , z) = inr (y , z) map-inv-right-distributive-Σ-coproduct : (Σ A (λ x → C (inl x))) + (Σ B (λ y → C (inr y))) → Σ (A + B) C pr1 (map-inv-right-distributive-Σ-coproduct (inl (x , z))) = inl x pr2 (map-inv-right-distributive-Σ-coproduct (inl (x , z))) = z pr1 (map-inv-right-distributive-Σ-coproduct (inr (y , z))) = inr y pr2 (map-inv-right-distributive-Σ-coproduct (inr (y , z))) = z is-section-map-inv-right-distributive-Σ-coproduct : ( map-right-distributive-Σ-coproduct ∘ map-inv-right-distributive-Σ-coproduct) ~ ( id) is-section-map-inv-right-distributive-Σ-coproduct (inl (x , z)) = refl is-section-map-inv-right-distributive-Σ-coproduct (inr (y , z)) = refl is-retraction-map-inv-right-distributive-Σ-coproduct : ( map-inv-right-distributive-Σ-coproduct ∘ map-right-distributive-Σ-coproduct) ~ ( id) is-retraction-map-inv-right-distributive-Σ-coproduct (inl x , z) = refl is-retraction-map-inv-right-distributive-Σ-coproduct (inr y , z) = refl abstract is-equiv-map-right-distributive-Σ-coproduct : is-equiv map-right-distributive-Σ-coproduct is-equiv-map-right-distributive-Σ-coproduct = is-equiv-is-invertible map-inv-right-distributive-Σ-coproduct is-section-map-inv-right-distributive-Σ-coproduct is-retraction-map-inv-right-distributive-Σ-coproduct right-distributive-Σ-coproduct : Σ (A + B) C ≃ ((Σ A (λ x → C (inl x))) + (Σ B (λ y → C (inr y)))) pr1 right-distributive-Σ-coproduct = map-right-distributive-Σ-coproduct pr2 right-distributive-Σ-coproduct = is-equiv-map-right-distributive-Σ-coproduct ``` ### Left distributivity of Σ over coproducts ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : A → UU l2) (C : A → UU l3) where map-left-distributive-Σ-coproduct : Σ A (λ x → B x + C x) → (Σ A B) + (Σ A C) map-left-distributive-Σ-coproduct (x , inl y) = inl (x , y) map-left-distributive-Σ-coproduct (x , inr z) = inr (x , z) map-inv-left-distributive-Σ-coproduct : (Σ A B) + (Σ A C) → Σ A (λ x → B x + C x) pr1 (map-inv-left-distributive-Σ-coproduct (inl (x , y))) = x pr2 (map-inv-left-distributive-Σ-coproduct (inl (x , y))) = inl y pr1 (map-inv-left-distributive-Σ-coproduct (inr (x , z))) = x pr2 (map-inv-left-distributive-Σ-coproduct (inr (x , z))) = inr z is-section-map-inv-left-distributive-Σ-coproduct : ( map-left-distributive-Σ-coproduct ∘ map-inv-left-distributive-Σ-coproduct) ~ ( id) is-section-map-inv-left-distributive-Σ-coproduct (inl (x , y)) = refl is-section-map-inv-left-distributive-Σ-coproduct (inr (x , z)) = refl is-retraction-map-inv-left-distributive-Σ-coproduct : ( map-inv-left-distributive-Σ-coproduct ∘ map-left-distributive-Σ-coproduct) ~ ( id) is-retraction-map-inv-left-distributive-Σ-coproduct (x , inl y) = refl is-retraction-map-inv-left-distributive-Σ-coproduct (x , inr z) = refl is-equiv-map-left-distributive-Σ-coproduct : is-equiv map-left-distributive-Σ-coproduct is-equiv-map-left-distributive-Σ-coproduct = is-equiv-is-invertible map-inv-left-distributive-Σ-coproduct is-section-map-inv-left-distributive-Σ-coproduct is-retraction-map-inv-left-distributive-Σ-coproduct left-distributive-Σ-coproduct : Σ A (λ x → B x + C x) ≃ ((Σ A B) + (Σ A C)) pr1 left-distributive-Σ-coproduct = map-left-distributive-Σ-coproduct pr2 left-distributive-Σ-coproduct = is-equiv-map-left-distributive-Σ-coproduct ``` ### Right distributivity of products over coproducts ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : UU l2) (C : UU l3) where map-right-distributive-product-coproduct : (A + B) × C → (A × C) + (B × C) map-right-distributive-product-coproduct = map-right-distributive-Σ-coproduct A B (λ _ → C) map-inv-right-distributive-product-coproduct : (A × C) + (B × C) → (A + B) × C map-inv-right-distributive-product-coproduct = map-inv-right-distributive-Σ-coproduct A B (λ _ → C) is-section-map-inv-right-distributive-product-coproduct : map-right-distributive-product-coproduct ∘ map-inv-right-distributive-product-coproduct ~ id is-section-map-inv-right-distributive-product-coproduct = is-section-map-inv-right-distributive-Σ-coproduct A B (λ _ → C) is-retraction-map-inv-right-distributive-product-coproduct : map-inv-right-distributive-product-coproduct ∘ map-right-distributive-product-coproduct ~ id is-retraction-map-inv-right-distributive-product-coproduct = is-retraction-map-inv-right-distributive-Σ-coproduct A B (λ _ → C) abstract is-equiv-map-right-distributive-product-coproduct : is-equiv map-right-distributive-product-coproduct is-equiv-map-right-distributive-product-coproduct = is-equiv-map-right-distributive-Σ-coproduct A B (λ _ → C) right-distributive-product-coproduct : ((A + B) × C) ≃ ((A × C) + (B × C)) right-distributive-product-coproduct = right-distributive-Σ-coproduct A B (λ _ → C) ``` ### Left distributivity of products over coproducts ```agda module _ {l1 l2 l3 : Level} (A : UU l1) (B : UU l2) (C : UU l3) where map-left-distributive-product-coproduct : A × (B + C) → (A × B) + (A × C) map-left-distributive-product-coproduct = map-left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) map-inv-left-distributive-product-coproduct : (A × B) + (A × C) → A × (B + C) map-inv-left-distributive-product-coproduct = map-inv-left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) is-section-map-inv-left-distributive-product-coproduct : map-left-distributive-product-coproduct ∘ map-inv-left-distributive-product-coproduct ~ id is-section-map-inv-left-distributive-product-coproduct = is-section-map-inv-left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) is-retraction-map-inv-left-distributive-product-coproduct : map-inv-left-distributive-product-coproduct ∘ map-left-distributive-product-coproduct ~ id is-retraction-map-inv-left-distributive-product-coproduct = is-retraction-map-inv-left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) is-equiv-map-left-distributive-product-coproduct : is-equiv map-left-distributive-product-coproduct is-equiv-map-left-distributive-product-coproduct = is-equiv-map-left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) left-distributive-product-coproduct : (A × (B + C)) ≃ ((A × B) + (A × C)) left-distributive-product-coproduct = left-distributive-Σ-coproduct A (λ _ → B) (λ _ → C) ``` ### If a coproduct is contractible then one summand is contractible and the other is empty ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-contr-left-summand : is-contr (A + B) → A → is-contr A pr1 (is-contr-left-summand H a) = a pr2 (is-contr-left-summand H a) x = is-injective-inl (eq-is-contr H {inl a} {inl x}) is-contr-left-summand-is-empty : is-contr (A + B) → is-empty B → is-contr A pr1 (is-contr-left-summand-is-empty (inl a , H) K) = a pr2 (is-contr-left-summand-is-empty (inl a , H) K) x = is-injective-inl (H (inl x)) is-contr-left-summand-is-empty (inr b , H) K = ex-falso (K b) is-contr-right-summand : is-contr (A + B) → B → is-contr B pr1 (is-contr-right-summand H b) = b pr2 (is-contr-right-summand H b) x = is-injective-inr (eq-is-contr H {inr b} {inr x}) is-contr-right-summand-is-empty : is-contr (A + B) → is-empty A → is-contr B is-contr-right-summand-is-empty (inl a , H) K = ex-falso (K a) pr1 (is-contr-right-summand-is-empty (inr b , H) K) = b pr2 (is-contr-right-summand-is-empty (inr b , H) K) x = is-injective-inr (H (inr x)) is-empty-left-summand-is-contr-coproduct : is-contr (A + B) → B → is-empty A is-empty-left-summand-is-contr-coproduct H b a = ex-falso (is-empty-eq-coproduct-inl-inr a b (eq-is-contr H)) is-empty-right-summand-is-contr-coproduct : is-contr (A + B) → A → is-empty B is-empty-right-summand-is-contr-coproduct H a b = ex-falso (is-empty-eq-coproduct-inl-inr a b (eq-is-contr H)) ``` ## See also - Functorial properties of coproducts are recorded in [`foundation.functoriality-coproduct-types`](foundation.functoriality-coproduct-types.md). - Equality proofs in coproduct types are characterized in [`foundation.equality-coproduct-types`](foundation.equality-coproduct-types.md). - The universal property of coproducts is treated in [`foundation.universal-property-coproduct-types`](foundation.universal-property-coproduct-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 cartesian-product types are recorded in [`foundation.type-arithmetic-cartesian-product-types`](foundation.type-arithmetic-cartesian-product-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).