# Exclusive sums

```agda
module foundation.exclusive-sum where
```

<details><summary>Imports</summary>

```agda
open import foundation.conjunction
open import foundation.coproduct-types
open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.negation
open import foundation.propositional-extensionality
open import foundation.symmetric-operations
open import foundation.universal-quantification
open import foundation.universe-levels
open import foundation.unordered-pairs

open import foundation-core.cartesian-product-types
open import foundation-core.decidable-propositions
open import foundation-core.embeddings
open import foundation-core.empty-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.transport-along-identifications

open import univalent-combinatorics.2-element-types
open import univalent-combinatorics.equality-finite-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```

</details>

## Idea

The {{#concept "exclusive sum" Disambiguation="of types" Agda=exclusive-sum}} of
two types `A` and `B`, is the type consisting of

- elements of `A` together with a proof that `B` is
  [empty](foundation-core.empty-types.md), or
- elements of `B` together with a proof that `A` is empty.

The
{{#concept "exclusive sum" Disambiguation="of propositions" Agda=exclusive-sum-Prop}}
of [propositions](foundation-core.propositions.md) `P` and `Q` is likewise the
[proposition](foundation-core.propositions.md) that `P` holds and `Q` does not
hold, or `P` does not hold and `Q` holds. The exclusive sum of two propositions
is equivalent to the
[exclusive disjunction](foundation.exclusive-disjunction.md), which is shown
there.

## Definitions

### The exclusive sum of types

```agda
module _
  {l1 l2 : Level} (A : UU l1) (B : UU l2)
  where

  exclusive-sum : UU (l1  l2)
  exclusive-sum = (A × ¬ B) + (B × ¬ A)
```

### The exclusive sum of propositions

```agda
module _
  {l1 l2 : Level} (P : Prop l1) (Q : Prop l2)
  where

  exclusive-sum-Prop : Prop (l1  l2)
  exclusive-sum-Prop =
    coproduct-Prop
      ( P  (¬' Q))
      ( Q  (¬' P))
      ( λ p q  pr2 q (pr1 p))

  type-exclusive-sum-Prop : UU (l1  l2)
  type-exclusive-sum-Prop = type-Prop exclusive-sum-Prop

  abstract
    is-prop-type-exclusive-sum-Prop : is-prop type-exclusive-sum-Prop
    is-prop-type-exclusive-sum-Prop = is-prop-type-Prop exclusive-sum-Prop
```

### The canonical inclusion of the exclusive sum into the coproduct

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  where

  map-coproduct-exclusive-sum : exclusive-sum A B  A + B
  map-coproduct-exclusive-sum (inl (a , _)) = inl a
  map-coproduct-exclusive-sum (inr (b , _)) = inr b
```

### The symmetric operation of exclusive sum

```agda
predicate-symmetric-exclusive-sum :
  {l : Level} (p : unordered-pair (UU l))  type-unordered-pair p  UU l
predicate-symmetric-exclusive-sum p x =
  ( element-unordered-pair p x) × (¬ (other-element-unordered-pair p x))

symmetric-exclusive-sum : {l : Level}  symmetric-operation (UU l) (UU l)
symmetric-exclusive-sum p =
  Σ (type-unordered-pair p) (predicate-symmetric-exclusive-sum p)
```

### The symmetric operation of the exclusive sum of propositions

```agda
predicate-symmetric-exclusive-sum-Prop :
  {l : Level} (p : unordered-pair (Prop l)) 
  type-unordered-pair p  UU l
predicate-symmetric-exclusive-sum-Prop p =
  predicate-symmetric-exclusive-sum (map-unordered-pair type-Prop p)

type-symmetric-exclusive-sum-Prop :
  {l : Level}  symmetric-operation (Prop l) (UU l)
type-symmetric-exclusive-sum-Prop p =
  symmetric-exclusive-sum (map-unordered-pair type-Prop p)

all-elements-equal-type-symmetric-exclusive-sum-Prop :
  {l : Level} (p : unordered-pair (Prop l)) 
  all-elements-equal (type-symmetric-exclusive-sum-Prop p)
all-elements-equal-type-symmetric-exclusive-sum-Prop (X , P) x y =
  cases-is-prop-type-symmetric-exclusive-sum-Prop
    ( has-decidable-equality-is-finite
      ( is-finite-type-UU-Fin 2 X)
      ( pr1 x)
      ( pr1 y))
  where
  cases-is-prop-type-symmetric-exclusive-sum-Prop :
    is-decidable (pr1 x  pr1 y)  x  y
  cases-is-prop-type-symmetric-exclusive-sum-Prop (inl p) =
    eq-pair-Σ
      ( p)
      ( eq-is-prop
        ( is-prop-product-Prop
          ( P (pr1 y))
          ( neg-type-Prop
            ( other-element-unordered-pair
              ( map-unordered-pair (type-Prop) (X , P))
              ( pr1 y)))))
  cases-is-prop-type-symmetric-exclusive-sum-Prop (inr np) =
    ex-falso
      ( tr
        ( λ z  ¬ (type-Prop (P z)))
        ( compute-swap-2-Element-Type X (pr1 x) (pr1 y) np)
        ( pr2 (pr2 x))
        ( pr1 (pr2 y)))

is-prop-type-symmetric-exclusive-sum-Prop :
  {l : Level} (p : unordered-pair (Prop l)) 
  is-prop (type-symmetric-exclusive-sum-Prop p)
is-prop-type-symmetric-exclusive-sum-Prop p =
  is-prop-all-elements-equal
    ( all-elements-equal-type-symmetric-exclusive-sum-Prop p)

symmetric-exclusive-sum-Prop :
  {l : Level}  symmetric-operation (Prop l) (Prop l)
pr1 (symmetric-exclusive-sum-Prop E) = type-symmetric-exclusive-sum-Prop E
pr2 (symmetric-exclusive-sum-Prop E) =
  is-prop-type-symmetric-exclusive-sum-Prop E
```

## Properties

### The symmetric exclusive sum at a standard unordered pair

```agda
module _
  {l : Level} {A B : UU l}
  where

  exclusive-sum-symmetric-exclusive-sum :
    symmetric-exclusive-sum (standard-unordered-pair A B)  exclusive-sum A B
  exclusive-sum-symmetric-exclusive-sum (pair (inl (inr _)) (p , nq)) =
    inl
      ( pair p
        ( tr
          ( λ t  ¬ (element-unordered-pair (standard-unordered-pair A B) t))
          ( compute-swap-Fin-two-ℕ (zero-Fin 1))
          ( nq)))
  exclusive-sum-symmetric-exclusive-sum (pair (inr _) (q , np)) =
    inr
      ( pair
        ( q)
        ( tr
          ( λ t  ¬ (element-unordered-pair (standard-unordered-pair A B) t))
          ( compute-swap-Fin-two-ℕ (one-Fin 1))
          ( np)))

  symmetric-exclusive-sum-exclusive-sum :
    exclusive-sum A B  symmetric-exclusive-sum (standard-unordered-pair A B)
  pr1 (symmetric-exclusive-sum-exclusive-sum (inl (a , nb))) = (zero-Fin 1)
  pr1 (pr2 (symmetric-exclusive-sum-exclusive-sum (inl (a , nb)))) = a
  pr2 (pr2 (symmetric-exclusive-sum-exclusive-sum (inl (a , nb)))) =
    tr
      ( λ t  ¬ (element-unordered-pair (standard-unordered-pair A B) t))
      ( inv (compute-swap-Fin-two-ℕ (zero-Fin 1)))
      ( nb)
  pr1 (symmetric-exclusive-sum-exclusive-sum (inr (na , b))) = (one-Fin 1)
  pr1 (pr2 (symmetric-exclusive-sum-exclusive-sum (inr (b , na)))) = b
  pr2 (pr2 (symmetric-exclusive-sum-exclusive-sum (inr (b , na)))) =
    tr
      ( λ t  ¬ (element-unordered-pair (standard-unordered-pair A B) t))
      ( inv (compute-swap-Fin-two-ℕ (one-Fin 1)))
      ( na)
```

```text
  eq-equiv-Prop
    ( ( ( equiv-coproduct
          ( ( ( left-unit-law-coproduct (type-Prop (P ∧ (¬' Q)))) ∘e
              ( equiv-coproduct
                ( left-absorption-Σ
                  ( λ x →
                    ( type-Prop
                      ( pr2 (standard-unordered-pair P Q) (inl (inl x)))) ×
                      ( ¬ ( type-Prop
                            ( pr2
                              ( standard-unordered-pair P Q)
                              ( map-swap-2-Element-Type
                                ( pr1 (standard-unordered-pair P Q))
                                ( inl (inl x))))))))
                ( ( equiv-product
                    ( id-equiv)
                    ( tr
                      ( λ b →
                        ( ¬ (type-Prop (pr2 (standard-unordered-pair P Q) b))) ≃
                        ( ¬ (type-Prop Q)))
                      ( inv (compute-swap-Fin-two-ℕ (zero-Fin ?)))
                      ( id-equiv))) ∘e
                    ( left-unit-law-Σ
                      ( λ y →
                        ( type-Prop
                          ( pr2 (standard-unordered-pair P Q) (inl (inr y)))) ×
                        ( ¬ ( type-Prop
                              ( pr2
                                ( standard-unordered-pair P Q)
                                ( map-swap-2-Element-Type
                                  ( pr1 (standard-unordered-pair P Q))
                                  ( inl (inr y))))))))))) ∘e
          ( ( right-distributive-Σ-coproduct
              ( Fin 0)
              ( unit)
              ( λ x →
                ( type-Prop (pr2 (standard-unordered-pair P Q) (inl x))) ×
                ( ¬ ( type-Prop
                      ( pr2
                        ( standard-unordered-pair P Q)
                        ( map-swap-2-Element-Type
                          ( pr1 (standard-unordered-pair P Q)) (inl x)))))))))
        ( ( equiv-product
            ( tr
              ( λ b →
                ¬ (type-Prop (pr2 (standard-unordered-pair P Q) b)) ≃
                ¬ (type-Prop P))
              ( inv (compute-swap-Fin-two-ℕ (one-Fin ?)))
              ( id-equiv))
            ( id-equiv)) ∘e
          ( ( commutative-product) ∘e
            ( left-unit-law-Σ
              ( λ y →
                ( type-Prop (pr2 (standard-unordered-pair P Q) (inr y))) ×
                ( ¬ ( type-Prop
                      ( pr2
                        ( standard-unordered-pair P Q)
                        ( map-swap-2-Element-Type
                          ( pr1 (standard-unordered-pair P Q))
                          ( inr y)))))))))) ∘e
      ( right-distributive-Σ-coproduct
        ( Fin 1)
        ( unit)
        ( λ x →
          ( type-Prop (pr2 (standard-unordered-pair P Q) x)) ×
          ( ¬ ( type-Prop
                ( pr2
                  ( standard-unordered-pair P Q)
                  ( map-swap-2-Element-Type
                    ( pr1 (standard-unordered-pair P Q))
                    ( x)))))))))
```

```agda
module _
  {l : Level} (P Q : Prop l)
  where

  exclusive-sum-symmetric-exclusive-sum-Prop :
    type-hom-Prop
      ( symmetric-exclusive-sum-Prop (standard-unordered-pair P Q))
      ( exclusive-sum-Prop P Q)
  exclusive-sum-symmetric-exclusive-sum-Prop (pair (inl (inr _)) (p , nq)) =
    inl
      ( pair p
        ( tr
          ( λ t 
            ¬ ( type-Prop
                ( element-unordered-pair (standard-unordered-pair P Q) t)))
          ( compute-swap-Fin-two-ℕ (zero-Fin 1))
          ( nq)))
  exclusive-sum-symmetric-exclusive-sum-Prop (pair (inr _) (q , np)) =
    inr
      ( pair q
        ( tr
          ( λ t 
            ¬ ( type-Prop
                ( element-unordered-pair (standard-unordered-pair P Q) t)))
          ( compute-swap-Fin-two-ℕ (one-Fin 1))
          ( np)))

  symmetric-exclusive-sum-exclusive-sum-Prop :
    type-hom-Prop
      ( exclusive-sum-Prop P Q)
      ( symmetric-exclusive-sum-Prop (standard-unordered-pair P Q))
  pr1 (symmetric-exclusive-sum-exclusive-sum-Prop (inl (p , nq))) = zero-Fin 1
  pr1 (pr2 (symmetric-exclusive-sum-exclusive-sum-Prop (inl (p , nq)))) = p
  pr2 (pr2 (symmetric-exclusive-sum-exclusive-sum-Prop (inl (p , nq)))) =
    tr
      ( λ t 
        ¬ (type-Prop (element-unordered-pair (standard-unordered-pair P Q) t)))
      ( inv (compute-swap-Fin-two-ℕ (zero-Fin 1)))
      ( nq)
  pr1 (symmetric-exclusive-sum-exclusive-sum-Prop (inr (q , np))) = one-Fin 1
  pr1 (pr2 (symmetric-exclusive-sum-exclusive-sum-Prop (inr (q , np)))) = q
  pr2 (pr2 (symmetric-exclusive-sum-exclusive-sum-Prop (inr (q , np)))) =
    tr
      ( λ t 
        ¬ (type-Prop (element-unordered-pair (standard-unordered-pair P Q) t)))
      ( inv (compute-swap-Fin-two-ℕ (one-Fin 1)))
      ( np)

eq-commmutative-exclusive-sum-exclusive-sum :
  {l : Level} (P Q : Prop l) 
  symmetric-exclusive-sum-Prop (standard-unordered-pair P Q) 
  exclusive-sum-Prop P Q
eq-commmutative-exclusive-sum-exclusive-sum P Q =
  eq-iff
    ( exclusive-sum-symmetric-exclusive-sum-Prop P Q)
    ( symmetric-exclusive-sum-exclusive-sum-Prop P Q)
```

### The exclusive sum of decidable types is decidable

```agda
is-decidable-exclusive-sum :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} 
  is-decidable A  is-decidable B  is-decidable (exclusive-sum A B)
is-decidable-exclusive-sum d e =
  is-decidable-coproduct
    ( is-decidable-product d (is-decidable-neg e))
    ( is-decidable-product e (is-decidable-neg d))

module _
  {l1 l2 : Level} (P : Decidable-Prop l1) (Q : Decidable-Prop l2)
  where

  is-decidable-exclusive-sum-Decidable-Prop :
    is-decidable
      ( type-exclusive-sum-Prop (prop-Decidable-Prop P) (prop-Decidable-Prop Q))
  is-decidable-exclusive-sum-Decidable-Prop =
      is-decidable-coproduct
      ( is-decidable-product
        ( is-decidable-Decidable-Prop P)
        ( is-decidable-neg (is-decidable-Decidable-Prop Q)))
      ( is-decidable-product
        ( is-decidable-Decidable-Prop Q)
        ( is-decidable-neg (is-decidable-Decidable-Prop P)))

  exclusive-sum-Decidable-Prop : Decidable-Prop (l1  l2)
  pr1 exclusive-sum-Decidable-Prop =
    type-exclusive-sum-Prop (prop-Decidable-Prop P) (prop-Decidable-Prop Q)
  pr1 (pr2 exclusive-sum-Decidable-Prop) =
    is-prop-type-exclusive-sum-Prop
      ( prop-Decidable-Prop P)
      ( prop-Decidable-Prop Q)
  pr2 (pr2 exclusive-sum-Decidable-Prop) =
    is-decidable-exclusive-sum-Decidable-Prop
```

## Table of files about propositional logic

The following table gives an overview of basic constructions in propositional
logic and related considerations.

{{#include tables/propositional-logic.md}}