# Existential quantification

```agda
module foundation.existential-quantification where
```

<details><summary>Imports</summary>

```agda
open import foundation.conjunction
open import foundation.dependent-pair-types
open import foundation.functoriality-propositional-truncation
open import foundation.logical-equivalences
open import foundation.propositional-extensionality
open import foundation.propositional-truncations
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.identity-types
open import foundation-core.propositions
```

</details>

## Idea

Given a family of [propositions](foundation-core.propositions.md) `P` over `A`,
the
{{#concept "existential quantification" Disambiguation="on a subtype" WDID=Q773483 WD="existential quantification" Agda=exists}}
of `P` over `A` is the proposition `∃ A P` asserting that there is an element
`a : A` such that `P a` holds. We use the
[propositional truncation](foundation.propositional-truncations.md) to define
the existential quantification,

```text
  ∃ (x : A), (P x) := ║ Σ (x : A), (P x) ║₋₁
```

because the Curry-Howard interpretation of the existential quantification as
`Σ A P` does not guarantee that existential quantifications are interpreted as
propositions.

The
{{#concept "universal property" Disambiguation="of existential quantification" Agda=universal-property-exists}}
of existential quantification states that it is the
[least upper bound](order-theory.least-upper-bounds-large-posets.md) on the
family of propositions `P` in the
[locale of propositions](foundation.large-locale-of-propositions.md), by which
we mean that for every proposition `Q` we have the
[logical equivalence](foundation.logical-equivalences.md)

```text
  (∀ (x : A), (P x ⇒ Q)) ⇔ ((∃ (x : A), (P x)) ⇒ Q).
```

## Definitions

### Existence of structure

Given a [structure](foundation.structure.md) `B : A → 𝒰` on a type `A`, the
propositional truncation

```text
  ║ Σ (x : A), (B x) ║₋₁
```

satisfies the universal property of the existential quantification

```text
  ∃ (x : A), ║ B x ║₋₁
```

and is thus equivalent to it. Therefore, we may reasonably call this
construction the
{{#concept "existential quantification" Disambiguation="structure" Agda=exists-structure-Prop}}
of structure. It is important to keep in mind that this is not a generalization
of the concept but rather a conflation, and should be read as the statement _the
type of elements `x : A` equipped with `y : B x` is
[inhabited](foundation.inhabited-types.md)_.

Existence of structure is a widely occurring notion in univalent mathematics.
For instance, the condition that an element `y : B` is in the
[image](foundation.images.md) of a map `f : A → B` is formulated using existence
of structure: The element `y` is in the image of `f` if the type of `x : A`
equipped with an identification `f x = y` is inhabited.

Because subtypes are a special case of structure, and Agda can generally infer
structures for us, we will continue to conflate the two in our formalizations
for the benefit that we have to specify the subtype in our code less often. For
instance, even though the introduction rule for existential quantification
`intro-exists` is phrased in terms of existential quantification on structures,
it equally applies to existential quantification on subtypes.

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

  exists-structure-Prop : Prop (l1  l2)
  exists-structure-Prop = trunc-Prop (Σ A B)

  exists-structure : UU (l1  l2)
  exists-structure = type-Prop exists-structure-Prop

  is-prop-exists-structure : is-prop exists-structure
  is-prop-exists-structure = is-prop-type-Prop exists-structure-Prop
```

### Existential quantification

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

  exists-Prop : Prop (l1  l2)
  exists-Prop = exists-structure-Prop A (type-Prop  P)

  exists : UU (l1  l2)
  exists = type-Prop exists-Prop

  abstract
    is-prop-exists : is-prop exists
    is-prop-exists = is-prop-type-Prop exists-Prop

   : Prop (l1  l2)
   = exists-Prop
```

### The introduction rule for existential quantification

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

  intro-exists : (a : A) (b : B a)  exists-structure A B
  intro-exists a b = unit-trunc-Prop (a , b)
```

**Note.** Even though the introduction rule is formalized in terms of
existential quantification on structures, it equally applies to existential
quantification on subtypes. This is because subtypes are a special case of
structure. The benefit of this approach is that Agda can infer structures for
us, but not generally subtypes.

### The universal property of existential quantification

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

  universal-property-exists-structure : UUω
  universal-property-exists-structure =
    {l : Level} (Q : Prop l) 
    (type-Prop S  type-Prop Q)  ((x : A)  B x  type-Prop Q)

module _
  {l1 l2 l3 : Level} (A : UU l1) (P : A  Prop l2) (S : Prop l3)
  where

  universal-property-exists : UUω
  universal-property-exists =
    universal-property-exists-structure A (type-Prop  P) S
```

## Properties

### The elimination rule of existential quantification

The
{{#concept "universal property" Disambiguation="of existential quantification"}}
of existential quantification states `∃ A P` is the least upper bound on the
predicate `P` in the locale of propositions.

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

  ev-intro-exists :
    {C : UU l3}  (exists-structure A B  C)  (x : A)  B x  C
  ev-intro-exists H x p = H (intro-exists x p)

  elim-exists :
    (Q : Prop l3) 
    ((x : A)  B x  type-Prop Q)  (exists-structure A B  type-Prop Q)
  elim-exists Q f = map-universal-property-trunc-Prop Q (ind-Σ f)

  abstract
    is-equiv-ev-intro-exists :
      (Q : Prop l3)  is-equiv (ev-intro-exists {type-Prop Q})
    is-equiv-ev-intro-exists Q =
      is-equiv-has-converse
        ( function-Prop (exists-structure A B) Q)
        ( Π-Prop A  x  function-Prop (B x) Q))
        ( elim-exists Q)
```

### The existential quantification satisfies the universal property of existential quantification

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

  up-exists :
    universal-property-exists-structure A B (exists-structure-Prop A B)
  up-exists Q = (ev-intro-exists , elim-exists Q)
```

### Propositions that satisfy the universal property of a existential quantification are equivalent to the existential quantification

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} (Q : Prop l3)
  (up-Q : universal-property-exists-structure A B Q)
  where

  forward-implication-iff-universal-property-exists :
    exists-structure A B  type-Prop Q
  forward-implication-iff-universal-property-exists =
    elim-exists Q (forward-implication (up-Q Q) id)

  backward-implication-iff-universal-property-exists :
    type-Prop Q  exists-structure A B
  backward-implication-iff-universal-property-exists =
    backward-implication (up-Q (exists-structure-Prop A B)) intro-exists

  iff-universal-property-exists :
    exists-structure A B  type-Prop Q
  iff-universal-property-exists =
    ( forward-implication-iff-universal-property-exists ,
      backward-implication-iff-universal-property-exists)
```

### Existential quantification of structure is the same as existential quantification over its propositional reflection

We proceed by showing that the latter satisfies the universal property of the
former.

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

  universal-property-exists-structure-exists-trunc-Prop :
    universal-property-exists-structure A B (exists-Prop A (trunc-Prop  B))
  universal-property-exists-structure-exists-trunc-Prop Q =
    ( λ f a b  f (unit-trunc-Prop (a , unit-trunc-Prop b))) ,
    ( λ f  rec-trunc-Prop Q  (a , |b|)  rec-trunc-Prop Q (f a) |b|))

  compute-exists-trunc-Prop : exists-structure A B  exists A (trunc-Prop  B)
  compute-exists-trunc-Prop =
    iff-universal-property-exists
      ( exists-Prop A (trunc-Prop  B))
      ( universal-property-exists-structure-exists-trunc-Prop)
```

### Taking the cartesian product with a proposition distributes over existential quantification of structures

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

  map-distributive-product-exists-structure :
    type-Prop P × exists-structure A B 
    exists-structure A  x  type-Prop P × B x)
  map-distributive-product-exists-structure (p , e) =
    elim-exists
      ( exists-structure-Prop A  x  type-Prop P × B x))
      ( λ x q  intro-exists x (p , q))
      ( e)

  map-inv-distributive-product-exists-structure :
    exists-structure A  x  type-Prop P × B x) 
    type-Prop P × exists-structure A B
  map-inv-distributive-product-exists-structure =
    elim-exists
      ( P  exists-structure-Prop A B)
      ( λ x (p , q)  (p , intro-exists x q))

  iff-distributive-product-exists-structure :
    ( type-Prop P × exists-structure A B) 
    ( exists-structure A  x  type-Prop P × B x))
  iff-distributive-product-exists-structure =
    ( map-distributive-product-exists-structure ,
      map-inv-distributive-product-exists-structure)

  eq-distributive-product-exists-structure :
    P  exists-structure-Prop A B 
    exists-structure-Prop A  x  type-Prop P × B x)
  eq-distributive-product-exists-structure =
    eq-iff'
      ( P  exists-structure-Prop A B)
      ( exists-structure-Prop A  x  type-Prop P × B x))
      ( iff-distributive-product-exists-structure)
```

### Conjunction distributes over existential quantification

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

  map-distributive-conjunction-exists :
    type-Prop (P  ( A Q)   A  x  P  Q x))
  map-distributive-conjunction-exists =
    map-distributive-product-exists-structure P

  map-inv-distributive-conjunction-exists :
    type-Prop ( A  x  P  Q x)  P  ( A Q))
  map-inv-distributive-conjunction-exists =
    map-inv-distributive-product-exists-structure P

  iff-distributive-conjunction-exists :
    type-Prop (P   A Q   A  x  P  Q x))
  iff-distributive-conjunction-exists =
    iff-distributive-product-exists-structure P

  eq-distributive-conjunction-exists :
    P  ( A Q)   A  x  P  Q x)
  eq-distributive-conjunction-exists =
    eq-distributive-product-exists-structure P
```

## See also

- Existential quantification is the indexed counterpart to
  [disjunction](foundation.disjunction.md)

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

## External links

- [existential quantifier](https://ncatlab.org/nlab/show/existential+quantifier)
  at $n$Lab