# Locally small types
```agda
module foundation.locally-small-types where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.inhabited-subtypes
open import foundation.subuniverses
open import foundation.univalence
open import foundation.universe-levels
open import foundation-core.equality-dependent-pair-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.small-types
open import foundation-core.subtypes
open import foundation-core.transport-along-identifications
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Idea
A type is said to be **locally small** with respect to a universe `UU l` if its
[identity types](foundation-core.identity-types.md) are
[small](foundation-core.small-types.md) with respect to that universe.
## Definition
### Locally small types
```agda
is-locally-small :
(l : Level) {l1 : Level} (A : UU l1) → UU (lsuc l ⊔ l1)
is-locally-small l A = (x y : A) → is-small l (x = y)
module _
{l l1 : Level} {A : UU l1} (H : is-locally-small l A) (x y : A)
where
type-is-locally-small : UU l
type-is-locally-small = pr1 (H x y)
equiv-is-locally-small : (x = y) ≃ type-is-locally-small
equiv-is-locally-small = pr2 (H x y)
inv-equiv-is-locally-small : type-is-locally-small ≃ (x = y)
inv-equiv-is-locally-small = inv-equiv equiv-is-locally-small
map-equiv-is-locally-small : (x = y) → type-is-locally-small
map-equiv-is-locally-small = map-equiv equiv-is-locally-small
map-inv-equiv-is-locally-small : type-is-locally-small → (x = y)
map-inv-equiv-is-locally-small = map-inv-equiv equiv-is-locally-small
```
### The subuniverse of `UU l1`-locally small types in `UU l2`
```agda
Locally-Small-Type : (l1 l2 : Level) → UU (lsuc l1 ⊔ lsuc l2)
Locally-Small-Type l1 l2 = Σ (UU l2) (is-locally-small l1)
module _
{l1 l2 : Level} (A : Locally-Small-Type l1 l2)
where
type-Locally-Small-Type : UU l2
type-Locally-Small-Type = pr1 A
is-locally-small-type-Locally-Small-Type :
is-locally-small l1 type-Locally-Small-Type
is-locally-small-type-Locally-Small-Type = pr2 A
small-identity-type-Locally-Small-Type :
(x y : type-Locally-Small-Type) → UU l1
small-identity-type-Locally-Small-Type =
type-is-locally-small is-locally-small-type-Locally-Small-Type
equiv-is-locally-small-type-Locally-Small-Type :
(x y : type-Locally-Small-Type) →
(x = y) ≃ small-identity-type-Locally-Small-Type x y
equiv-is-locally-small-type-Locally-Small-Type =
equiv-is-locally-small is-locally-small-type-Locally-Small-Type
```
## Properties
### Being locally small is a property
```agda
is-prop-is-locally-small :
(l : Level) {l1 : Level} (A : UU l1) → is-prop (is-locally-small l A)
is-prop-is-locally-small l A =
is-prop-Π (λ x → is-prop-Π (λ y → is-prop-is-small l (x = y)))
is-locally-small-Prop :
(l : Level) {l1 : Level} (A : UU l1) → Prop (lsuc l ⊔ l1)
pr1 (is-locally-small-Prop l A) = is-locally-small l A
pr2 (is-locally-small-Prop l A) = is-prop-is-locally-small l A
```
### Any type in `UU l` is `l`-locally small
```agda
is-locally-small' : {l : Level} {A : UU l} → is-locally-small l A
is-locally-small' x y = is-small'
```
### Any small type is locally small
```agda
is-locally-small-is-small :
{l l1 : Level} {A : UU l1} → is-small l A → is-locally-small l A
pr1 (is-locally-small-is-small (X , e) x y) =
map-equiv e x = map-equiv e y
pr2 (is-locally-small-is-small (X , e) x y) = equiv-ap e x y
```
### Any proposition is locally small
```agda
is-locally-small-is-prop :
(l : Level) {l1 : Level} {A : UU l1} → is-prop A → is-locally-small l A
is-locally-small-is-prop l H x y = is-small-is-contr l (H x y)
```
### Any univalent universe is locally small
```agda
is-locally-small-UU :
{l : Level} → is-locally-small l (UU l)
pr1 (is-locally-small-UU X Y) = X ≃ Y
pr2 (is-locally-small-UU X Y) = equiv-univalence
```
### Any Σ-type of locally small types is locally small
```agda
is-locally-small-Σ :
{l1 l2 l3 l4 : Level} {A : UU l1} {B : A → UU l2} →
is-locally-small l3 A → ((x : A) → is-locally-small l4 (B x)) →
is-locally-small (l3 ⊔ l4) (Σ A B)
is-locally-small-Σ {B = B} H K x y =
is-small-equiv
( Eq-Σ x y)
( equiv-pair-eq-Σ x y)
( is-small-Σ
( H (pr1 x) (pr1 y))
( λ p → K (pr1 y) (tr B p (pr2 x)) (pr2 y)))
Σ-Locally-Small-Type :
{l1 l2 l3 l4 : Level} (A : Locally-Small-Type l1 l2) →
(type-Locally-Small-Type A → Locally-Small-Type l3 l4) →
Locally-Small-Type (l1 ⊔ l3) (l2 ⊔ l4)
pr1 (Σ-Locally-Small-Type A B) =
Σ (type-Locally-Small-Type A) (type-Locally-Small-Type ∘ B)
pr2 (Σ-Locally-Small-Type A B) =
is-locally-small-Σ
( is-locally-small-type-Locally-Small-Type A)
( is-locally-small-type-Locally-Small-Type ∘ B)
```
### The underlying type of a subtype of a locally small type is locally small
```agda
is-locally-small-type-subtype :
{l1 l2 l3 : Level} {A : UU l1} (P : subtype l2 A) →
is-locally-small l3 A → is-locally-small l3 (type-subtype P)
is-locally-small-type-subtype {l3 = l3} P H =
is-locally-small-Σ H
( λ a → is-locally-small-is-prop l3 (is-prop-is-in-subtype P a))
type-subtype-Locally-Small-Type :
{l1 l2 l3 : Level} (A : Locally-Small-Type l1 l2) →
subtype l3 (type-Locally-Small-Type A) → Locally-Small-Type l1 (l2 ⊔ l3)
pr1 (type-subtype-Locally-Small-Type A P) = type-subtype P
pr2 (type-subtype-Locally-Small-Type A P) =
is-locally-small-type-subtype P (is-locally-small-type-Locally-Small-Type A)
```
### Any product of locally small types indexed by a small type is small
```agda
is-locally-small-Π :
{l1 l2 l3 l4 : Level} {A : UU l1} {B : A → UU l2} →
is-small l3 A → ((x : A) → is-locally-small l4 (B x)) →
is-locally-small (l3 ⊔ l4) ((x : A) → B x)
is-locally-small-Π H K f g =
is-small-equiv
( f ~ g)
( equiv-funext)
( is-small-Π H (λ x → K x (f x) (g x)))
Π-Locally-Small-Type :
{l1 l2 l3 l4 : Level} (A : Small-Type l1 l2) →
(type-Small-Type A → Locally-Small-Type l3 l4) →
Locally-Small-Type (l1 ⊔ l3) (l2 ⊔ l4)
pr1 (Π-Locally-Small-Type A B) =
(a : type-Small-Type A) → type-Locally-Small-Type (B a)
pr2 (Π-Locally-Small-Type A B) =
is-locally-small-Π
( is-small-type-Small-Type A)
( is-locally-small-type-Locally-Small-Type ∘ B)
```
### The type of types in any given subuniverse is locally small
```agda
is-locally-small-type-subuniverse :
{l1 l2 : Level} (P : subuniverse l1 l2) →
is-locally-small l1 (type-subuniverse P)
is-locally-small-type-subuniverse P =
is-locally-small-type-subtype P is-locally-small-UU
```
### The type of locally small types is locally small
```agda
is-locally-small-Locally-Small-Type :
{l1 l2 : Level} → is-locally-small l2 (Locally-Small-Type l1 l2)
is-locally-small-Locally-Small-Type {l1} =
is-locally-small-type-subuniverse (is-locally-small-Prop l1)
```
### The type of truncated types is locally small
```agda
is-locally-small-Truncated-Type :
{l : Level} (k : 𝕋) → is-locally-small l (Truncated-Type l k)
is-locally-small-Truncated-Type k =
is-locally-small-type-subuniverse (is-trunc-Prop k)
```
### The type of propositions is locally small
```agda
is-locally-small-type-Prop :
{l : Level} → is-locally-small l (Prop l)
is-locally-small-type-Prop = is-locally-small-Truncated-Type neg-one-𝕋
```
### The type of subtypes of a small type is locally small
```agda
is-locally-small-subtype :
{l1 l2 l3 : Level} {A : UU l1} →
is-small l2 A → is-locally-small (l2 ⊔ l3) (subtype l3 A)
is-locally-small-subtype H =
is-locally-small-Π H (λ _ → is-locally-small-type-Prop)
```
### The type of inhabited subtypes of a small type is locally small
```agda
is-locally-small-inhabited-subtype :
{l1 l2 l3 : Level} {A : UU l1} →
is-small l2 A → is-locally-small (l2 ⊔ l3) (inhabited-subtype l3 A)
is-locally-small-inhabited-subtype H =
is-locally-small-type-subtype
( is-inhabited-subtype-Prop)
( is-locally-small-subtype H)
```
## See also
- [The replacement axiom](foundation.replacement.md)
## References
- Theorem 4.6 in {{#cite Rij17}}.
- Section 2.19 in {{#cite SymmetryBook}}.
{{#bibliography}}