# Modal operators

```agda
module orthogonal-factorization-systems.modal-operators where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.propositions
open import foundation.small-types
open import foundation.subuniverses
open import foundation.universe-levels
```

</details>

## Idea

Underlying every modality is a **modal operator**, which is an operation on
types that construct new types. For a _monadic_ modality `○`, there is moreover
a **modal unit** that compares every type `X` to its modal type `○ X`
(`X → ○ X`).

## Definitions

### Modal operators

```agda
operator-modality : (l1 l2 : Level)  UU (lsuc l1  lsuc l2)
operator-modality l1 l2 = UU l1  UU l2
```

### Modal units

```agda
unit-modality : {l1 l2 : Level}  operator-modality l1 l2  UU (lsuc l1  l2)
unit-modality {l1}  = {X : UU l1}  X   X
```

### The subuniverse of modal types

```agda
module _
  {l1 l2 : Level} { : operator-modality l1 l2} (unit-○ : unit-modality )
  where

  is-modal : (X : UU l1)  UU (l1  l2)
  is-modal X = is-equiv (unit-○ {X})

  is-modal-family : {l3 : Level} {X : UU l3} (P : X  UU l1)  UU (l1  l2  l3)
  is-modal-family {X = X} P = (x : X)  is-modal (P x)

  modal-type : UU (lsuc l1  l2)
  modal-type = Σ (UU l1) (is-modal)

  is-modal-Prop : (X : UU l1)  Prop (l1  l2)
  is-modal-Prop X = is-equiv-Prop (unit-○ {X})

  is-property-is-modal : (X : UU l1)  is-prop (is-modal X)
  is-property-is-modal X = is-prop-type-Prop (is-modal-Prop X)

  is-subuniverse-is-modal : is-subuniverse is-modal
  is-subuniverse-is-modal = is-property-is-modal

  modal-type-subuniverse : subuniverse l1 (l1  l2)
  modal-type-subuniverse = is-modal-Prop
```

### Modal small types

A small type is said to be modal if its small equivalent is modal.

```agda
is-modal-type-is-small :
  {l1 l2 l3 : Level}
  { : operator-modality l1 l2} (unit-○ : unit-modality )
  (X : UU l3) (is-small-X : is-small l1 X)  UU (l1  l2)
is-modal-type-is-small unit-○ X is-small-X =
  is-modal unit-○ (type-is-small is-small-X)

module _
  {l1 l2 l3 : Level}
  { : operator-modality l1 l2} (unit-○ : unit-modality )
  (X : UU l3) (is-small-X : is-small l1 X)
  where

  is-equiv-unit-is-modal-type-is-small :
    is-modal-type-is-small unit-○ X is-small-X 
    is-equiv (unit-○  map-equiv-is-small is-small-X)
  is-equiv-unit-is-modal-type-is-small =
    is-equiv-comp
      ( unit-○)
      ( map-equiv-is-small is-small-X)
      ( is-equiv-map-equiv (equiv-is-small is-small-X))

  equiv-unit-is-modal-type-is-small :
    is-modal-type-is-small unit-○ X is-small-X 
    X   (type-is-small is-small-X)
  pr1 (equiv-unit-is-modal-type-is-small m) =
    unit-○  map-equiv-is-small is-small-X
  pr2 (equiv-unit-is-modal-type-is-small m) =
    is-equiv-unit-is-modal-type-is-small m

  map-inv-unit-is-modal-type-is-small :
    is-modal-type-is-small unit-○ X is-small-X 
     (type-is-small is-small-X)  X
  map-inv-unit-is-modal-type-is-small =
    map-inv-equiv  equiv-unit-is-modal-type-is-small

module _
  {l1 l2 : Level} (l3 : Level)
  { : operator-modality l1 l2} (unit-○ : unit-modality )
  (X : Small-Type l1 l3)
  where

  is-modal-Small-Type : UU (l1  l2)
  is-modal-Small-Type =
    is-modal-type-is-small unit-○
      ( type-Small-Type X)
      ( is-small-type-Small-Type X)

  is-equiv-unit-is-modal-Small-Type :
    is-modal-Small-Type 
    is-equiv (unit-○  map-equiv (equiv-is-small-type-Small-Type X))
  is-equiv-unit-is-modal-Small-Type =
    is-equiv-unit-is-modal-type-is-small unit-○
      ( type-Small-Type X)
      ( is-small-type-Small-Type X)

  equiv-unit-is-modal-Small-Type :
    is-modal-Small-Type  type-Small-Type X   (small-type-Small-Type X)
  equiv-unit-is-modal-Small-Type =
    equiv-unit-is-modal-type-is-small unit-○
      ( type-Small-Type X)
      ( is-small-type-Small-Type X)

  map-inv-unit-is-modal-Small-Type :
    is-modal-Small-Type   (small-type-Small-Type X)  type-Small-Type X
  map-inv-unit-is-modal-Small-Type =
    map-inv-equiv  equiv-unit-is-modal-Small-Type
```

## References

{{#bibliography}} {{#reference RSS20}}