# Local types
```agda
module orthogonal-factorization-systems.local-types where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-maps
open import foundation.contractible-maps
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.dependent-universal-property-equivalences
open import foundation.empty-types
open import foundation.equivalences
open import foundation.families-of-equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.functoriality-dependent-function-types
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.sections
open import foundation.type-arithmetic-dependent-function-types
open import foundation.type-arithmetic-unit-type
open import foundation.unit-type
open import foundation.universal-property-empty-type
open import foundation.universal-property-equivalences
open import foundation.universe-levels
```
</details>
## Idea
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 : ((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 `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} {X : UU l1} {Y : UU l2} (f : X → Y) (A : Y → UU l3)
where
is-local-dependent-type : UU (l1 ⊔ l2 ⊔ l3)
is-local-dependent-type = is-equiv (precomp-Π f A)
is-property-is-local-dependent-type : is-prop is-local-dependent-type
is-property-is-local-dependent-type = is-property-is-equiv (precomp-Π f A)
is-local-dependent-type-Prop : Prop (l1 ⊔ l2 ⊔ l3)
pr1 is-local-dependent-type-Prop = is-local-dependent-type
pr2 is-local-dependent-type-Prop = is-property-is-local-dependent-type
```
### Local types
```agda
module _
{l1 l2 l3 : Level} {X : UU l1} {Y : UU l2} (f : X → Y) (A : UU l3)
where
is-local : UU (l1 ⊔ l2 ⊔ l3)
is-local = is-local-dependent-type f (λ _ → A)
is-property-is-local : is-prop is-local
is-property-is-local = is-property-is-local-dependent-type f (λ _ → A)
is-local-Prop : Prop (l1 ⊔ l2 ⊔ l3)
is-local-Prop = is-local-dependent-type-Prop f (λ _ → A)
```
## Properties
### Locality distributes over Π-types
```agda
module _
{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 → 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 =
is-equiv-map-equiv
( ( equiv-swap-Π) ∘e
( equiv-Π-equiv-family (λ a → precomp-Π f (B a) , (f-loc a))) ∘e
( equiv-swap-Π))
distributive-Π-is-local :
{l3 l4 : Level} {A : UU l3} (B : A → UU l4) →
((a : A) → is-local f (B a)) →
is-local f ((a : A) → B a)
distributive-Π-is-local B =
distributive-Π-is-local-dependent-type (λ a _ → B a)
```
### Local types are closed under equivalences
```agda
module _
{l1 l2 l3 l4 : Level}
{X : UU l1} {Y : UU l2} {A : Y → UU l3} {B : Y → UU l4}
(f : X → Y)
where
is-local-dependent-type-fam-equiv :
fam-equiv A B → is-local-dependent-type f B → is-local-dependent-type f A
is-local-dependent-type-fam-equiv e is-local-B =
is-equiv-htpy-equiv
( ( equiv-Π-equiv-family (inv-equiv ∘ e ∘ f)) ∘e
( precomp-Π f B , is-local-B) ∘e
( equiv-Π-equiv-family e))
( λ g →
eq-htpy (λ y → inv (is-retraction-map-inv-equiv (e (f y)) (g (f y)))))
is-local-dependent-type-inv-fam-equiv :
fam-equiv B A → is-local-dependent-type f B → is-local-dependent-type f A
is-local-dependent-type-inv-fam-equiv e =
is-local-dependent-type-fam-equiv (inv-equiv ∘ e)
module _
{l1 l2 l3 l4 : Level}
{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
is-local-equiv e = is-local-dependent-type-fam-equiv f (λ _ → e)
is-local-inv-equiv : B ≃ A → is-local f B → is-local f A
is-local-inv-equiv e = is-local-dependent-type-inv-fam-equiv f (λ _ → e)
```
### Locality is preserved by homotopies
```agda
module _
{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
is-local-htpy H = is-equiv-htpy (precomp f' A) (htpy-precomp H A)
is-local-htpy' : (H : f ~ f') → is-local f A → is-local f' A
is-local-htpy' H = is-equiv-htpy' (precomp f A) (htpy-precomp H A)
```
### If `S` is `f`-local then `S` is local at every retract of `f`
```agda
module _
{l1 l2 l3 l4 l5 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (R : f retract-of-map g) (S : UU l5)
where
is-local-retract-map-is-local : is-local g S → is-local f S
is-local-retract-map-is-local =
is-equiv-retract-map-is-equiv
( precomp f S)
( precomp g S)
( retract-map-precomp-retract-map f g R S)
```
In fact, the higher coherence of the retract is not needed:
```agda
module _
{l1 l2 l3 l4 l5 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (R₀ : A retract-of X) (R₁ : B retract-of Y)
(i : coherence-square-maps' (inclusion-retract R₀) f g (inclusion-retract R₁))
(r :
coherence-square-maps'
( map-retraction-retract R₀)
( g)
( f)
( map-retraction-retract R₁))
(S : UU l5)
where
is-local-retract-map-is-local' : is-local g S → is-local f S
is-local-retract-map-is-local' =
is-equiv-retract-map-is-equiv'
( precomp f S)
( precomp g S)
( retract-precomp R₁ S)
( retract-precomp R₀ S)
( precomp-coherence-square-maps
( g)
( map-retraction-retract R₀)
( map-retraction-retract R₁)
( f)
( r)
( S))
( precomp-coherence-square-maps
( f)
( inclusion-retract R₀)
( inclusion-retract R₁)
( g)
( i)
( S))
```
### If every type is `f`-local, then `f` is an equivalence
```agda
module _
{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
is-equiv-is-local = is-equiv-is-equiv-precomp f
```
### If the domain and codomain of `f` is `f`-local, then `f` is an equivalence
```agda
module _
{l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y)
where
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-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-Y f)))
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 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} {X : UU l1} {Y : UU l2} (f : X → Y)
where
is-local-dependent-type-is-prop :
{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
( is-prop-Π is-prop-A)
( is-prop-Π (is-prop-A ∘ f))
is-local-is-prop :
{l : Level} (A : UU l) →
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)
```
### All type families are local at equivalences
```agda
module _
{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 : 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
is-local-is-equiv :
is-equiv f → {l : Level} (A : UU l) → is-local f A
is-local-is-equiv is-equiv-f = is-equiv-precomp-is-equiv f is-equiv-f
```
### Contractible types are local at any map
```agda
module _
{l1 l2 : Level} {X : UU l1} {Y : UU l2} (f : X → Y)
where
is-local-dependent-type-is-contr :
{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)
( is-contr-Π is-contr-A)
( is-contr-Π (is-contr-A ∘ f))
is-local-is-contr :
{l : Level} (A : UU l) → is-contr A → is-local f A
is-local-is-contr A is-contr-A =
is-local-dependent-type-is-contr (λ _ → A) (λ _ → is-contr-A)
```
### A type that is local at the unique map `empty → unit` is contractible
```agda
is-contr-is-local :
{l : Level} (A : UU l) → is-local (λ (_ : empty) → star) A → is-contr A
is-contr-is-local A is-local-A =
is-contr-is-equiv
( empty → A)
( λ a _ → a)
( is-equiv-comp
( λ a' _ → a' star)
( λ a _ →
map-inv-is-equiv (is-equiv-map-left-unit-law-Π (λ _ → A)) a star)
( is-equiv-map-inv-is-equiv (is-equiv-map-left-unit-law-Π (λ _ → A)))
( is-local-A))
( universal-property-empty' A)
```
## See also
- [Local maps](orthogonal-factorization-systems.local-maps.md)
- [Localizations with respect to maps](orthogonal-factorization-systems.localizations-maps.md)
- [Localizations with respect to subuniverses](orthogonal-factorization-systems.localizations-subuniverses.md)