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