Martin Escardo. 19th December 2020, June 2023.

General properties of W-types.

Notice that we don't assume any axioms from univalent foundations
other than function extensionality, but that we formulate and prove
properties in univalent style.

\begin{code}

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

open import MLTT.Spartan

module W.Properties (X : 𝓤 ̇ ) (A : X → 𝓥 ̇ ) where

open import UF.Base
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Retracts
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import W.Type

private
 𝕎 = W X A

\end{code}

We first show that the identity type of 𝕎 is equivalent to _＝ʷ_
defined as follows.

\begin{code}

_＝ʷ_ : 𝕎 → 𝕎 → 𝓤 ⊔ 𝓥 ̇
ssup x f ＝ʷ ssup x' f' = Σ p ꞉ x ＝ x' , ((a : A x) → f a ＝ʷ f' (transport A p a))

＝ʷ-refl : (w : 𝕎) → w ＝ʷ w
＝ʷ-refl (ssup x f) = refl , (λ a → ＝ʷ-refl (f a))

singleton-typeʷ : 𝕎 → 𝓤 ⊔ 𝓥 ̇
singleton-typeʷ w = Σ t ꞉ 𝕎 , w ＝ʷ t

W-center : (w : 𝕎) → singleton-typeʷ w
W-center w = w , ＝ʷ-refl w

W-centrality : Fun-Ext → (w : 𝕎) (σ : singleton-typeʷ w) → W-center w ＝ σ
W-centrality fe w@(ssup x f) σ@(ssup x g , refl , u) = IV
 where
  have-u : (a : A x) → f a ＝ʷ g a
  have-u = u

  IH : (a : A x) → W-center (f a) ＝ (g a , u a)
  IH a = W-centrality fe (f a) (g a , u a)

  I : (λ a → W-center (f a)) ＝ (λ a → g a , u a)
  I = dfunext fe IH

  π : (Σ h ꞉ (A x → 𝕎) , ((a : A x) → f a ＝ʷ h a))
    → singleton-typeʷ (ssup x f)
  π (h , v) = ssup x h , refl , v

  II : (f , λ a → ＝ʷ-refl (f a)) ＝[ domain π ] (g , u)
  II = ap ΠΣ-distr I

  III : (ssup x f , refl , (λ a → ＝ʷ-refl (f a))) ＝ (ssup x g , refl , u)
  III = ap π II

  IV = W-center w                               ＝⟨ refl ⟩
       ssup x f , refl , (λ a → ＝ʷ-refl (f a)) ＝⟨ III ⟩
       ssup x g , refl , u                      ＝⟨ refl ⟩
       σ                                        ∎

singleton-typesʷ-are-singletons : Fun-Ext
                                → (w : 𝕎) → is-singleton (singleton-typeʷ w)
singleton-typesʷ-are-singletons fe w = W-center w , W-centrality fe w

\end{code}

From this it follows that the canonical map from the native notion of
𝕎-identity to the alternative notion of 𝕎-identity defined above is an
equivalence:

\begin{code}

idtoidʷ : (w t : 𝕎) → w ＝ t → w ＝ʷ t
idtoidʷ w w refl = ＝ʷ-refl w

idtoidʷ-is-equiv : Fun-Ext → (w t : 𝕎) → is-equiv (idtoidʷ w t)
idtoidʷ-is-equiv fe w = I
 where
  f : singleton-type w → singleton-typeʷ w
  f = NatΣ (idtoidʷ w)

  f-is-equiv : is-equiv f
  f-is-equiv = maps-of-singletons-are-equivs f
                (singleton-types-are-singletons w)
                (singleton-typesʷ-are-singletons fe w)

  I : (t : 𝕎) → is-equiv (idtoidʷ w t)
  I = NatΣ-equiv-gives-fiberwise-equiv (idtoidʷ w) f-is-equiv

idtoidʷ-≃ : Fun-Ext → (w t : 𝕎) → (w ＝ t) ≃ (w ＝ʷ t)
idtoidʷ-≃ fe w t = idtoidʷ w t , idtoidʷ-is-equiv fe w t

\end{code}

We now describe ways to "construct" and "destruct" native 𝕎
identifications, which are mutually inverse and hence induce an
equivalence.

\begin{code}

to-W-＝ : {x  : X} {φ  : A x  → 𝕎}
          {x' : X} {φ' : A x' → 𝕎}
        → (Σ p ꞉ x ＝ x' , (φ ＝ φ' ∘ transport A p))
        → ssup x φ ＝[ 𝕎 ] ssup x' φ'
to-W-＝ {x} {φ} {x} {φ'} (refl , f) = ap (ssup x) f

from-W-＝ : {x  : X} {φ  : A x  → 𝕎}
              {x' : X} {φ' : A x' → 𝕎}
            → ssup x φ ＝[ 𝕎 ] ssup x' φ'
            → (Σ p ꞉ x ＝ x' , (φ ＝ φ' ∘ transport A p))
from-W-＝ refl = refl , refl

to-from-W-＝ : {x  : X} {φ  : A x  → 𝕎}
               {x' : X} {φ' : A x' → 𝕎}
            → (q : ssup x φ ＝[ 𝕎 ] ssup x' φ')
            → to-W-＝ (from-W-＝ q) ＝ q
to-from-W-＝ refl = refl

from-to-W-＝ : {x  : X} {φ  : A x  → 𝕎}
               {x' : X} {φ' : A x' → 𝕎}
            → (σ : Σ p ꞉ x ＝ x' , (φ ＝ φ' ∘ transport A p))
            → from-W-＝ (to-W-＝ {x} {φ} {x'} {φ'} σ) ＝  σ
from-to-W-＝ (refl , refl) = refl

W-＝ : {x  : X} {φ  : A x  → 𝕎}
       {x' : X} {φ' : A x' → 𝕎}
     → (ssup x φ ＝[ 𝕎 ] ssup x' φ')
     ≃ (Σ p ꞉ x ＝ x' , (φ ＝ φ' ∘ transport A p))
W-＝ {x} {φ} {x'} {φ'} = qinveq
                          from-W-＝
                          (to-W-＝ ,
                           to-from-W-＝ ,
                           from-to-W-＝ {x} {φ} {x'} {φ'})
\end{code}

From this we conclude that if X is a proposition or a set, then 𝕎 is a
proposition or a set respectively:

\begin{code}

W-is-prop : funext 𝓥 (𝓤 ⊔ 𝓥)
          → is-prop X
          → is-prop 𝕎
W-is-prop fe X-is-prop (ssup x φ) (ssup x' φ') = γ
 where
  p : x ＝ x'
  p = X-is-prop x x'

  IH : (a : A x) → φ a ＝ φ' (transport A p a)
  IH a = W-is-prop fe X-is-prop (φ a) (φ' (transport A p a))

  γ : ssup x φ ＝ ssup x' φ'
  γ = to-W-＝ (p , dfunext fe IH)

W-is-set : funext 𝓥 (𝓤 ⊔ 𝓥)
         → is-set X
         → is-set 𝕎
W-is-set fe X-is-set {ssup x φ} {ssup x' φ'} = γ
 where
  S = Σ p ꞉ x ＝ x' , (φ ∼ φ' ∘ transport A p)

  IH : (p : x ＝ x') (a : A x) → is-prop (φ a ＝ φ' (transport A p a))
  IH p a = W-is-set fe X-is-set {φ a} {φ' (transport A p a)}

  α : is-prop S
  α = Σ-is-prop X-is-set (λ p → Π-is-prop fe (IH p))

  β : retract (ssup x φ ＝ ssup x' φ') of S
  β = (λ (p , h) → to-W-＝ (p , dfunext fe h)) ,
      (λ p → pr₁ (from-W-＝ p) , happly (pr₂ (from-W-＝ p))) ,
      h
    where
     h : (λ (p : ssup x (λ v → φ v) ＝ ssup x' (λ v → φ' v))
         → to-W-＝ (pr₁ (from-W-＝ p) , dfunext fe (happly (pr₂ (from-W-＝ p)))))
       ∼ id
     h refl =  ap (ssup x) (dfunext fe (happly refl)) ＝⟨ I ⟩
               ap (ssup x) refl                       ＝⟨ refl ⟩
               refl                                   ∎
                where
                 I = ap (ap (ssup x)) (funext-happly fe φ φ refl)

  γ : is-prop (ssup x φ ＝ ssup x' φ')
  γ = retract-of-prop β α

\end{code}

Notice that, in both cases, we didn't need to assume anything about
the family A to deduce the truncation level of the type 𝕎 = W X A.
Only the truncation level of X matters.
