# Small multisets
```agda
module trees.small-multisets where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.empty-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.propositions
open import foundation.small-types
open import foundation.subtypes
open import foundation.transport-along-identifications
open import foundation.univalence
open import foundation.universe-levels
open import trees.multisets
open import trees.w-types
```
</details>
## Idea
A multiset `X := tree-𝕎 A α` is said to be **small** with respect to a universe
`UU l` if its symbol `A` is a small type with respect to `UU l`, and if each
`α x` is a small multiset with respect to `UU l`.
## Definition
### Small multisets
```agda
is-small-𝕍-Prop : (l : Level) {l1 : Level} → 𝕍 l1 → Prop (l1 ⊔ lsuc l)
is-small-𝕍-Prop l (tree-𝕎 A α) =
product-Prop (is-small-Prop l A) (Π-Prop A (λ x → is-small-𝕍-Prop l (α x)))
is-small-𝕍 : (l : Level) {l1 : Level} → 𝕍 l1 → UU (l1 ⊔ lsuc l)
is-small-𝕍 l X = type-Prop (is-small-𝕍-Prop l X)
is-prop-is-small-𝕍 : {l l1 : Level} (X : 𝕍 l1) → is-prop (is-small-𝕍 l X)
is-prop-is-small-𝕍 {l} X = is-prop-type-Prop (is-small-𝕍-Prop l X)
```
### Resizing small multisets
```agda
resize-𝕍 :
{l1 l2 : Level} (X : 𝕍 l1) → is-small-𝕍 l2 X → 𝕍 l2
resize-𝕍 (tree-𝕎 A α) (pair (pair A' e) H2) =
tree-𝕎 A'
( λ x' → resize-𝕍 (α (map-inv-equiv e x')) (H2 (map-inv-equiv e x')))
```
## Properties
### The comprehension of a small multiset equipped with a small predicate is small
```agda
is-small-comprehension-𝕍 :
(l : Level) {l1 : Level} {X : 𝕍 l1} {P : shape-𝕎 X → UU l1} →
is-small-𝕍 l X → ((x : shape-𝕎 X) → is-small l (P x)) →
is-small-𝕍 l (comprehension-𝕍 X P)
is-small-comprehension-𝕍 l {l1} {tree-𝕎 A α} {P} (pair (pair X e) H) K =
pair
( is-small-Σ (pair X e) K)
( λ t → H (pr1 t))
```
### The identity type between small multisets is small
```agda
is-small-eq-𝕍 :
(l : Level) {l1 : Level} {X Y : 𝕍 l1} →
is-small-𝕍 l X → is-small-𝕍 l Y → is-small l (X = Y)
is-small-eq-𝕍 l
{l1} {tree-𝕎 A α} {tree-𝕎 B β} (pair (pair X e) H) (pair (pair Y f) K) =
is-small-equiv
( Eq-𝕎 (tree-𝕎 A α) (tree-𝕎 B β))
( equiv-Eq-𝕎-eq (tree-𝕎 A α) (tree-𝕎 B β))
( is-small-Σ
( is-small-equiv
( A ≃ B)
( equiv-univalence)
( pair
( X ≃ Y)
( equiv-precomp-equiv (inv-equiv e) Y ∘e equiv-postcomp-equiv f A)))
( σ))
where
σ : (x : A = B) → is-small l ((z : A) → Eq-𝕎 (α z) (β (tr id x z)))
σ refl =
is-small-Π
( pair X e)
( λ x →
is-small-equiv
( α x = β x)
( inv-equiv (equiv-Eq-𝕎-eq (α x) (β x)))
( is-small-eq-𝕍 l (H x) (K x)))
```
### The elementhood relation between small multisets is small
```agda
is-small-∈-𝕍 :
(l : Level) {l1 : Level} {X Y : 𝕍 l1} →
is-small-𝕍 l X → is-small-𝕍 l Y → is-small l (X ∈-𝕍 Y)
is-small-∈-𝕍 l {l1} {tree-𝕎 A α} {tree-𝕎 B β} H (pair (pair Y f) K) =
is-small-Σ
( pair Y f)
( λ b → is-small-eq-𝕍 l (K b) H)
is-small-∉-𝕍 :
(l : Level) {l1 : Level} {X Y : 𝕍 l1} →
is-small-𝕍 l X → is-small-𝕍 l Y → is-small l (X ∉-𝕍 Y)
is-small-∉-𝕍 l {l1} {X} {Y} H K =
is-small-Π
( is-small-∈-𝕍 l {l1} {X} {Y} H K)
( λ x → pair (raise-empty l) (compute-raise-empty l))
```
### The resizing of a small multiset is small
```agda
is-small-resize-𝕍 :
{l1 l2 : Level} (X : 𝕍 l1) (H : is-small-𝕍 l2 X) →
is-small-𝕍 l1 (resize-𝕍 X H)
is-small-resize-𝕍 (tree-𝕎 A α) (pair (pair A' e) H2) =
pair
( pair A (inv-equiv e))
( λ a' →
is-small-resize-𝕍
( α (map-inv-equiv e a'))
( H2 (map-inv-equiv e a')))
```
### The type of `UU l2`-small multisets in `𝕍 l1` is equivalent to the type of `UU l1`-small multisets in `𝕍 l2`
```agda
resize-𝕍' :
{l1 l2 : Level} →
Σ (𝕍 l1) (is-small-𝕍 l2) → Σ (𝕍 l2) (is-small-𝕍 l1)
resize-𝕍' (pair X H) = pair (resize-𝕍 X H) (is-small-resize-𝕍 X H)
abstract
resize-resize-𝕍 :
{l1 l2 : Level} {x : 𝕍 l1} (H : is-small-𝕍 l2 x) →
resize-𝕍 (resize-𝕍 x H) (is-small-resize-𝕍 x H) = x
resize-resize-𝕍 {x = tree-𝕎 A α} (pair (pair A' e) H) =
eq-Eq-𝕎
( resize-𝕍
( resize-𝕍 (tree-𝕎 A α) (pair (pair A' e) H))
( is-small-resize-𝕍 (tree-𝕎 A α) (pair (pair A' e) H)))
( tree-𝕎 A α)
( pair
( refl)
( λ z →
Eq-𝕎-eq
( resize-𝕍
( resize-𝕍
( α (map-inv-equiv e (map-inv-equiv (inv-equiv e) z)))
( H (map-inv-equiv e (map-inv-equiv (inv-equiv e) z))))
( is-small-resize-𝕍
( α (map-inv-equiv e (map-inv-equiv (inv-equiv e) z)))
( H (map-inv-equiv e (map-inv-equiv (inv-equiv e) z)))))
( α z)
( ( ap
( λ t →
resize-𝕍
( resize-𝕍 (α t) (H t))
( is-small-resize-𝕍 (α t) (H t)))
( is-retraction-map-inv-equiv e z)) ∙
( resize-resize-𝕍 (H z)))))
abstract
resize-resize-𝕍' :
{l1 l2 : Level} → (resize-𝕍' {l2} {l1} ∘ resize-𝕍' {l1} {l2}) ~ id
resize-resize-𝕍' {l1} {l2} (pair X H) =
eq-type-subtype
( is-small-𝕍-Prop l2)
( resize-resize-𝕍 H)
is-equiv-resize-𝕍' :
{l1 l2 : Level} → is-equiv (resize-𝕍' {l1} {l2})
is-equiv-resize-𝕍' {l1} {l2} =
is-equiv-is-invertible
( resize-𝕍' {l2} {l1})
( resize-resize-𝕍')
( resize-resize-𝕍')
equiv-resize-𝕍' :
{l1 l2 : Level} → Σ (𝕍 l1) (is-small-𝕍 l2) ≃ Σ (𝕍 l2) (is-small-𝕍 l1)
equiv-resize-𝕍' {l1} {l2} = pair resize-𝕍' is-equiv-resize-𝕍'
```
The resizing operation on small multisets is an embedding
```agda
eq-resize-𝕍 :
{l1 l2 : Level} {x y : 𝕍 l1} (H : is-small-𝕍 l2 x) (K : is-small-𝕍 l2 y) →
(x = y) ≃ (resize-𝕍 x H = resize-𝕍 y K)
eq-resize-𝕍 {l1} {l2} H K =
( extensionality-type-subtype'
( is-small-𝕍-Prop l1)
( resize-𝕍' (pair _ H))
( resize-𝕍' (pair _ K))) ∘e
( ( equiv-ap (equiv-resize-𝕍') (pair _ H) (pair _ K)) ∘e
( inv-equiv
( extensionality-type-subtype'
( is-small-𝕍-Prop l2)
( pair _ H)
( pair _ K))))
```
### The resizing operation on small multisets respects the elementhood relation
```agda
abstract
equiv-elementhood-resize-𝕍 :
{l1 l2 : Level} {x y : 𝕍 l1} (H : is-small-𝕍 l2 x) (K : is-small-𝕍 l2 y) →
(x ∈-𝕍 y) ≃ (resize-𝕍 x H ∈-𝕍 resize-𝕍 y K)
equiv-elementhood-resize-𝕍 {x = X} {tree-𝕎 B β} H (pair (pair B' e) K) =
equiv-Σ
( λ y' →
( component-𝕎 (resize-𝕍 (tree-𝕎 B β) (pair (pair B' e) K)) y') =
( resize-𝕍 X H))
( e)
( λ b →
( equiv-concat
( ap
( λ t → resize-𝕍 (β t) (K t))
( is-retraction-map-inv-equiv e b))
( resize-𝕍 X H)) ∘e
( eq-resize-𝕍 (K b) H))
```
### The type of all multisets of universe level `l1` is `UU l2`-small if each type in `UU l1` is `UU l2`-small
```agda
is-small-multiset-𝕍 :
{l1 l2 : Level} →
((A : UU l1) → is-small l2 A) → (X : 𝕍 l1) → is-small-𝕍 l2 X
is-small-multiset-𝕍 {l1} {l2} H (tree-𝕎 A α) =
pair (H A) (λ x → is-small-multiset-𝕍 H (α x))
```