Tom de Jong, 18-24 December 2020

Formalizing a paper proof sketch from 12 November 2020.
Refactored 24 January 2022.

We construct the free join-semilattice on a set X as the Kuratowski finite
subsets of X.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import UF.PropTrunc

module OrderedTypes.FreeJoinSemiLattice
        (pt : propositional-truncations-exist)
       where

open import Fin.ArithmeticViaEquivalence
open import Fin.Kuratowski pt
open import Fin.Type
open import MLTT.Spartan
open import Notation.UnderlyingType
open import OrderedTypes.JoinSemiLattices
open import UF.Base
open import UF.Equiv
open import UF.FunExt
open import UF.Hedberg
open import UF.ImageAndSurjection pt
open import UF.Lower-FunExt
open import UF.Powerset
open import UF.Powerset-Fin pt
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-FunExt

open PropositionalTruncation pt hiding (_∨_)
open binary-unions-of-subsets pt

\end{code}

The proof that the Kuratowski finite subsets of X denoted by π“š X and ordered by
subset inclusion is a join-semilattice (with joins given by unions) is given in
UF.Powerset-Fin.lagda.

So we proceed directly to showing that π“š X is the *free* join-semilattice on a
set X. Concretely, if L is a join-semilattice and f : X β†’ L is any function,
then there is a *unique* mediating map fβ™­ : π“š X β†’ L such that:

(i)  fβ™­ is a join-semilattice homomorphism, i.e.
     - fβ™­ preserves the least element;
     - fβ™­ preserves binary joins.
(ii) the diagram
           f
     X ---------> L
      \          ^
       \        /
      Ξ· \      / βˆƒ! fβ™­
         \    /
          v  /
          π“š X
     commutes.

The map Ξ· : X β†’ π“š X is given by mapping x to the singleton subset ❴ x ❡.

The idea in defining fβ™­ is to map a Kuratowski finite subset A to the finite
join ∨ⁿ (f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e) in L, where e is some eumeration
(i.e. surjection) e : Fin n β†  𝕋 ⟨ A ⟩.

However, since Kuratowski finite subsets come with an *unspecified* such
enumeration, we must show that the choice of enumeration is irrelevant, i.e. any
two enumerations give rise to the same finite join. We then use a theorem by
Kraus et al. [1] (see wconstant-map-to-set-factors-through-truncation-of-domain)
to construct the desired mapping.

[1] Theorem 5.4 in
    "Notions of Anonymous Existence in Martin-LΓΆf Type Theory"
    by Nicolai Kraus, MartΓ­n EscardΓ³, Thierry Coquand and Thorsten Altenkirch.
    In Logical Methods in Computer Science, volume 13, issue 1.
    2017.

\begin{code}

module _
        (𝓛 : JoinSemiLattice π“₯ 𝓣)
       where

 open JoinSemiLattice 𝓛

 module _
         {X : 𝓀 Μ‡ }
         (X-is-set : is-set X)
         (f : X β†’ L)
        where

  open singleton-subsets X-is-set
  open singleton-Kuratowski-finite-subsets X-is-set

  Ξ· : X β†’ π“š X
  Ξ· x = ❴ x ❡[π“š]

\end{code}

We start by defining the mapping for a specified enumeration and we show that
the choice of enumeration is irrelevant, i.e. fβ‚› A is weakly constant.

\begin{code}
  fβ‚› : (A : π“Ÿ X)
     β†’ (Ξ£ n κž‰ β„• , Ξ£ e κž‰ (Fin n β†’ 𝕋 A) , is-surjection e)
     β†’ L
  fβ‚› A (_ , e , _) = ∨ⁿ (f ∘ 𝕋-to-carrier A ∘ e)

  fβ‚›-is-wconstant : (A : π“Ÿ X) β†’ wconstant (fβ‚› A)
  fβ‚›-is-wconstant A (n , e , Οƒ) (n' , e' , Οƒ') = βŠ‘-is-antisymmetric _ _ u v
   where
    f' : 𝕋 A β†’ L
    f' = f ∘ 𝕋-to-carrier A
    u : ∨ⁿ (f' ∘ e) βŠ‘ ∨ⁿ (f' ∘ e')
    u = ∨ⁿ-is-lowerbound-of-upperbounds (f' ∘ e) (∨ⁿ (f' ∘ e')) ψ
     where
      ψ : (k : Fin n) β†’ (f' ∘ e) k βŠ‘ ∨ⁿ (f' ∘ e')
      ψ k = βˆ₯βˆ₯-rec (βŠ‘-is-prop-valued _ _) Ο• (Οƒ' (e k))
       where
        Ο• : (Ξ£ k' κž‰ Fin n' , e' k' = e k) β†’ (f' ∘ e) k βŠ‘ ∨ⁿ (f' ∘ e')
        Ο• (k' , p) = (f' ∘ e) k   βŠ‘βŸ¨ =-to-βŠ’ (ap f' p)              ⟩
                     (f' ∘ e') k' βŠ‘βŸ¨ ∨ⁿ-is-upperbound (f' ∘ e') k' ⟩
                     ∨ⁿ (f' ∘ e') βŠ‘βˆŽ
    v : ∨ⁿ (f' ∘ e') βŠ‘ ∨ⁿ (f' ∘ e)
    v = ∨ⁿ-is-lowerbound-of-upperbounds (f' ∘ e') (∨ⁿ (f' ∘ e)) ψ
     where
      ψ : (k' : Fin n') β†’ (f' ∘ e') k' βŠ‘ ∨ⁿ (f' ∘ e)
      ψ k' = βˆ₯βˆ₯-rec (βŠ‘-is-prop-valued _ _) Ο• (Οƒ (e' k'))
       where
        Ο• : (Ξ£ k κž‰ Fin n , e k = e' k') β†’ (f' ∘ e') k' βŠ‘ ∨ⁿ (f' ∘ e)
        Ο• (k , p) = (f' ∘ e') k' βŠ‘βŸ¨ =-to-βŠ’ (ap f' p)            ⟩
                    (f' ∘ e) k   βŠ‘βŸ¨ ∨ⁿ-is-upperbound (f' ∘ e) k ⟩
                    ∨ⁿ (f' ∘ e)  βŠ‘βˆŽ

\end{code}

We now use the theorem by Kraus et al. to construct the map fβ™­ from fβ‚›.

\begin{code}

  fβ™­ : π“š X β†’ L
  fβ™­ (A , ΞΊ) =
   pr₁ (wconstant-map-to-set-factors-through-truncation-of-domain L-is-set
    (fβ‚› A) (fβ‚›-is-wconstant A)) ΞΊ

  fβ™­-in-terms-of-fβ‚› : (A : π“Ÿ X) {n : β„•} {e : (Fin n β†’ 𝕋 A)} (Οƒ : is-surjection e)
                      (ΞΊ : is-Kuratowski-finite-subset A)
                    β†’ fβ™­ (A , ΞΊ) = fβ‚› A (n , e , Οƒ)
  fβ™­-in-terms-of-fβ‚› A {n} {e} Οƒ ΞΊ = fβ™­ (A , ΞΊ)             =⟨ I  ⟩
                                    fβ™­ (A , ∣ n , e , Οƒ ∣) =⟨ II ⟩
                                    fβ‚› A (n , e , Οƒ)       ∎
   where
    I  = ap (Ξ» - β†’ fβ™­ (A , -)) (βˆ₯βˆ₯-is-prop ΞΊ ∣ n , e , Οƒ ∣)
    II = (prβ‚‚ (wconstant-map-to-set-factors-through-truncation-of-domain
                L-is-set
                (fβ‚› A) (fβ‚›-is-wconstant A))
          (n , e , Οƒ)) ⁻¹

\end{code}

Recall that we must show that
(i)  fβ™­ is a join-semilattice homomorphism, i.e.
     - fβ™­ preserves the least element;
     - fβ™­ preserves binary joins.
(ii) the diagram
           f
     X ---------> L
      \          ^
       \        /
      Ξ· \      / βˆƒ! fβ™­
         \    /
          v  /
          π“š X
     commutes.

We show (ii) and then (i) now.

\begin{code}

  fβ™­-after-Ξ·-is-f : fβ™­ ∘ Ξ· ∼ f
  fβ™­-after-Ξ·-is-f x = fβ™­ (Ξ· x)             =⟨ I  ⟩
                      fβ‚› ❴ x ❡ (1 , e , Οƒ) =⟨ II ⟩
                      f x                  ∎
   where
    e : Fin 1 β†’ 𝕋 ❴ x ❡
    e 𝟎 = x , refl
    Οƒ : is-surjection e
    Οƒ (x , refl) = ∣ 𝟎 , refl ∣
    I = fβ™­-in-terms-of-fβ‚› ❴ x ❡ Οƒ ⟨ Ξ· x βŸ©β‚‚
    II = βŠ‘-is-antisymmetric _ _
          (∨-is-lowerbound-of-upperbounds _ _ _
           (βŠ₯-is-least (f x)) (βŠ‘-is-reflexive (f x)))
          (∨-is-upperboundβ‚‚ _ _)

  fβ™­-preserves-βŠ₯ : fβ™­ βˆ…[π“š] = βŠ₯
  fβ™­-preserves-βŠ₯ = βŠ‘-is-antisymmetric _ _ u v
   where
    u : fβ™­ βˆ…[π“š] βŠ‘ βŠ₯
    u = fβ™­ βˆ…[π“š]                     βŠ‘βŸ¨ u₁ ⟩
        ∨ⁿ (f ∘ 𝕋-to-carrier βˆ… ∘ e) βŠ‘βŸ¨ uβ‚‚ ⟩
        βŠ₯                           βŠ‘βˆŽ
     where
      e : Fin 0 β†’ 𝕋 {𝓀} {X} βˆ…
      e = 𝟘-elim
      Οƒ : is-surjection e
      Οƒ (x , x-in-emptyset) = 𝟘-elim x-in-emptyset
      u₁ = =-to-βŠ‘ (fβ™­-in-terms-of-fβ‚› βˆ… Οƒ βˆ…-is-Kuratowski-finite-subset)
      uβ‚‚ = βŠ‘-is-reflexive βŠ₯
    v : βŠ₯ βŠ‘ fβ™­ βˆ…[π“š]
    v = βŠ₯-is-least (fβ™­ βˆ…[π“š])

  fβ™­-is-monotone : (A B : π“š X)
                β†’ ((x : X) β†’ x ∈ ⟨ A ⟩ β†’ x ∈ ⟨ B ⟩)
                β†’ fβ™­ A βŠ‘ fβ™­ B
  fβ™­-is-monotone 𝔸@(A , κ₁) 𝔹@(B , ΞΊβ‚‚) s =
   βˆ₯βˆ₯-recβ‚‚ (βŠ‘-is-prop-valued (fβ™­ 𝔸) (fβ™­ 𝔹)) Ξ³ κ₁ ΞΊβ‚‚
    where
     Ξ³ : (Ξ£ n κž‰ β„• , Fin n β†  𝕋 A)
       β†’ (Ξ£ m κž‰ β„• , Fin m β†  𝕋 B)
       β†’ fβ™­ (A , κ₁) βŠ‘ fβ™­ (B , ΞΊβ‚‚)
     Ξ³ (n , e , e-surj) (n' , e' , e'-surj) =
      fβ™­ 𝔸                         βŠ‘βŸ¨ u₁ ⟩
      ∨ⁿ (f ∘ 𝕋-to-carrier A ∘ e)  βŠ‘βŸ¨ uβ‚‚ ⟩
      ∨ⁿ (f ∘ 𝕋-to-carrier B ∘ e') βŠ‘βŸ¨ u₃ ⟩
      fβ™­ 𝔹                         βŠ‘βˆŽ
       where
        u₁ = =-to-βŠ‘ (fβ™­-in-terms-of-fβ‚› A e-surj κ₁)
        u₃ = =-to-βŠ’ (fβ™­-in-terms-of-fβ‚› B e'-surj ΞΊβ‚‚)
        uβ‚‚ = ∨ⁿ-is-lowerbound-of-upperbounds (f ∘ 𝕋-to-carrier A ∘ e)
                                             (∨ⁿ (f ∘ 𝕋-to-carrier B ∘ e')) γ₁
         where
          γ₁ : (k : Fin n) β†’ (f ∘ 𝕋-to-carrier A ∘ e) k
                           βŠ‘ ∨ⁿ (f ∘ 𝕋-to-carrier B ∘ e')
          γ₁ k = βˆ₯βˆ₯-rec (βŠ‘-is-prop-valued _ _) Ξ³β‚‚ t
           where
            x : X
            x = 𝕋-to-carrier A (e k)
            a : x ∈ A
            a = 𝕋-to-membership A (e k)
            b : x ∈ B
            b = s x a
            t : βˆƒ k' κž‰ Fin n' , e' k' = (x , b)
            t = e'-surj (x , b)
            Ξ³β‚‚ : (Ξ£ k' κž‰ Fin n' , e' k' = (x , b))
               β†’ (f ∘ pr₁ ∘ e) k βŠ‘ ∨ⁿ (f ∘ pr₁ ∘ e')
            Ξ³β‚‚ (k' , p) = (f ∘ 𝕋-to-carrier A) (e k)   βŠ‘βŸ¨ v₁ ⟩
                          (f ∘ 𝕋-to-carrier B) (e' k') βŠ‘βŸ¨ vβ‚‚ ⟩
                          ∨ⁿ (f ∘ 𝕋-to-carrier B ∘ e') βŠ‘βˆŽ
             where
              v₁ = =-to-βŠ‘ (ap f q)
               where
                q : 𝕋-to-carrier A (e k) = 𝕋-to-carrier B (e' k')
                q = ap pr₁ (p ⁻¹)
              vβ‚‚ = ∨ⁿ-is-upperbound (f ∘ 𝕋-to-carrier B ∘ e') k'

  fβ™­-preserves-∨ : (A B : π“š X) β†’ fβ™­ (A βˆͺ[π“š] B) = fβ™­ A ∨ fβ™­ B
  fβ™­-preserves-∨ A B = βŠ‘-is-antisymmetric _ _ u v
   where
    v : (fβ™­ A ∨ fβ™­ B) βŠ‘ fβ™­ (A βˆͺ[π“š] B)
    v = ∨-is-lowerbound-of-upperbounds _ _ _
        (fβ™­-is-monotone A (A βˆͺ[π“š] B) (βˆͺ[π“š]-is-upperbound₁ A B))
        (fβ™­-is-monotone B (A βˆͺ[π“š] B) (βˆͺ[π“š]-is-upperboundβ‚‚ A B))
    u : fβ™­ (A βˆͺ[π“š] B) βŠ‘ (fβ™­ A ∨ fβ™­ B)
    u = βˆ₯βˆ₯-rec (βŠ‘-is-prop-valued (fβ™­ (A βˆͺ[π“š] B)) (fβ™­ A ∨ fβ™­ B)) γ₁ (⟨ A βŸ©β‚‚)
     where
      γ₁ : (Ξ£ n κž‰ β„• , Ξ£ e κž‰ (Fin n β†’ 𝕋 ⟨ A ⟩) , is-surjection e)
         β†’ fβ™­ (A βˆͺ[π“š] B) βŠ‘ (fβ™­ A ∨ fβ™­ B)
      γ₁ (n , e , Οƒ) = βˆ₯βˆ₯-rec (βŠ‘-is-prop-valued _ _) Ξ³β‚‚ (⟨ B βŸ©β‚‚)
       where
        Ξ³β‚‚ : (Ξ£ n' κž‰ β„• , Ξ£ e' κž‰ (Fin n' β†’ 𝕋 ⟨ B ⟩) , is-surjection e')
           β†’ fβ™­ (A βˆͺ[π“š] B) βŠ‘ (fβ™­ A ∨ fβ™­ B)
        Ξ³β‚‚ (n' , e' , Οƒ') = fβ™­ (A βˆͺ[π“š] B)    βŠ‘βŸ¨ l₁ ⟩
                            ∨ⁿ (f' ∘ [e,e']) βŠ‘βŸ¨ lβ‚‚ ⟩
                            fβ™­ A ∨ fβ™­ B      βŠ‘βˆŽ
         where
          f' : 𝕋 (⟨ A ⟩ βˆͺ ⟨ B ⟩) β†’ L
          f' = f ∘ 𝕋-to-carrier (⟨ A ⟩ βˆͺ ⟨ B ⟩)
          [e,e'] : Fin (n +' n') β†’ 𝕋 (⟨ A ⟩ βˆͺ ⟨ B ⟩)
          [e,e'] = (βˆͺ-enum ⟨ A ⟩ ⟨ B ⟩ e e')
          Ο„ : is-surjection [e,e']
          Ο„ = βˆͺ-enum-is-surjection ⟨ A ⟩ ⟨ B ⟩ e e' Οƒ Οƒ'
          l₁ = =-to-βŠ‘ p
           where
            p : fβ™­ (A βˆͺ[π“š] B) = fβ‚› (⟨ A ⟩ βˆͺ ⟨ B ⟩) (n +' n' , [e,e'] , Ο„)
            p = fβ™­-in-terms-of-fβ‚› (⟨ A ⟩ βˆͺ ⟨ B ⟩) Ο„ ⟨ A βˆͺ[π“š] B βŸ©β‚‚
          lβ‚‚ = ∨ⁿ-is-lowerbound-of-upperbounds (f' ∘ [e,e']) (fβ™­ A ∨ fβ™­ B) Ο•
           where
            Ο• : (k : Fin (n +' n'))
              β†’ (f' ∘ [e,e']) k βŠ‘ (fβ™­ A ∨ fβ™­ B)
            Ο• k = (f' ∘ [e,e']) k                   βŠ‘βŸ¨ βŠ‘-is-reflexive _ ⟩
                  (f' ∘ βˆͺ-enum' ⟨ A ⟩ ⟨ B ⟩ e e') c βŠ‘βŸ¨ ψ c ⟩
                  (fβ™­ A ∨ fβ™­ B)                     βŠ‘βˆŽ
             where
              c : Fin n + Fin n'
              c = ⌜ Fin+homo n n' ⌝ k
              ψ : (c : Fin n + Fin n')
                β†’ (f' ∘ βˆͺ-enum' ⟨ A ⟩ ⟨ B ⟩ e e') c βŠ‘ (fβ™­ A ∨ fβ™­ B)
              ψ (inl k) = (f' ∘ βˆͺ-enum' ⟨ A ⟩ ⟨ B ⟩ e e') (inl k) βŠ‘βŸ¨ u₁ ⟩
                          (f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e) k          βŠ‘βŸ¨ uβ‚‚ ⟩
                          ∨ⁿ (f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e)         βŠ‘βŸ¨ u₃ ⟩
                          fβ‚› ⟨ A ⟩ (n , e , Οƒ)                    βŠ‘βŸ¨ uβ‚„ ⟩
                          fβ™­ A                                    βŠ‘βŸ¨ uβ‚… ⟩
                          fβ™­ A ∨ fβ™­ B                             βŠ‘βˆŽ
               where
                u₁ = βŠ‘-is-reflexive ((f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e) k)
                uβ‚‚ = ∨ⁿ-is-upperbound (f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e) k
                u₃ = βŠ‘-is-reflexive (∨ⁿ (f ∘ 𝕋-to-carrier ⟨ A ⟩ ∘ e))
                uβ‚„ = =-to-βŠ’ (fβ™­-in-terms-of-fβ‚› ⟨ A ⟩ Οƒ ⟨ A βŸ©β‚‚)
                uβ‚… = ∨-is-upperbound₁ (fβ™­ A) (fβ™­ B)
              ψ (inr k) = (f' ∘ βˆͺ-enum' ⟨ A ⟩ ⟨ B ⟩ e e') (inr k) βŠ‘βŸ¨ u₁' ⟩
                          (f ∘ 𝕋-to-carrier ⟨ B ⟩ ∘ e') k         βŠ‘βŸ¨ uβ‚‚' ⟩
                          ∨ⁿ (f ∘ 𝕋-to-carrier ⟨ B ⟩ ∘ e')        βŠ‘βŸ¨ u₃' ⟩
                          fβ‚› ⟨ B ⟩ (n' , e' , Οƒ')                 βŠ‘βŸ¨ uβ‚„' ⟩
                          fβ™­ B                                    βŠ‘βŸ¨ uβ‚…' ⟩
                          fβ™­ A ∨ fβ™­ B                             βŠ‘βˆŽ
               where
                u₁' = βŠ‘-is-reflexive ((f ∘ 𝕋-to-carrier ⟨ B ⟩ ∘ e') k)
                uβ‚‚' = ∨ⁿ-is-upperbound (f ∘ 𝕋-to-carrier ⟨ B ⟩ ∘ e') k
                u₃' = βŠ‘-is-reflexive (∨ⁿ (f ∘ 𝕋-to-carrier ⟨ B ⟩ ∘ e'))
                uβ‚„' = =-to-βŠ’ (fβ™­-in-terms-of-fβ‚› ⟨ B ⟩ Οƒ' ⟨ B βŸ©β‚‚)
                uβ‚…' = ∨-is-upperboundβ‚‚ (fβ™­ A) (fβ™­ B)

\end{code}

Finally we prove that fβ™­ is the unique map with the above properties (i) & (ii).
We do so by using the induction principle for Kuratowski finite subsets, which
is proved in UF.Powerset-Fin.lagda.

\begin{code}

  module _
          (pe : propext 𝓀)
          (fe : funext 𝓀 (𝓀 ⁺))
         where

   fβ™­-is-unique : (h : π“š X β†’ L)
                β†’ h βˆ…[π“š] = βŠ₯
                β†’ ((A B : π“š X) β†’ h (A βˆͺ[π“š] B) = h A ∨ h B)
                β†’ (h ∘ Ξ· ∼ f)
                β†’ h ∼ fβ™­
   fβ™­-is-unique h p₁ pβ‚‚ p₃ = Kuratowski-finite-subset-induction pe fe
                             X X-is-set
                             (Ξ» A β†’ h A = fβ™­ A)
                             (Ξ» _ β†’ L-is-set)
                             q₁ qβ‚‚ q₃
    where
     q₁ : h βˆ…[π“š] = fβ™­ βˆ…[π“š]
     q₁ = h βˆ…[π“š]  =⟨ p₁                ⟩
          βŠ₯       =⟨ fβ™­-preserves-βŠ₯ ⁻¹ ⟩
          fβ™­ βˆ…[π“š] ∎
     qβ‚‚ : (x : X) β†’ h (Ξ· x) = fβ™­ (Ξ· x)
     qβ‚‚ x = h (Ξ· x)  =⟨ p₃ x                   ⟩
            f x      =⟨ (fβ™­-after-Ξ·-is-f x) ⁻¹ ⟩
            fβ™­ (Ξ· x) ∎
     q₃ : (A B : π“š X)
        β†’ h A = fβ™­ A
        β†’ h B = fβ™­ B
        β†’ h (A βˆͺ[π“š] B) = fβ™­ (A βˆͺ[π“š] B)
     q₃ A B r₁ rβ‚‚ = h (A βˆͺ[π“š] B)  =⟨ pβ‚‚ A B                  ⟩
                    h A ∨ h B     =⟨ apβ‚‚ _∨_ r₁ rβ‚‚           ⟩
                    fβ™­ A ∨ fβ™­ B   =⟨ (fβ™­-preserves-∨ A B) ⁻¹ ⟩
                    fβ™­ (A βˆͺ[π“š] B) ∎

\end{code}

Assuming some more function extensionality axioms, we can prove "homotopy
uniqueness", i.e. the tuple consisting of fβ™­ together with the proofs of (i) and
(ii) is unique. This follows easily from the above, because (i) and (ii) are
subsingletons (as L is a set).

\begin{code}

  module _
          (pe : propext 𝓀)
          (fe : funext (𝓀 ⁺) (𝓀 ⁺ βŠ” π“₯))
         where

   homotopy-uniqueness-of-fβ™­ :
    βˆƒ! h κž‰ (π“š X β†’ L) , (h βˆ…[π“š] = βŠ₯)
                     Γ— ((A B : π“š X) β†’ h (A βˆͺ[π“š] B) = h A ∨ h B)
                     Γ— h ∘ Ξ· ∼ f
   homotopy-uniqueness-of-fβ™­ =
    (fβ™­ , fβ™­-preserves-βŠ₯ , fβ™­-preserves-∨ , fβ™­-after-Ξ·-is-f) , Ξ³
     where
      Ξ³ : (t : (Ξ£ h κž‰ (π“š X β†’ L) , (h βˆ…[π“š] = βŠ₯)
                                Γ— ((A B : π“š X) β†’ h (A βˆͺ[π“š] B) = h A ∨ h B)
                                Γ— h ∘ Ξ· ∼ f))
        β†’ (fβ™­ , fβ™­-preserves-βŠ₯ , fβ™­-preserves-∨ , fβ™­-after-Ξ·-is-f) = t
      Ξ³ (h , p₁ , pβ‚‚ , p₃) = to-subtype-= ψ
                             (dfunext (lower-funext (𝓀 ⁺) (𝓀 ⁺) fe)
                               (Ξ» A β†’ (fβ™­-is-unique
                                         pe
                                         (lower-funext (𝓀 ⁺) π“₯ fe)
                                         h p₁ pβ‚‚ p₃ A) ⁻¹))
       where
        ψ : (k : π“š X β†’ L)
          β†’ is-prop ((k βˆ…[π“š] = βŠ₯)
                    Γ— ((A B : π“š X) β†’ k (A βˆͺ[π“š] B) = (k A ∨ k B))
                    Γ— k ∘ Ξ· ∼ f)
        ψ k = Γ—-is-prop L-is-set (Γ—-is-prop
                                   (Ξ -is-prop fe
                                     (Ξ» _ β†’ Ξ -is-prop (lower-funext (𝓀 ⁺) (𝓀 ⁺) fe)
                                     (Ξ» _ β†’ L-is-set)))
                                   (Ξ -is-prop (lower-funext (𝓀 ⁺) (𝓀 ⁺) fe)
                                     (Ξ» _ β†’ L-is-set)))

\end{code}

Added 17th March 2021 by Martin Escardo. Alternative definition of π“š:

\begin{code}

open import UF.Embeddings

π“š' : 𝓀 Μ‡ β†’ 𝓀 ⁺ Μ‡
π“š' {𝓀} X = Ξ£ A κž‰ 𝓀 Μ‡ , (A β†ͺ X) Γ— is-Kuratowski-finite A

\end{code}

TODO. Show that π“š' X is equivalent to π“š X (using UF.Classifiers).

Tom de Jong, 27 August 2021. We implement this TODO.

\begin{code}

open import UF.Univalence

module _
        {𝓀 : Universe}
        (ua : is-univalent 𝓀)
        (fe : funext 𝓀 (𝓀 ⁺))
       where

 open import UF.Classifiers
 open import UF.EquivalenceExamples

 π“š-is-equivalent-to-π“š' : (X : 𝓀 Μ‡ ) β†’  π“š X ≃ π“š' X
 π“š-is-equivalent-to-π“š' X = Ξ³
  where
   Ο† : Subtype X ≃ π“Ÿ X
   Ο† = Ξ©-is-subtype-classifier ua fe X
   ΞΊ : 𝓀 Μ‡ β†’ 𝓀 Μ‡
   ΞΊ = is-Kuratowski-finite
   Ξ³ = π“š X                                                β‰ƒβŸ¨ ≃-refl _ ⟩
       (Ξ£ A κž‰ π“Ÿ X , ΞΊ (𝕋 A))                              β‰ƒβŸ¨ I        ⟩
       (Ξ£ S κž‰ Subtype X , ΞΊ (𝕋 (⌜ Ο† ⌝ S)))                β‰ƒβŸ¨ Ξ£-assoc  ⟩
       (Ξ£ A κž‰ 𝓀 Μ‡ , Ξ£ e κž‰ (A β†ͺ X) , ΞΊ (𝕋 (⌜ Ο† ⌝ (A , e)))) β‰ƒβŸ¨ II       ⟩
       (Ξ£ A κž‰ 𝓀 Μ‡ , Ξ£ e κž‰ (A β†ͺ X) , ΞΊ A)                   β‰ƒβŸ¨ ≃-refl _ ⟩
       (Ξ£ A κž‰ 𝓀 Μ‡ , (A β†ͺ X) Γ— ΞΊ A)                         β‰ƒβŸ¨ ≃-refl _ ⟩
       π“š' X                                               β– 
    where
     I  = ≃-sym (Ξ£-change-of-variable (Ξ» A β†’ is-Kuratowski-finite-subset A)
                   ⌜ Ο† ⌝ (⌜⌝-is-equiv Ο†))
     II = Ξ£-cong (Ξ» A β†’ Ξ£-cong (Ξ» e β†’ ψ A e))
      where
       ψ : (A : 𝓀 Μ‡ ) (e : A β†ͺ X)
         β†’ ΞΊ (𝕋 (⌜ Ο† ⌝ (A , e))) ≃ ΞΊ A
       ψ A e = idtoeq (κ A') (κ A)
                (ap ΞΊ (eqtoid ua A' A lemma))
        where
         A' : 𝓀 Μ‡
         A' = 𝕋 (⌜ Ο† ⌝ (A , e))
         lemma = A'                                   β‰ƒβŸ¨ ≃-refl _ ⟩
                 (Ξ£ x κž‰ X , Ξ£ a κž‰ A , etofun e a = x) β‰ƒβŸ¨ Ο„        ⟩
                 A                                    β– 
          where
           Ο„ = total-fiber-is-domain (etofun e)

\end{code}

TODO. In Chapter 9 of Johnstone's "Topos Theory" it is shown that X is
Kuratowski finite if and only if π“š X is Kuratowski finite. A proof sketch in
HoTT/UF is as follows.

(1) π“š X is Kuratowski finite implies X is Kuratowski finite

    Suppose that we have a surjection
      e : Fin N β†  π“š X.
    By finite choice, we have for each 0 ≀ i < N, a natural number nα΅’ with a
    surjection
      fα΅’ : Fin nα΅’ β†  𝕋 eα΅’.
    Now consider
      f : (Ξ£ i κž‰ I , Fin nα΅’) β†’ X
          (i , k)            ↦ pr₁ (fα΅’ k)
    This is a surjection, because for x : X, there exists 0 ≀ i < N with
    eα΅’ = [ x ] and hence, f (i , 0) = fα΅’ 0 = x.
    Finally, we observe that
      (Ξ£ i κž‰ I , Fin nα΅’) ≃ Fin (sum_{0 ≀ i < N} nα΅’).

(2) X is Kuratowski finite implies π“š X is Kuratowski finite

    Suppose that we have surjection
      e : Fin n β†  X.
    We construct a surjection
      f : Fin 2ⁿ β†  π“š X
      f (b₁ , ... , bβ‚™) := finite join of eα΅’ for each bit bα΅’ that equals 1.

    To see that this is indeed a surjection, we use the induction principle of
    π“š X:
    - the empty set is mapped to by the sequence of n 0-bits.
    - for a singleton { x }, the element x is hit by eα΅’ for some 0 ≀ i < n, so
      that { x } = f (b₁ , ... , bβ‚™) with bα΅’ = 1 and all other bβ±Ό = 0.
    - given subsets A,B : π“š X that are in the image of f, we obtain
      sequences 𝕓 and 𝕓' such that f 𝕓 = A and f 𝕓' = B so that the union A βˆͺ B
      is obtained as f (𝕓 ∨ 𝕓') where ∨ denotes pointwise disjunction.

    NB: It should be useful to use the formalized fact that Fin 2ⁿ ≃ Fin n β†’ 𝟚.