# 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))
```