# Modal induction ```agda module orthogonal-factorization-systems.modal-induction where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.function-extensionality open import foundation.function-types open import foundation.functoriality-dependent-function-types open import foundation.functoriality-dependent-pair-types open import foundation.homotopies open import foundation.identity-types open import foundation.multivariable-sections open import foundation.precomposition-dependent-functions open import foundation.precomposition-functions open import foundation.retractions open import foundation.sections open import foundation.type-theoretic-principle-of-choice open import foundation.unit-type open import foundation.universe-levels open import orthogonal-factorization-systems.modal-operators ``` </details> ## Idea Given a [modal operator](orthogonal-factorization-systems.modal-operators.md) `○` and a modal unit, a **modal induction principle** for the modality is a [section of maps of maps](foundation.multivariable-sections.md): ```text multivariable-section 1 (precomp-Π unit-○ (○ ∘ P)) ``` where ```text precomp-Π unit-○ (○ ∘ P) : ((x' : ○ X) → ○ (P x')) → (x : X) → ○ (P (unit-○ x)) ``` for all families `P` over some `○ X`. Note that for such principles to coincide with [modal subuniverse induction](orthogonal-factorization-systems.modal-subuniverse-induction.md), the modality must be idempotent. ## Definition ### Modal induction ```agda module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) where ind-modality : UU (lsuc l1 ⊔ l2) ind-modality = {X : UU l1} (P : ○ X → UU l1) → ((x : X) → ○ (P (unit-○ x))) → (x' : ○ X) → ○ (P x') compute-ind-modality : ind-modality → UU (lsuc l1 ⊔ l2) compute-ind-modality ind-○ = {X : UU l1} (P : ○ X → UU l1) → (f : (x : X) → ○ (P (unit-○ x))) → (x : X) → ind-○ P f (unit-○ x) = f x induction-principle-modality : UU (lsuc l1 ⊔ l2) induction-principle-modality = {X : UU l1} (P : ○ X → UU l1) → multivariable-section 1 (precomp-Π unit-○ (○ ∘ P)) ind-induction-principle-modality : induction-principle-modality → ind-modality ind-induction-principle-modality I P = map-multivariable-section 1 (precomp-Π unit-○ (○ ∘ P)) (I P) compute-ind-induction-principle-modality : (I : induction-principle-modality) → compute-ind-modality (ind-induction-principle-modality I) compute-ind-induction-principle-modality I P = is-multivariable-section-map-multivariable-section 1 ( precomp-Π unit-○ (○ ∘ P)) ( I P) ``` ### Modal recursion ```agda module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) where rec-modality : UU (lsuc l1 ⊔ l2) rec-modality = {X Y : UU l1} → (X → ○ Y) → ○ X → ○ Y compute-rec-modality : rec-modality → UU (lsuc l1 ⊔ l2) compute-rec-modality rec-○ = {X Y : UU l1} → (f : X → ○ Y) → (x : X) → rec-○ f (unit-○ x) = f x recursion-principle-modality : UU (lsuc l1 ⊔ l2) recursion-principle-modality = {X Y : UU l1} → multivariable-section 1 (precomp {A = X} unit-○ (○ Y)) rec-recursion-principle-modality : recursion-principle-modality → rec-modality rec-recursion-principle-modality I {Y = Y} = map-multivariable-section 1 (precomp unit-○ (○ Y)) I compute-rec-recursion-principle-modality : (I : recursion-principle-modality) → compute-rec-modality (rec-recursion-principle-modality I) compute-rec-recursion-principle-modality I {Y = Y} = is-multivariable-section-map-multivariable-section 1 ( precomp unit-○ (○ Y)) I ``` ## Properties ### Modal recursion from induction ```agda module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) where rec-ind-modality : ind-modality unit-○ → rec-modality unit-○ rec-ind-modality ind {Y = Y} = ind (λ _ → Y) compute-rec-compute-ind-modality : (ind-○ : ind-modality unit-○) → compute-ind-modality unit-○ ind-○ → compute-rec-modality unit-○ (rec-ind-modality ind-○) compute-rec-compute-ind-modality ind-○ compute-ind-○ {Y = Y} = compute-ind-○ (λ _ → Y) recursion-principle-induction-principle-modality : induction-principle-modality unit-○ → recursion-principle-modality unit-○ recursion-principle-induction-principle-modality I {Y = Y} = I (λ _ → Y) ``` ### Modal induction gives an inverse to the unit ```agda is-section-ind-modality : {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) (ind-○ : ind-modality unit-○) (compute-ind-○ : compute-ind-modality unit-○ ind-○) {X : UU l1} {P : ○ X → UU l1} → (precomp-Π unit-○ (○ ∘ P) ∘ ind-○ P) ~ id is-section-ind-modality unit-○ ind-○ compute-ind-○ {X} {P} = eq-htpy ∘ compute-ind-○ P is-retraction-ind-id-modality : {l : Level} {○ : operator-modality l l} (unit-○ : unit-modality ○) (ind-○ : ind-modality unit-○) (compute-ind-○ : compute-ind-modality unit-○ ind-○) {X : UU l} → (ind-○ (λ _ → X) id ∘ unit-○) ~ id is-retraction-ind-id-modality {○ = ○} unit-○ ind-○ compute-ind-○ {X} = compute-ind-○ (λ _ → X) id module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) (rec-○ : rec-modality unit-○) (compute-rec-○ : compute-rec-modality unit-○ rec-○) where is-retraction-rec-map-modality : {X Y : UU l1} (f : ○ X → Y) (r : retraction f) → (rec-○ (map-retraction f r) ∘ (unit-○ ∘ f)) ~ id is-retraction-rec-map-modality {X} {Y} f r = ( compute-rec-○ (map-retraction f r) ∘ f) ∙h ( is-retraction-map-retraction f r) retraction-rec-map-modality : {X Y : UU l1} (f : ○ X → Y) → retraction f → retraction (unit-○ ∘ f) pr1 (retraction-rec-map-modality {X} {Y} f r) = rec-○ (map-retraction f r) pr2 (retraction-rec-map-modality f r) = is-retraction-rec-map-modality f r section-rec-map-modality : {X Y : UU l1} (f : X → ○ Y) → section f → section (rec-○ f) pr1 (section-rec-map-modality f s) = unit-○ ∘ map-section f s pr2 (section-rec-map-modality {X} {Y} f s) = (compute-rec-○ f ∘ map-section f s) ∙h is-section-map-section f s ``` ### A modal induction principle consists precisely of an induction rule and a computation rule ```agda equiv-section-unit-induction-principle-modality : { l1 l2 : Level} { ○ : operator-modality l1 l2} ( unit-○ : unit-modality ○) → ( induction-principle-modality unit-○) ≃ Σ ( {X : UU l1} (P : ○ X → UU l1) → ((x : X) → ○ (P (unit-○ x))) → (x' : ○ X) → ○ (P x')) ( λ I → {X : UU l1} (P : ○ X → UU l1) (f : (x : X) → ○ (P (unit-○ x))) → I P f ∘ unit-○ ~ f) equiv-section-unit-induction-principle-modality unit-○ = distributive-implicit-Π-Σ ∘e equiv-implicit-Π-equiv-family (λ _ → distributive-Π-Σ) equiv-section-unit-recursion-principle-modality : { l1 l2 : Level} { ○ : operator-modality l1 l2} ( unit-○ : unit-modality ○) → ( recursion-principle-modality unit-○) ≃ Σ ( {X Y : UU l1} → (X → ○ Y) → ○ X → ○ Y) ( λ I → {X Y : UU l1} (f : X → ○ Y) → I f ∘ unit-○ ~ f) equiv-section-unit-recursion-principle-modality unit-○ = distributive-implicit-Π-Σ ∘e equiv-implicit-Π-equiv-family (λ _ → distributive-implicit-Π-Σ) ``` ### The modal operator's action on maps ```agda module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) where ap-map-rec-modality : rec-modality unit-○ → {X Y : UU l1} → (X → Y) → ○ X → ○ Y ap-map-rec-modality rec-○ f = rec-○ (unit-○ ∘ f) ap-map-ind-modality : ind-modality unit-○ → {X Y : UU l1} → (X → Y) → ○ X → ○ Y ap-map-ind-modality ind-○ = ap-map-rec-modality (rec-ind-modality unit-○ ind-○) ``` ### Naturality of the unit For every `f : X → Y` there is an associated [naturality square](foundation-core.commuting-squares-of-maps.md) ```text f X ------> Y | | | | ∨ ∨ ○ X ----> ○ Y. ○ f ``` ```agda module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) (rec-○ : rec-modality unit-○) (compute-rec-○ : compute-rec-modality unit-○ rec-○) where naturality-unit-rec-modality : {X Y : UU l1} (f : X → Y) → (ap-map-rec-modality unit-○ rec-○ f ∘ unit-○) ~ (unit-○ ∘ f) naturality-unit-rec-modality f = compute-rec-○ (unit-○ ∘ f) naturality-unit-rec-modality' : {X Y : UU l1} (f : X → Y) {x x' : X} → unit-○ x = unit-○ x' → unit-○ (f x) = unit-○ (f x') naturality-unit-rec-modality' f {x} {x'} p = ( inv (naturality-unit-rec-modality f x)) ∙ ( ( ap (ap-map-rec-modality unit-○ rec-○ f) p) ∙ ( naturality-unit-rec-modality f x')) module _ {l1 l2 : Level} {○ : operator-modality l1 l2} (unit-○ : unit-modality ○) (ind-○ : ind-modality unit-○) (compute-ind-○ : compute-ind-modality unit-○ ind-○) where naturality-unit-ind-modality : {X Y : UU l1} (f : X → Y) → ap-map-ind-modality unit-○ ind-○ f ∘ unit-○ ~ unit-○ ∘ f naturality-unit-ind-modality = naturality-unit-rec-modality unit-○ ( rec-ind-modality unit-○ ind-○) ( compute-rec-compute-ind-modality unit-○ ind-○ compute-ind-○) naturality-unit-ind-modality' : {X Y : UU l1} (f : X → Y) {x x' : X} → unit-○ x = unit-○ x' → unit-○ (f x) = unit-○ (f x') naturality-unit-ind-modality' = naturality-unit-rec-modality' unit-○ ( rec-ind-modality unit-○ ind-○) ( compute-rec-compute-ind-modality unit-○ ind-○ compute-ind-○) ``` ## See also - [Functoriality of higher modalities](orthogonal-factorization-systems.functoriality-higher-modalities.md) - [Modal subuniverse induction](orthogonal-factorization-systems.modal-subuniverse-induction.md)