# Impredicative encodings of the logical operations
```agda
module foundation.impredicative-encodings where
```
<details><summary>Imports</summary>
```agda
open import foundation.conjunction
open import foundation.dependent-pair-types
open import foundation.disjunction
open import foundation.empty-types
open import foundation.existential-quantification
open import foundation.homotopies
open import foundation.logical-equivalences
open import foundation.negation
open import foundation.propositional-truncations
open import foundation.universal-quantification
open import foundation.universe-levels
open import foundation-core.coproduct-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.sets
```
</details>
## Idea
By universally quantifying over all
[propositions](foundation-core.propositions.md) in a universe, we can define all
the logical operations. The idea is to use the fact that any proposition `P` is
[equivalent](foundation.logical-equivalences.md) to the proposition
`(Q : Prop l) → (P ⇒ Q) ⇒ Q`, which can be thought of as the least proposition
`Q` containing `P`.
### The impredicative encoding of the propositional truncation
```agda
module _
{l : Level} (A : UU l)
where
impredicative-trunc-Prop : Prop (lsuc l)
impredicative-trunc-Prop =
∀' (Prop l) (λ Q → function-Prop (A → type-Prop Q) Q)
type-impredicative-trunc-Prop : UU (lsuc l)
type-impredicative-trunc-Prop =
type-Prop impredicative-trunc-Prop
map-impredicative-trunc-Prop :
type-trunc-Prop A → type-impredicative-trunc-Prop
map-impredicative-trunc-Prop =
map-universal-property-trunc-Prop
( impredicative-trunc-Prop)
( λ x Q f → f x)
map-inv-impredicative-trunc-Prop :
type-impredicative-trunc-Prop → type-trunc-Prop A
map-inv-impredicative-trunc-Prop H =
H (trunc-Prop A) unit-trunc-Prop
equiv-impredicative-trunc-Prop :
type-trunc-Prop A ≃ type-impredicative-trunc-Prop
equiv-impredicative-trunc-Prop =
equiv-iff
( trunc-Prop A)
( impredicative-trunc-Prop)
( map-impredicative-trunc-Prop)
( map-inv-impredicative-trunc-Prop)
```
### The impredicative encoding of conjunction
```agda
module _
{l1 l2 : Level} (P1 : Prop l1) (P2 : Prop l2)
where
impredicative-conjunction-Prop : Prop (lsuc (l1 ⊔ l2))
impredicative-conjunction-Prop =
∀' (Prop (l1 ⊔ l2)) (λ Q → (P1 ⇒ P2 ⇒ Q) ⇒ Q)
type-impredicative-conjunction-Prop : UU (lsuc (l1 ⊔ l2))
type-impredicative-conjunction-Prop =
type-Prop impredicative-conjunction-Prop
map-product-impredicative-conjunction-Prop :
type-conjunction-Prop P1 P2 → type-impredicative-conjunction-Prop
map-product-impredicative-conjunction-Prop (p1 , p2) Q f = f p1 p2
map-inv-product-impredicative-conjunction-Prop :
type-impredicative-conjunction-Prop → type-conjunction-Prop P1 P2
map-inv-product-impredicative-conjunction-Prop H = H (P1 ∧ P2) pair
equiv-product-impredicative-conjunction-Prop :
type-conjunction-Prop P1 P2 ≃ type-impredicative-conjunction-Prop
equiv-product-impredicative-conjunction-Prop =
equiv-iff
( P1 ∧ P2)
( impredicative-conjunction-Prop)
( map-product-impredicative-conjunction-Prop)
( map-inv-product-impredicative-conjunction-Prop)
```
### The impredicative encoding of disjunction
```agda
module _
{l1 l2 : Level} (P1 : Prop l1) (P2 : Prop l2)
where
impredicative-disjunction-Prop : Prop (lsuc (l1 ⊔ l2))
impredicative-disjunction-Prop =
∀' (Prop (l1 ⊔ l2)) (λ Q → (P1 ⇒ Q) ⇒ (P2 ⇒ Q) ⇒ Q)
type-impredicative-disjunction-Prop : UU (lsuc (l1 ⊔ l2))
type-impredicative-disjunction-Prop =
type-Prop impredicative-disjunction-Prop
map-impredicative-disjunction-Prop :
type-disjunction-Prop P1 P2 → type-impredicative-disjunction-Prop
map-impredicative-disjunction-Prop =
map-universal-property-trunc-Prop
( impredicative-disjunction-Prop)
( rec-coproduct (λ x Q f1 f2 → f1 x) (λ y Q f1 f2 → f2 y))
map-inv-impredicative-disjunction-Prop :
type-impredicative-disjunction-Prop → type-disjunction-Prop P1 P2
map-inv-impredicative-disjunction-Prop H =
H (P1 ∨ P2) (inl-disjunction) (inr-disjunction)
equiv-impredicative-disjunction-Prop :
type-disjunction-Prop P1 P2 ≃ type-impredicative-disjunction-Prop
equiv-impredicative-disjunction-Prop =
equiv-iff
( P1 ∨ P2)
( impredicative-disjunction-Prop)
( map-impredicative-disjunction-Prop)
( map-inv-impredicative-disjunction-Prop)
```
### The impredicative encoding of the empty type
```agda
impredicative-empty-Prop : Prop (lsuc lzero)
impredicative-empty-Prop = ∀' (Prop lzero) (λ P → P)
type-impredicative-empty-Prop : UU (lsuc lzero)
type-impredicative-empty-Prop = type-Prop impredicative-empty-Prop
is-empty-impredicative-empty-Prop :
is-empty type-impredicative-empty-Prop
is-empty-impredicative-empty-Prop e = e empty-Prop
equiv-impredicative-empty-Prop :
empty ≃ type-impredicative-empty-Prop
equiv-impredicative-empty-Prop =
equiv-is-empty id is-empty-impredicative-empty-Prop
```
### The impredicative encoding of negation
```agda
module _
{l : Level} (A : UU l)
where
impredicative-neg-Prop : Prop (lsuc l)
impredicative-neg-Prop =
Π-Prop (Prop l) (λ Q → function-Prop A Q)
type-impredicative-neg-Prop : UU (lsuc l)
type-impredicative-neg-Prop = type-Prop impredicative-neg-Prop
map-impredicative-neg-Prop : ¬ A → type-impredicative-neg-Prop
map-impredicative-neg-Prop f Q a = ex-falso (f a)
map-inv-impredicative-neg-Prop : type-impredicative-neg-Prop → ¬ A
map-inv-impredicative-neg-Prop H a = H (neg-type-Prop A) a a
equiv-impredicative-neg-Prop : ¬ A ≃ type-impredicative-neg-Prop
equiv-impredicative-neg-Prop =
equiv-iff
( neg-type-Prop A)
( impredicative-neg-Prop)
( map-impredicative-neg-Prop)
( map-inv-impredicative-neg-Prop)
```
### The impredicative encoding of existential quantification
```agda
module _
{l1 l2 : Level} {A : UU l1} (P : A → Prop l2)
where
impredicative-exists-Prop : Prop (lsuc (l1 ⊔ l2))
impredicative-exists-Prop =
∀' (Prop (l1 ⊔ l2)) (λ Q → (∀' A (λ x → P x ⇒ Q)) ⇒ Q)
type-impredicative-exists-Prop : UU (lsuc (l1 ⊔ l2))
type-impredicative-exists-Prop =
type-Prop impredicative-exists-Prop
map-impredicative-exists-Prop :
exists A P → type-impredicative-exists-Prop
map-impredicative-exists-Prop =
map-universal-property-trunc-Prop
( impredicative-exists-Prop)
( ind-Σ (λ x y Q h → h x y))
map-inv-impredicative-exists-Prop :
type-impredicative-exists-Prop → exists A P
map-inv-impredicative-exists-Prop H =
H (∃ A P) (λ x y → unit-trunc-Prop (x , y))
equiv-impredicative-exists-Prop :
exists A P ≃ type-impredicative-exists-Prop
equiv-impredicative-exists-Prop =
equiv-iff
( ∃ A P)
( impredicative-exists-Prop)
( map-impredicative-exists-Prop)
( map-inv-impredicative-exists-Prop)
```
### The impredicative encoding of the based identity type of a set
```agda
module _
{l : Level} (A : Set l) (a x : type-Set A)
where
impredicative-based-id-Prop : Prop (lsuc l)
impredicative-based-id-Prop = ∀' (type-Set A → Prop l) (λ Q → Q a ⇒ Q x)
type-impredicative-based-id-Prop : UU (lsuc l)
type-impredicative-based-id-Prop = type-Prop impredicative-based-id-Prop
map-impredicative-based-id-Prop :
a = x → type-impredicative-based-id-Prop
map-impredicative-based-id-Prop refl Q p = p
map-inv-impredicative-based-id-Prop :
type-impredicative-based-id-Prop → a = x
map-inv-impredicative-based-id-Prop H = H (Id-Prop A a) refl
equiv-impredicative-based-id-Prop :
(a = x) ≃ type-impredicative-based-id-Prop
equiv-impredicative-based-id-Prop =
equiv-iff
( Id-Prop A a x)
( impredicative-based-id-Prop)
( map-impredicative-based-id-Prop)
( map-inv-impredicative-based-id-Prop)
```
### The impredicative encoding of Martin-Löf's identity type of a set
```agda
module _
{l : Level} (A : Set l) (x y : type-Set A)
where
impredicative-id-Prop : Prop (lsuc l)
impredicative-id-Prop =
∀'
( type-Set A → type-Set A → Prop l)
( λ Q → (∀' (type-Set A) (λ a → Q a a)) ⇒ Q x y)
type-impredicative-id-Prop : UU (lsuc l)
type-impredicative-id-Prop = type-Prop impredicative-id-Prop
map-impredicative-id-Prop :
x = y → type-impredicative-id-Prop
map-impredicative-id-Prop refl Q r = r x
map-inv-impredicative-id-Prop :
type-impredicative-id-Prop → x = y
map-inv-impredicative-id-Prop H = H (Id-Prop A) (refl-htpy)
equiv-impredicative-id-Prop :
(x = y) ≃ type-impredicative-id-Prop
equiv-impredicative-id-Prop =
equiv-iff
( Id-Prop A x y)
( impredicative-id-Prop)
( map-impredicative-id-Prop)
( map-inv-impredicative-id-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}}
## External links
- [Constructing coproduct types and boolean types from universes](https://mathoverflow.net/questions/457904/constructing-coproduct-types-and-boolean-types-from-universes)
at mathoverflow