diff --git a/src/foundation-core/retracts-of-types.lagda.md b/src/foundation-core/retracts-of-types.lagda.md index 8811b4a08c..41e3177933 100644 --- a/src/foundation-core/retracts-of-types.lagda.md +++ b/src/foundation-core/retracts-of-types.lagda.md @@ -14,6 +14,7 @@ open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.function-types +open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.postcomposition-functions open import foundation-core.precomposition-functions @@ -168,6 +169,17 @@ module _ eq-htpy (is-retraction-map-retraction-retract R ·r h) ``` +### Every type is a retract of itself + +```agda +module _ + {l : Level} {A : UU l} + where + + id-retract : A retract-of A + id-retract = (id , id , refl-htpy) +``` + ### Composition of retracts ```agda diff --git a/src/foundation/constant-maps.lagda.md b/src/foundation/constant-maps.lagda.md index 50092a9456..ee108c5882 100644 --- a/src/foundation/constant-maps.lagda.md +++ b/src/foundation/constant-maps.lagda.md @@ -15,11 +15,20 @@ open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.faithful-maps open import foundation.function-extensionality +open import foundation.functoriality-dependent-pair-types +open import foundation.morphisms-arrows +open import foundation.postcomposition-functions +open import foundation.retracts-of-maps +open import foundation.retracts-of-types +open import foundation.transposition-identifications-along-equivalences open import foundation.type-arithmetic-unit-type +open import foundation.type-theoretic-principle-of-choice open import foundation.unit-type open import foundation.universe-levels +open import foundation.whiskering-homotopies-composition open import foundation-core.1-types +open import foundation-core.commuting-squares-of-maps open import foundation-core.contractible-maps open import foundation-core.embeddings open import foundation-core.equivalences @@ -55,6 +64,14 @@ module _ compute-action-htpy-function-const c H = ap-const c (eq-htpy H) ``` +### Computing the fibers of point inclusions + +```agda +compute-fiber-point : + {l : Level} {A : UU l} (x y : A) → fiber (point x) y ≃ (x = y) +compute-fiber-point x y = left-unit-law-product +``` + ### A type is `k+1`-truncated if and only if all point inclusions are `k`-truncated maps ```agda @@ -62,9 +79,6 @@ module _ {l : Level} {A : UU l} where - compute-fiber-point : (x y : A) → fiber (point x) y ≃ (x = y) - compute-fiber-point x y = left-unit-law-product - abstract is-trunc-map-point-is-trunc : (k : 𝕋) → is-trunc (succ-𝕋 k) A → diff --git a/src/foundation/diagonal-maps-of-types.lagda.md b/src/foundation/diagonal-maps-of-types.lagda.md index e21cd71a53..b4a0135888 100644 --- a/src/foundation/diagonal-maps-of-types.lagda.md +++ b/src/foundation/diagonal-maps-of-types.lagda.md @@ -11,6 +11,11 @@ open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.equality-cartesian-product-types open import foundation.function-extensionality +open import foundation.functoriality-dependent-pair-types +open import foundation.morphisms-arrows +open import foundation.postcomposition-functions +open import foundation.retracts-of-types +open import foundation.transposition-identifications-along-equivalences open import foundation.universe-levels open import foundation-core.cartesian-product-types @@ -80,3 +85,36 @@ module _ pr1 diagonal-exponential-injection = diagonal-exponential A B pr2 diagonal-exponential-injection = is-injective-diagonal-exponential ``` + +### The action on identifications of an (exponential) diagonal is a diagonal + +```agda +module _ + {l1 l2 : Level} (A : UU l1) {B : UU l2} (x y : B) + where + + compute-htpy-eq-ap-diagonal-exponential : + htpy-eq ∘ ap (diagonal-exponential B A) ~ diagonal-exponential (x = y) A + compute-htpy-eq-ap-diagonal-exponential refl = refl + + inv-compute-htpy-eq-ap-diagonal-exponential : + diagonal-exponential (x = y) A ~ htpy-eq ∘ ap (diagonal-exponential B A) + inv-compute-htpy-eq-ap-diagonal-exponential = + inv-htpy compute-htpy-eq-ap-diagonal-exponential + + compute-eq-htpy-ap-diagonal-exponential : + ap (diagonal-exponential B A) ~ eq-htpy ∘ diagonal-exponential (x = y) A + compute-eq-htpy-ap-diagonal-exponential p = + map-eq-transpose-equiv + ( equiv-funext) + ( compute-htpy-eq-ap-diagonal-exponential p) +``` + +### Computing the fibers of diagonal maps + +```agda +compute-fiber-diagonal-exponential : + {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → + fiber (diagonal-exponential B A) f ≃ Σ B (λ b → (x : A) → b = f x) +compute-fiber-diagonal-exponential f = equiv-tot (λ _ → equiv-funext) +``` diff --git a/src/foundation/retracts-of-maps.lagda.md b/src/foundation/retracts-of-maps.lagda.md index d79a6ea065..14878fae2f 100644 --- a/src/foundation/retracts-of-maps.lagda.md +++ b/src/foundation/retracts-of-maps.lagda.md @@ -11,9 +11,11 @@ open import foundation.action-on-identifications-functions open import foundation.commuting-prisms-of-maps open import foundation.commuting-triangles-of-morphisms-arrows open import foundation.dependent-pair-types +open import foundation.diagonal-maps-of-types open import foundation.function-extensionality open import foundation.functoriality-fibers-of-maps open import foundation.homotopies-morphisms-arrows +open import foundation.homotopy-algebra open import foundation.morphisms-arrows open import foundation.postcomposition-functions open import foundation.precomposition-functions @@ -21,6 +23,7 @@ open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.commuting-squares-of-maps +open import foundation-core.constant-maps open import foundation-core.equivalences open import foundation-core.fibers-of-maps open import foundation-core.function-types @@ -904,6 +907,75 @@ module _ pr2 retract-map-postcomp-retract-map = retraction-postcomp-retract-map ``` +### If `A` is a retract of `B` and `S` is a retract of `T` then `diagonal-exponential A S` is a retract of `diagonal-exponential B T` + +```agda +module _ + {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {S : UU l3} {T : UU l4} + (R : A retract-of B) (Q : S retract-of T) + where + + inclusion-diagonal-exponential-retract : + hom-arrow (diagonal-exponential A S) (diagonal-exponential B T) + inclusion-diagonal-exponential-retract = + ( inclusion-retract R , + precomp (map-retraction-retract Q) B ∘ postcomp S (inclusion-retract R) , + refl-htpy) + + hom-retraction-diagonal-exponential-retract : + hom-arrow (diagonal-exponential B T) (diagonal-exponential A S) + hom-retraction-diagonal-exponential-retract = + ( map-retraction-retract R , + postcomp S (map-retraction-retract R) ∘ precomp (inclusion-retract Q) B , + refl-htpy) + + coh-retract-map-diagonal-exponential-retract : + coherence-retract-map + ( diagonal-exponential A S) + ( diagonal-exponential B T) + ( inclusion-diagonal-exponential-retract) + ( hom-retraction-diagonal-exponential-retract) + ( is-retraction-map-retraction-retract R) + ( horizontal-concat-htpy + ( htpy-postcomp S (is-retraction-map-retraction-retract R)) + ( htpy-precomp (is-retraction-map-retraction-retract Q) A)) + coh-retract-map-diagonal-exponential-retract x = + ( compute-eq-htpy-ap-diagonal-exponential S + ( map-retraction-retract R (inclusion-retract R x)) + ( x) + ( is-retraction-map-retraction-retract R x)) ∙ + ( ap + ( λ p → + ( ap (λ f a → map-retraction-retract R (inclusion-retract R (f a))) p) ∙ + ( eq-htpy (λ _ → is-retraction-map-retraction-retract R x))) + ( inv + ( ( ap + ( eq-htpy) + ( eq-htpy (ap-const x ·r is-retraction-map-retraction-retract Q))) ∙ + ( eq-htpy-refl-htpy (diagonal-exponential A S x))))) ∙ + ( inv right-unit) + + is-retraction-hom-retraction-diagonal-exponential-retract : + is-retraction-hom-arrow + ( diagonal-exponential A S) + ( diagonal-exponential B T) + ( inclusion-diagonal-exponential-retract) + ( hom-retraction-diagonal-exponential-retract) + is-retraction-hom-retraction-diagonal-exponential-retract = + ( ( is-retraction-map-retraction-retract R) , + ( horizontal-concat-htpy + ( htpy-postcomp S (is-retraction-map-retraction-retract R)) + ( htpy-precomp (is-retraction-map-retraction-retract Q) A)) , + ( coh-retract-map-diagonal-exponential-retract)) + + retract-map-diagonal-exponential-retract : + (diagonal-exponential A S) retract-of-map (diagonal-exponential B T) + retract-map-diagonal-exponential-retract = + ( inclusion-diagonal-exponential-retract , + hom-retraction-diagonal-exponential-retract , + is-retraction-hom-retraction-diagonal-exponential-retract) +``` + ## References {{#bibliography}} {{#reference UF13}} diff --git a/src/orthogonal-factorization-systems.lagda.md b/src/orthogonal-factorization-systems.lagda.md index 0a15faea26..95c940b7c6 100644 --- a/src/orthogonal-factorization-systems.lagda.md +++ b/src/orthogonal-factorization-systems.lagda.md @@ -42,6 +42,8 @@ open import orthogonal-factorization-systems.mere-lifting-properties public open import orthogonal-factorization-systems.modal-induction public open import orthogonal-factorization-systems.modal-operators public open import orthogonal-factorization-systems.modal-subuniverse-induction public +open import orthogonal-factorization-systems.null-families-of-types public +open import orthogonal-factorization-systems.null-maps public open import orthogonal-factorization-systems.null-types public open import orthogonal-factorization-systems.open-modalities public open import orthogonal-factorization-systems.orthogonal-factorization-systems public diff --git a/src/orthogonal-factorization-systems/local-families-of-types.lagda.md b/src/orthogonal-factorization-systems/local-families-of-types.lagda.md index 18f7cb3737..eb8d398b33 100644 --- a/src/orthogonal-factorization-systems/local-families-of-types.lagda.md +++ b/src/orthogonal-factorization-systems/local-families-of-types.lagda.md @@ -23,15 +23,15 @@ open import orthogonal-factorization-systems.orthogonal-maps A family of types `B : A → UU l` is said to be {{#concept "local" Disambiguation="family of types" Agda=is-local-family}} at -`f : Y → X`, or **`f`-local**, if every +`f : X → Y`, or **`f`-local**, if every [fiber](foundation-core.fibers-of-maps.md) is. ## Definition ```agda module _ - {l1 l2 l3 l4 : Level} {Y : UU l1} {X : UU l2} - (f : Y → X) {A : UU l3} (B : A → UU l4) + {l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} + (f : X → Y) {A : UU l3} (B : A → UU l4) where is-local-family : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) diff --git a/src/orthogonal-factorization-systems/local-maps.lagda.md b/src/orthogonal-factorization-systems/local-maps.lagda.md index 5703f6ba16..f19c0c87ee 100644 --- a/src/orthogonal-factorization-systems/local-maps.lagda.md +++ b/src/orthogonal-factorization-systems/local-maps.lagda.md @@ -7,34 +7,54 @@ module orthogonal-factorization-systems.local-maps where
Imports ```agda +open import foundation.action-on-identifications-functions open import foundation.cartesian-morphisms-arrows +open import foundation.cones-over-cospan-diagrams +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.equivalences-arrows open import foundation.fibers-of-maps +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.functoriality-fibers-of-maps +open import foundation.homotopies +open import foundation.identity-types +open import foundation.postcomposition-functions +open import foundation.precomposition-functions open import foundation.propositions +open import foundation.pullbacks open import foundation.unit-type +open import foundation.universal-property-family-of-fibers-of-maps open import foundation.universe-levels open import orthogonal-factorization-systems.local-families-of-types open import orthogonal-factorization-systems.local-types open import orthogonal-factorization-systems.orthogonal-maps +open import orthogonal-factorization-systems.pullback-hom ```
## Idea -A map `g : A → B` is said to be +A map `g : X → Y` is said to be {{#concept "local" Disambiguation="maps of types" Agda=is-local-map}} at -`f : Y → X`, or +`f : A → B`, or {{#concept "`f`-local" Disambiguation="maps of types" Agda=is-local-map}}, if all its [fibers](foundation-core.fibers-of-maps.md) are [`f`-local types](orthogonal-factorization-systems.local-types.md). +Equivalently, the map `g` is `f`-local if and only if `f` is +[orthogonal](orthogonal-factorization-systems.orthogonal-maps.md) to `g`. + ## Definition ```agda module _ - {l1 l2 l3 l4 : Level} {Y : UU l1} {X : UU l2} {A : UU l3} {B : UU l4} - (f : Y → X) (g : A → B) + {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} + (f : A → B) (g : X → Y) where is-local-map : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) @@ -51,17 +71,17 @@ module _ ```agda module _ - {l1 l2 l3 : Level} {Y : UU l1} {X : UU l2} {B : UU l3} - (f : Y → X) + {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {Y : UU l3} + (f : A → B) where is-local-is-local-terminal-map : - is-local-map f (terminal-map B) → is-local f B + is-local-map f (terminal-map Y) → is-local f Y is-local-is-local-terminal-map H = is-local-equiv f (inv-equiv-fiber-terminal-map star) (H star) is-local-terminal-map-is-local : - is-local f B → is-local-map f (terminal-map B) + is-local f Y → is-local-map f (terminal-map Y) is-local-terminal-map-is-local H u = is-local-equiv f (equiv-fiber-terminal-map u) H ``` @@ -70,8 +90,7 @@ module _ ```agda module _ - {l1 l2 l3 l4 l5 l6 : Level} - {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {X' : UU l5} {Y' : UU l6} + {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} (f : A → B) (g : X → Y) where diff --git a/src/orthogonal-factorization-systems/local-types.lagda.md b/src/orthogonal-factorization-systems/local-types.lagda.md index 38b13c18ae..0f957651be 100644 --- a/src/orthogonal-factorization-systems/local-types.lagda.md +++ b/src/orthogonal-factorization-systems/local-types.lagda.md @@ -41,25 +41,36 @@ open import foundation.universe-levels ## Idea -A dependent type `A` over `X` is said to be **local at** `f : Y → X`, or -**`f`-local**, if the [precomposition map](foundation-core.function-types.md) +A dependent type `A` over `Y` is said to be +{{#concept "local at" Disambiguation="map of types"}} `f : X → Y`, or +{{#concept "`f`-local" Disambiguation="map of types"}} , if the +[precomposition map](foundation-core.function-types.md) ```text - _∘ f : ((x : X) → A x) → ((y : Y) → A (f y)) + _∘ f : ((y : Y) → A y) → ((x : X) → A (f x)) ``` is an [equivalence](foundation-core.equivalences.md). -We reserve the name `is-local` for when `A` does not vary over `X`, and specify +We reserve the name `is-local` for when `A` does not vary over `Y`, and specify with `is-local-dependent-type` when it does. +Note that a local dependent type is not the same as a +[local family](orthogonal-factorization-systems.local-families-of-types.md). +While a local family is a type family `P` on some other indexing type `A`, such +that each fiber is local as a nondependent type over `Y`, a local dependent type +is a local type that additionally may vary over `Y`. Concretely, a local +dependent type `A` may be understood as a family of types such that for every +`y : Y`, `A y` is +`fiber f y`-[null](orthogonal-factorization-systems.null-types.md). + ## Definition ### Local dependent types ```agda module _ - {l1 l2 l3 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) (A : X → UU l3) + {l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) (A : Y → UU l3) where is-local-dependent-type : UU (l1 ⊔ l2 ⊔ l3) @@ -77,7 +88,7 @@ module _ ```agda module _ - {l1 l2 l3 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) (A : UU l3) + {l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) (A : UU l3) where is-local : UU (l1 ⊔ l2 ⊔ l3) @@ -92,15 +103,15 @@ module _ ## Properties -### Being local distributes over Π-types +### Locality distributes over Π-types ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where distributive-Π-is-local-dependent-type : - {l3 l4 : Level} {A : UU l3} (B : A → X → UU l4) → + {l3 l4 : Level} {A : UU l3} (B : A → Y → UU l4) → ((a : A) → is-local-dependent-type f (B a)) → is-local-dependent-type f (λ x → (a : A) → B a x) distributive-Π-is-local-dependent-type B f-loc = @@ -122,8 +133,8 @@ module _ ```agda module _ {l1 l2 l3 l4 : Level} - {Y : UU l1} {X : UU l2} {A : X → UU l3} {B : X → UU l4} - (f : Y → X) + {X : UU l1} {Y : UU l2} {A : Y → UU l3} {B : Y → UU l4} + (f : X → Y) where is-local-dependent-type-fam-equiv : @@ -143,8 +154,8 @@ module _ module _ {l1 l2 l3 l4 : Level} - {Y : UU l1} {X : UU l2} {A : UU l3} {B : UU l4} - (f : Y → X) + {X : UU l1} {Y : UU l2} {A : UU l3} {B : UU l4} + (f : X → Y) where is-local-equiv : A ≃ B → is-local f B → is-local f A @@ -158,7 +169,7 @@ module _ ```agda module _ - {l1 l2 l3 : Level} {Y : UU l1} {X : UU l2} {A : UU l3} {f f' : Y → X} + {l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} {f f' : X → Y} where is-local-htpy : (H : f ~ f') → is-local f' A → is-local f A @@ -227,7 +238,7 @@ module _ ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where is-equiv-is-local : ({l : Level} (A : UU l) → is-local f A) → is-equiv f @@ -238,43 +249,43 @@ module _ ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where - section-is-local-domains' : section (precomp f Y) → is-local f X → section f - pr1 (section-is-local-domains' section-precomp-Y is-local-X) = - pr1 section-precomp-Y id - pr2 (section-is-local-domains' section-precomp-Y is-local-X) = + section-is-local-domains' : section (precomp f X) → is-local f Y → section f + pr1 (section-is-local-domains' section-precomp-X is-local-Y) = + pr1 section-precomp-X id + pr2 (section-is-local-domains' section-precomp-X is-local-Y) = htpy-eq ( ap ( pr1) - { ( f ∘ pr1 (section-is-local-domains' section-precomp-Y is-local-X)) , - ( ap (postcomp Y f) (pr2 section-precomp-Y id))} + { ( f ∘ pr1 (section-is-local-domains' section-precomp-X is-local-Y)) , + ( ap (postcomp X f) (pr2 section-precomp-X id))} { id , refl} - ( eq-is-contr (is-contr-map-is-equiv is-local-X f))) + ( eq-is-contr (is-contr-map-is-equiv is-local-Y f))) - is-equiv-is-local-domains' : section (precomp f Y) → is-local f X → is-equiv f - pr1 (is-equiv-is-local-domains' section-precomp-Y is-local-X) = - section-is-local-domains' section-precomp-Y is-local-X - pr2 (is-equiv-is-local-domains' section-precomp-Y is-local-X) = - retraction-section-precomp-domain f section-precomp-Y + is-equiv-is-local-domains' : section (precomp f X) → is-local f Y → is-equiv f + pr1 (is-equiv-is-local-domains' section-precomp-X is-local-Y) = + section-is-local-domains' section-precomp-X is-local-Y + pr2 (is-equiv-is-local-domains' section-precomp-X is-local-Y) = + retraction-section-precomp-domain f section-precomp-X - is-equiv-is-local-domains : is-local f Y → is-local f X → is-equiv f - is-equiv-is-local-domains is-local-Y = - is-equiv-is-local-domains' (pr1 is-local-Y) + is-equiv-is-local-domains : is-local f X → is-local f Y → is-equiv f + is-equiv-is-local-domains is-local-X = + is-equiv-is-local-domains' (pr1 is-local-X) ``` ### Propositions are `f`-local if `_∘ f` has a converse ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where is-local-dependent-type-is-prop : - {l : Level} (A : X → UU l) → - ((x : X) → is-prop (A x)) → - (((y : Y) → A (f y)) → ((x : X) → A x)) → + {l : Level} (A : Y → UU l) → + ((y : Y) → is-prop (A y)) → + (((x : X) → A (f x)) → ((y : Y) → A y)) → is-local-dependent-type f A is-local-dependent-type-is-prop A is-prop-A = is-equiv-has-converse-is-prop @@ -283,22 +294,20 @@ module _ is-local-is-prop : {l : Level} (A : UU l) → - is-prop A → ((Y → A) → (X → A)) → is-local f A + is-prop A → ((X → A) → (Y → A)) → is-local f A is-local-is-prop A is-prop-A = is-local-dependent-type-is-prop (λ _ → A) (λ _ → is-prop-A) ``` -## Examples - ### All type families are local at equivalences ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where is-local-dependent-type-is-equiv : - is-equiv f → {l : Level} (A : X → UU l) → is-local-dependent-type f A + is-equiv f → {l : Level} (A : Y → UU l) → is-local-dependent-type f A is-local-dependent-type-is-equiv is-equiv-f = is-equiv-precomp-Π-is-equiv is-equiv-f @@ -311,12 +320,12 @@ module _ ```agda module _ - {l1 l2 : Level} {Y : UU l1} {X : UU l2} (f : Y → X) + {l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) where is-local-dependent-type-is-contr : - {l : Level} (A : X → UU l) → - ((x : X) → is-contr (A x)) → is-local-dependent-type f A + {l : Level} (A : Y → UU l) → + ((y : Y) → is-contr (A y)) → is-local-dependent-type f A is-local-dependent-type-is-contr A is-contr-A = is-equiv-is-contr ( precomp-Π f A) diff --git a/src/orthogonal-factorization-systems/null-families-of-types.lagda.md b/src/orthogonal-factorization-systems/null-families-of-types.lagda.md new file mode 100644 index 0000000000..9a6dfa29eb --- /dev/null +++ b/src/orthogonal-factorization-systems/null-families-of-types.lagda.md @@ -0,0 +1,123 @@ +# Null families of types + +```agda +module orthogonal-factorization-systems.null-families-of-types where +``` + +
Imports + +```agda +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.precomposition-functions +open import foundation.propositions +open import foundation.retracts-of-types +open import foundation.universe-levels + +open import orthogonal-factorization-systems.null-types +open import orthogonal-factorization-systems.orthogonal-maps +``` + +
+ +## Idea + +A family of types `B : A → UU l` is said to be +{{#concept "null" Disambiguation="family of types" Agda=is-null-family}} at `Y`, +or **`Y`-null**, if every fiber is. I.e., if the +[diagonal map](foundation.diagonal-maps-of-types.md) + +```text + Δ : B x → (Y → B x) +``` + +is an [equivalence](foundation-core.equivalences.md) for every `x` in `A`. + +## Definitions + +### `Y`-null families of types + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} (B : A → UU l3) + where + + is-null-family : UU (l1 ⊔ l2 ⊔ l3) + is-null-family = (x : A) → is-null Y (B x) + + is-property-is-null-family : is-prop is-null-family + is-property-is-null-family = + is-prop-Π (λ x → is-prop-is-null Y (B x)) + + is-null-family-Prop : Prop (l1 ⊔ l2 ⊔ l3) + is-null-family-Prop = (is-null-family , is-property-is-null-family) +``` + +## Properties + +### Closure under equivalences + +If `C` is `Y`-null and we have equivalences `X ≃ Y` and `(x : A) → B x ≃ C x`, +then `B` is `X`-null. + +```agda +module _ + {l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} {B : A → UU l4} + where + + is-null-family-equiv : + {l5 : Level} {C : A → UU l5} → + X ≃ Y → ((x : A) → B x ≃ C x) → + is-null-family Y C → is-null-family X B + is-null-family-equiv e f H x = is-null-equiv e (f x) (H x) + + is-null-family-equiv-exponent : + (e : X ≃ Y) → is-null-family Y B → is-null-family X B + is-null-family-equiv-exponent e H x = is-null-equiv-exponent e (H x) + +module _ + {l1 l2 l3 l4 : Level} {Y : UU l1} {A : UU l2} {B : A → UU l3} {C : A → UU l4} + where + + is-null-family-equiv-family : + ((x : A) → B x ≃ C x) → is-null-family Y C → is-null-family Y B + is-null-family-equiv-family f H x = is-null-equiv-base (f x) (H x) +``` + +### Closure under retracts + +If `C` is `Y`-null and `X` is a retract of `Y` and `B x` is a retract of `C x` +for all `x`, then `B` is `X`-null. + +```agda +module _ + {l1 l2 l3 l4 l5 : Level} + {X : UU l1} {Y : UU l2} {A : UU l3} {B : A → UU l4} {C : A → UU l5} + where + + is-null-family-retract : + X retract-of Y → ((x : A) → (B x) retract-of (C x)) → + is-null-family Y C → is-null-family X B + is-null-family-retract e f H x = is-null-retract e (f x) (H x) + +module _ + {l1 l2 l3 l4 : Level} {Y : UU l1} {A : UU l2} {B : A → UU l3} {C : A → UU l4} + where + + is-null-family-retract-family : + ((x : A) → (B x) retract-of (C x)) → is-null-family Y C → is-null-family Y B + is-null-family-retract-family f H x = is-null-retract-base (f x) (H x) + +module _ + {l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} {B : A → UU l4} + where + + is-null-family-retract-exponent : + X retract-of Y → is-null-family Y B → is-null-family X B + is-null-family-retract-exponent e H x = is-null-retract-exponent e (H x) +``` + +## See also + +- In [`null-maps`](orthogonal-factorization-systems.null-maps.md) we show that a + type family is `Y`-null if and only if its total space projection is. diff --git a/src/orthogonal-factorization-systems/null-maps.lagda.md b/src/orthogonal-factorization-systems/null-maps.lagda.md new file mode 100644 index 0000000000..2863c0ff12 --- /dev/null +++ b/src/orthogonal-factorization-systems/null-maps.lagda.md @@ -0,0 +1,280 @@ +# Null maps + +```agda +module orthogonal-factorization-systems.null-maps where +``` + +
Imports + +```agda +open import foundation.cones-over-cospan-diagrams +open import foundation.dependent-pair-types +open import foundation.diagonal-maps-of-types +open import foundation.equivalences +open import foundation.equivalences-arrows +open import foundation.families-of-equivalences +open import foundation.fibers-of-maps +open import foundation.function-types +open import foundation.functoriality-fibers-of-maps +open import foundation.homotopies +open import foundation.identity-types +open import foundation.logical-equivalences +open import foundation.morphisms-arrows +open import foundation.postcomposition-functions +open import foundation.precomposition-functions +open import foundation.propositions +open import foundation.pullbacks +open import foundation.type-arithmetic-unit-type +open import foundation.type-theoretic-principle-of-choice +open import foundation.unit-type +open import foundation.universal-property-family-of-fibers-of-maps +open import foundation.universe-levels + +open import orthogonal-factorization-systems.local-maps +open import orthogonal-factorization-systems.local-types +open import orthogonal-factorization-systems.null-families-of-types +open import orthogonal-factorization-systems.null-types +open import orthogonal-factorization-systems.orthogonal-maps +``` + +
+ +## Idea + +A map `f : A → B` is said to be +{{#concept "null" Disambiguation="function at a type" Agda=is-null-map}} at `Y`, +or {{#concept "`Y`-null" Disambiguation="function at a type" Agda=is-null-map}} +if its [fibers](foundation-core.fibers-of-maps.md) are +`Y`-[null](orthogonal-factorization-systems.null-types.md), or equivalently, if +the square + +```text + Δ + A ------> (Y → A) + | | + f | | f ∘ - + ∨ ∨ + B ------> (Y → B) + Δ +``` + +is a [pullback](foundation-core.pullbacks.md). + +## Definitions + +### The fiber condition for `Y`-null maps + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} {B : UU l3} (f : A → B) + where + + is-null-map : UU (l1 ⊔ l2 ⊔ l3) + is-null-map = is-null-family Y (fiber f) + + is-property-is-null-map : is-prop is-null-map + is-property-is-null-map = is-property-is-null-family Y (fiber f) + + is-null-map-Prop : Prop (l1 ⊔ l2 ⊔ l3) + is-null-map-Prop = (is-null-map , is-property-is-null-map) +``` + +### The pullback condition for `Y`-null maps + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} {B : UU l3} (f : A → B) + where + + cone-is-null-map-pullback-condition : + cone (diagonal-exponential B Y) (postcomp Y f) A + cone-is-null-map-pullback-condition = + (f , diagonal-exponential A Y , refl-htpy) + + is-null-map-pullback-condition : UU (l1 ⊔ l2 ⊔ l3) + is-null-map-pullback-condition = + is-pullback + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition) + + is-prop-is-null-map-pullback-condition : + is-prop is-null-map-pullback-condition + is-prop-is-null-map-pullback-condition = + is-prop-is-pullback + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition) +``` + +## Properties + +### A type family is `Y`-null if and only if its total space projection is + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} (B : A → UU l3) + where + + is-null-family-is-null-map-pr1 : + is-null-map Y (pr1 {B = B}) → is-null-family Y B + is-null-family-is-null-map-pr1 = + is-null-family-equiv-family (inv-equiv-fiber-pr1 B) + + is-null-map-pr1-is-null-family : + is-null-family Y B → is-null-map Y (pr1 {B = B}) + is-null-map-pr1-is-null-family = + is-null-family-equiv-family (equiv-fiber-pr1 B) +``` + +### The pullback and fiber condition for `Y`-null maps are equivalent + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} {B : UU l3} (f : A → B) + where + + abstract + compute-map-fiber-vertical-map-cone-is-null-map-pullback-condition : + (b : B) → + equiv-arrow + ( map-fiber-vertical-map-cone + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition Y f) + ( b)) + ( diagonal-exponential (fiber f b) Y) + compute-map-fiber-vertical-map-cone-is-null-map-pullback-condition b = + ( id-equiv , + inv-compute-Π-fiber-postcomp Y f (diagonal-exponential B Y b) , + ( λ where (x , refl) → refl)) + + is-null-map-pullback-condition-is-null-map : + is-null-map Y f → is-null-map-pullback-condition Y f + is-null-map-pullback-condition-is-null-map H = + is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition Y f) + ( λ b → + is-equiv-source-is-equiv-target-equiv-arrow + ( map-fiber-vertical-map-cone + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition Y f) + ( b)) + ( diagonal-exponential (fiber f b) Y) + ( compute-map-fiber-vertical-map-cone-is-null-map-pullback-condition + ( b)) + ( H b)) + + is-null-map-is-null-map-pullback-condition : + is-null-map-pullback-condition Y f → is-null-map Y f + is-null-map-is-null-map-pullback-condition H b = + is-equiv-target-is-equiv-source-equiv-arrow + ( map-fiber-vertical-map-cone + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition Y f) + ( b)) + ( diagonal-exponential (fiber f b) Y) + ( compute-map-fiber-vertical-map-cone-is-null-map-pullback-condition b) + ( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback + ( diagonal-exponential B Y) + ( postcomp Y f) + ( cone-is-null-map-pullback-condition Y f) + ( H) + ( b)) +``` + +### A map is `Y`-null if and only if it is local at the terminal projection `Y → unit` + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} {B : UU l3} (f : A → B) + where + + is-local-terminal-map-is-null-map : + is-null-map Y f → is-local-map (terminal-map Y) f + is-local-terminal-map-is-null-map H x = + is-local-terminal-map-is-null Y (fiber f x) (H x) + + is-null-map-is-local-terminal-map : + is-local-map (terminal-map Y) f → is-null-map Y f + is-null-map-is-local-terminal-map H x = + is-null-is-local-terminal-map Y (fiber f x) (H x) + + equiv-is-local-terminal-map-is-null-map : + is-null-map Y f ≃ is-local-map (terminal-map Y) f + equiv-is-local-terminal-map-is-null-map = + equiv-iff-is-prop + ( is-property-is-null-map Y f) + ( is-property-is-local-map (terminal-map Y) f) + ( is-local-terminal-map-is-null-map) + ( is-null-map-is-local-terminal-map) + + equiv-is-null-map-is-local-terminal-map : + is-local-map (terminal-map Y) f ≃ is-null-map Y f + equiv-is-null-map-is-local-terminal-map = + inv-equiv equiv-is-local-terminal-map-is-null-map +``` + +### A map is `Y`-null if and only if the terminal projection of `Y` is orthogonal to `f` + +```agda +module _ + {l1 l2 l3 : Level} (Y : UU l1) {A : UU l2} {B : UU l3} (f : A → B) + where + + is-null-map-is-orthogonal-fiber-condition-terminal-map : + is-orthogonal-fiber-condition-right-map (terminal-map Y) f → + is-null-map Y f + is-null-map-is-orthogonal-fiber-condition-terminal-map H b = + is-equiv-target-is-equiv-source-equiv-arrow + ( precomp (terminal-map Y) (fiber f b)) + ( diagonal-exponential (fiber f b) Y) + ( left-unit-law-function-type (fiber f b) , id-equiv , refl-htpy) + ( H (point b)) + + is-orthogonal-fiber-condition-terminal-map-is-null-map : + is-null-map Y f → + is-orthogonal-fiber-condition-right-map (terminal-map Y) f + is-orthogonal-fiber-condition-terminal-map-is-null-map H b = + is-equiv-source-is-equiv-target-equiv-arrow + ( precomp (terminal-map Y) (fiber f (b star))) + ( diagonal-exponential (fiber f (b star)) Y) + ( left-unit-law-function-type (fiber f (b star)) , id-equiv , refl-htpy) + ( H (b star)) + + is-null-map-is-orthogonal-pullback-condition-terminal-map : + is-orthogonal-pullback-condition (terminal-map Y) f → is-null-map Y f + is-null-map-is-orthogonal-pullback-condition-terminal-map H = + is-null-map-is-orthogonal-fiber-condition-terminal-map + ( is-orthogonal-fiber-condition-right-map-is-orthogonal-pullback-condition + ( terminal-map Y) + ( f) + ( H)) + + is-orthogonal-pullback-condition-terminal-map-is-null-map : + is-null-map Y f → is-orthogonal-pullback-condition (terminal-map Y) f + is-orthogonal-pullback-condition-terminal-map-is-null-map H = + is-orthogonal-pullback-condition-is-orthogonal-fiber-condition-right-map + ( terminal-map Y) + ( f) + ( is-orthogonal-fiber-condition-terminal-map-is-null-map H) + + is-null-map-is-orthogonal-terminal-map : + is-orthogonal (terminal-map Y) f → is-null-map Y f + is-null-map-is-orthogonal-terminal-map H = + is-null-map-is-orthogonal-fiber-condition-terminal-map + ( is-orthogonal-fiber-condition-right-map-is-orthogonal + ( terminal-map Y) + ( f) + ( H)) + + is-orthogonal-terminal-map-is-null-map : + is-null-map Y f → is-orthogonal (terminal-map Y) f + is-orthogonal-terminal-map-is-null-map H = + is-orthogonal-is-orthogonal-fiber-condition-right-map (terminal-map Y) f + ( is-orthogonal-fiber-condition-terminal-map-is-null-map H) +``` diff --git a/src/orthogonal-factorization-systems/null-types.lagda.md b/src/orthogonal-factorization-systems/null-types.lagda.md index 23642b80f1..6e50e36ba6 100644 --- a/src/orthogonal-factorization-systems/null-types.lagda.md +++ b/src/orthogonal-factorization-systems/null-types.lagda.md @@ -7,36 +7,53 @@ module orthogonal-factorization-systems.null-types where
Imports ```agda -open import foundation.constant-maps open import foundation.dependent-pair-types open import foundation.diagonal-maps-of-types open import foundation.equivalences +open import foundation.equivalences-arrows open import foundation.fibers-of-maps +open import foundation.function-extensionality +open import foundation.homotopies +open import foundation.identity-types open import foundation.logical-equivalences +open import foundation.postcomposition-functions +open import foundation.precomposition-dependent-functions open import foundation.precomposition-functions open import foundation.propositions +open import foundation.retracts-of-maps +open import foundation.retracts-of-types open import foundation.type-arithmetic-unit-type open import foundation.unit-type +open import foundation.universal-property-equivalences open import foundation.universal-property-family-of-fibers-of-maps +open import foundation.universal-property-unit-type open import foundation.universe-levels +open import orthogonal-factorization-systems.local-maps open import orthogonal-factorization-systems.local-types +open import orthogonal-factorization-systems.orthogonal-maps ```
## Idea -A type `A` is said to be **null at** `Y`, or **`Y`-null**, if the diagonal map +A type `A` is said to be +{{#concept "null at" Disambiguation="type" Agda=is-null}} `Y`, or +{{#concept "`Y`-null" Disambiguation="type" Agda=is-null}}, if the +[diagonal map](foundation.diagonal-maps-of-types.md) ```text Δ : A → (Y → A) ``` -is an equivalence. The idea is that _`A` observes the type `Y` to be -contractible_. +is an [equivalence](foundation-core.equivalences.md). The idea is that `A` +"observes" the type `Y` to be +[contractible](foundation-core.contractible-types.md). -## Definition +## Definitions + +### The predicate on a type of being `Y`-null ```agda module _ @@ -56,6 +73,78 @@ module _ ## Properties +### Closure under equivalences + +If `B` is `Y`-null and we have equivalences `X ≃ Y` and `A ≃ B`, then `A` is +`X`-null. + +```agda +module _ + {l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} {B : UU l4} + where + + is-null-equiv : (e : X ≃ Y) (f : A ≃ B) → is-null Y B → is-null X A + is-null-equiv e f H = + is-equiv-htpy-equiv + ( equiv-precomp e A ∘e equiv-postcomp Y (inv-equiv f) ∘e (_ , H) ∘e f) + ( λ x → eq-htpy (λ _ → inv (is-retraction-map-inv-equiv f x))) + +module _ + {l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} + where + + is-null-equiv-exponent : (e : X ≃ Y) → is-null Y A → is-null X A + is-null-equiv-exponent e H = + is-equiv-comp + ( precomp (map-equiv e) A) + ( diagonal-exponential A Y) + ( H) + ( is-equiv-precomp-equiv e A) + +module _ + {l1 l2 l3 : Level} {Y : UU l1} {A : UU l2} {B : UU l3} + where + + is-null-equiv-base : (f : A ≃ B) → is-null Y B → is-null Y A + is-null-equiv-base f H = + is-equiv-htpy-equiv + ( equiv-postcomp Y (inv-equiv f) ∘e (_ , H) ∘e f) + ( λ b → eq-htpy (λ _ → inv (is-retraction-map-inv-equiv f b))) +``` + +### Closure under retracts + +If `B` is `Y`-null and `X` is a retract of `Y` and `A` is a retract of `B`, then +`A` is `X`-null. + +```agda +module _ + {l1 l2 l3 l4 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} {B : UU l4} + where + + is-null-retract : + X retract-of Y → A retract-of B → is-null Y B → is-null X A + is-null-retract e f = + is-equiv-retract-map-is-equiv + ( diagonal-exponential A X) + ( diagonal-exponential B Y) + ( retract-map-diagonal-exponential-retract f e) + +module _ + {l1 l2 l3 : Level} {Y : UU l1} {A : UU l2} {B : UU l3} + where + + is-null-retract-base : A retract-of B → is-null Y B → is-null Y A + is-null-retract-base = is-null-retract id-retract + +module _ + {l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} {A : UU l3} + where + + is-null-retract-exponent : X retract-of Y → is-null Y A → is-null X A + is-null-retract-exponent e = is-null-retract e id-retract +``` + ### A type is `Y`-null if and only if it is local at the terminal projection `Y → unit` ```agda @@ -63,30 +152,63 @@ module _ {l1 l2 : Level} (Y : UU l1) (A : UU l2) where - is-local-is-null : is-null Y A → is-local (λ y → star) A - is-local-is-null = + is-local-terminal-map-is-null : is-null Y A → is-local (terminal-map Y) A + is-local-terminal-map-is-null = is-equiv-comp ( diagonal-exponential A Y) ( map-left-unit-law-function-type A) ( is-equiv-map-left-unit-law-function-type A) - is-null-is-local : is-local (λ y → star) A → is-null Y A - is-null-is-local = + is-null-is-local-terminal-map : is-local (terminal-map Y) A → is-null Y A + is-null-is-local-terminal-map = is-equiv-comp - ( precomp (λ y → star) A) + ( precomp (terminal-map Y) A) ( map-inv-left-unit-law-function-type A) ( is-equiv-map-inv-left-unit-law-function-type A) - equiv-is-local-is-null : is-null Y A ≃ is-local (λ y → star) A - equiv-is-local-is-null = + equiv-is-local-terminal-map-is-null : + is-null Y A ≃ is-local (terminal-map Y) A + equiv-is-local-terminal-map-is-null = equiv-iff-is-prop ( is-property-is-equiv (diagonal-exponential A Y)) - ( is-property-is-equiv (precomp (λ y → star) A)) - ( is-local-is-null) - ( is-null-is-local) + ( is-property-is-equiv (precomp (terminal-map Y) A)) + ( is-local-terminal-map-is-null) + ( is-null-is-local-terminal-map) + + equiv-is-null-is-local-terminal-map : + is-local (terminal-map Y) A ≃ is-null Y A + equiv-is-null-is-local-terminal-map = + inv-equiv equiv-is-local-terminal-map-is-null +``` + +### A type is `Y`-null if and only if the terminal projection of `Y` is orthogonal to the terminal projection of `A` + +```agda +module _ + {l1 l2 : Level} {Y : UU l1} {A : UU l2} + where - equiv-is-null-is-local : is-local (λ y → star) A ≃ is-null Y A - equiv-is-null-is-local = inv-equiv equiv-is-local-is-null + is-null-is-orthogonal-terminal-maps : + is-orthogonal (terminal-map Y) (terminal-map A) → is-null Y A + is-null-is-orthogonal-terminal-maps H = + is-null-is-local-terminal-map Y A + ( is-local-is-orthogonal-terminal-map (terminal-map Y) H) + + is-orthogonal-terminal-maps-is-null : + is-null Y A → is-orthogonal (terminal-map Y) (terminal-map A) + is-orthogonal-terminal-maps-is-null H = + is-orthogonal-is-orthogonal-fiber-condition-right-map + ( terminal-map Y) + ( terminal-map A) + ( λ _ → + is-equiv-source-is-equiv-target-equiv-arrow + ( precomp (terminal-map Y) (fiber (terminal-map A) star)) + ( diagonal-exponential A Y) + ( ( equiv-fiber-terminal-map star) ∘e + ( equiv-universal-property-unit (fiber (terminal-map A) star)) , + ( equiv-postcomp Y (equiv-fiber-terminal-map star)) , + ( refl-htpy)) + ( H)) ``` ### A type is `f`-local if it is null at every fiber of `f` diff --git a/src/orthogonal-factorization-systems/orthogonal-maps.lagda.md b/src/orthogonal-factorization-systems/orthogonal-maps.lagda.md index b00240504a..1f47496951 100644 --- a/src/orthogonal-factorization-systems/orthogonal-maps.lagda.md +++ b/src/orthogonal-factorization-systems/orthogonal-maps.lagda.md @@ -19,6 +19,7 @@ open import foundation.dependent-pair-types open import foundation.dependent-products-pullbacks open import foundation.dependent-sums-pullbacks open import foundation.equivalences +open import foundation.equivalences-arrows open import foundation.fibered-maps open import foundation.fibers-of-maps open import foundation.function-extensionality @@ -26,15 +27,18 @@ open import foundation.function-types open import foundation.functoriality-cartesian-product-types open import foundation.functoriality-coproduct-types open import foundation.functoriality-dependent-pair-types +open import foundation.functoriality-fibers-of-maps open import foundation.homotopies open import foundation.morphisms-arrows open import foundation.postcomposition-functions open import foundation.postcomposition-pullbacks +open import foundation.precomposition-dependent-functions open import foundation.precomposition-functions open import foundation.products-pullbacks open import foundation.propositions open import foundation.pullbacks open import foundation.type-arithmetic-dependent-function-types +open import foundation.type-theoretic-principle-of-choice open import foundation.unit-type open import foundation.universal-property-cartesian-product-types open import foundation.universal-property-coproduct-types @@ -64,7 +68,7 @@ The map `f : A → B` is said to be [lifting operation](orthogonal-factorization-systems.lifting-operations.md) between `f` and `g`. -3. The following is a [pullback](foundation.pullbacks.md) square: +3. The following is a [pullback](foundation-core.pullbacks.md) square: ```text - ∘ f @@ -76,7 +80,15 @@ The map `f : A → B` is said to be - ∘ f ``` -4. The [fibers](foundation-core.fibers-of-maps.md) of `g` are +4. The induced dependent precomposition map + + ```text + - ∘ f : ((x : B) → fiber g (h x)) --> ((x : A) → fiber g (h (f x))) + ``` + + is an equivalence for every `h : B → Y`. + +5. The [fibers](foundation-core.fibers-of-maps.md) of `g` are [`f`-local](orthogonal-factorization-systems.local-types.md), i.e., `g` is an [`f`-local map](orthogonal-factorization-systems.local-maps.md). @@ -188,6 +200,38 @@ module _ ( cone-pullback-hom f g) ``` +### The fiber condition for orthogonal maps + +The maps `f` and `g` are orthogonal if and only if the induced family of maps on +fibers + +```text + (- ∘ f) + ((x : B) → fiber g (h x)) --> ((x : A) → fiber g (h (f x))) + | | + | | + ∨ (- ∘ f) ∨ + (B → X) ------> (A → X) + | | + (g ∘ -) | | (g ∘ -) + ∨ (- ∘ f) ∨ + h ∈ (B → Y) ------> (A → Y) +``` + +is an equivalence for every `h : B → Y`. + +```agda +module _ + {l1 l2 l3 l4 : Level} + {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} + (f : A → B) (g : X → Y) + where + + is-orthogonal-fiber-condition-right-map : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) + is-orthogonal-fiber-condition-right-map = + (h : B → Y) → is-equiv (precomp-Π f (fiber g ∘ h)) +``` + ## Properties ### Being orthogonal means that the type of lifting squares is contractible @@ -278,6 +322,68 @@ module _ ( H)) ``` +### Being orthogonal means satisfying the fiber condition for orthogonal maps + +```agda +module _ + {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} + (f : A → B) (g : X → Y) + where + + is-orthogonal-fiber-condition-right-map-is-orthogonal-pullback-condition : + is-orthogonal-pullback-condition f g → + is-orthogonal-fiber-condition-right-map f g + is-orthogonal-fiber-condition-right-map-is-orthogonal-pullback-condition H h = + is-equiv-source-is-equiv-target-equiv-arrow + ( precomp-Π f (fiber g ∘ h)) + ( map-fiber-vertical-map-cone + ( precomp f Y) + ( postcomp A g) + ( cone-pullback-hom f g) + ( h)) + ( compute-map-fiber-vertical-pullback-hom f g h) + ( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback + ( precomp f Y) + ( postcomp A g) + ( cone-pullback-hom f g) + ( H) + ( h)) + + is-orthogonal-fiber-condition-right-map-is-orthogonal : + is-orthogonal f g → + is-orthogonal-fiber-condition-right-map f g + is-orthogonal-fiber-condition-right-map-is-orthogonal H = + is-orthogonal-fiber-condition-right-map-is-orthogonal-pullback-condition + ( is-orthogonal-pullback-condition-is-orthogonal f g H) + + is-orthogonal-pullback-condition-is-orthogonal-fiber-condition-right-map : + is-orthogonal-fiber-condition-right-map f g → + is-orthogonal-pullback-condition f g + is-orthogonal-pullback-condition-is-orthogonal-fiber-condition-right-map H = + is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone + ( precomp f Y) + ( postcomp A g) + ( cone-pullback-hom f g) + ( λ h → + is-equiv-target-is-equiv-source-equiv-arrow + ( precomp-Π f (fiber g ∘ h)) + ( map-fiber-vertical-map-cone + ( precomp f Y) + ( postcomp A g) + ( cone-pullback-hom f g) + ( h)) + ( compute-map-fiber-vertical-pullback-hom f g h) + ( H h)) + + is-orthogonal-is-orthogonal-fiber-condition-right-map : + is-orthogonal-fiber-condition-right-map f g → + is-orthogonal f g + is-orthogonal-is-orthogonal-fiber-condition-right-map H = + is-orthogonal-is-orthogonal-pullback-condition f g + ( is-orthogonal-pullback-condition-is-orthogonal-fiber-condition-right-map + ( H)) +``` + ### Orthogonality is preserved by homotopies ```agda @@ -988,7 +1094,7 @@ module _ ( is-orthogonal-pullback-condition-is-orthogonal f g G)) ``` -### A type is `f`-local if and only if the terminal map is `f`-orthogonal +### A type is `f`-local if and only if its terminal map is `f`-orthogonal **Proof (forward direction):** If the terminal map is right orthogonal to `f`, that means we have a pullback square