Martin Escardo, 23rd Feb 2023

Modified from SIP. We assume pre-univalence, instead of univalence,
after a suggestion by Peter Lumsdaine. This means that the canonical
map from the identity type to the equivalence type is an embedding,
rather than an equivalence.

\begin{code}

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

module UF.PreSIP where

open import MLTT.Spartan
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.PreUnivalence
open import UF.Subsingletons


module presip where

 โŸจ_โŸฉ : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } โ†’ ฮฃ S โ†’ ๐“ค ฬ‡
 โŸจ X , s โŸฉ = X

 structure : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } (A : ฮฃ S) โ†’ S โŸจ A โŸฉ
 structure (X , s) = s

 canonical-map : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ }
                 (ฮน : (A B : ฮฃ S) โ†’ โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ โ†’ ๐“ฆ ฬ‡ )
                 (ฯ : (A : ฮฃ S) โ†’ ฮน A A (โ‰ƒ-refl โŸจ A โŸฉ))
                 {X : ๐“ค ฬ‡ }
                 (s t : S X)
               โ†’ s ๏ผ t โ†’ ฮน (X , s) (X , t) (โ‰ƒ-refl X)
 canonical-map ฮน ฯ {X} s s (refl {s}) = ฯ (X , s)

 SNS : (๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ ) โ†’ (๐“ฆ : Universe) โ†’ ๐“ค โบ โŠ” ๐“ฅ โŠ” (๐“ฆ โบ) ฬ‡
 SNS {๐“ค} {๐“ฅ} S ๐“ฆ = ฮฃ ฮน ๊ž‰ ((A B : ฮฃ S) โ†’ (โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ โ†’ ๐“ฆ ฬ‡ ))
                 , ฮฃ ฯ ๊ž‰ ((A : ฮฃ S) โ†’ ฮน A A (โ‰ƒ-refl โŸจ A โŸฉ))
                 , ({X : ๐“ค ฬ‡ } (s t : S X) โ†’ is-embedding (canonical-map ฮน ฯ s t))

 homomorphic : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } โ†’ SNS S ๐“ฆ
             โ†’ (A B : ฮฃ S) โ†’ โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ โ†’ ๐“ฆ ฬ‡
 homomorphic (ฮน , ฯ , ฮธ) = ฮน

 _โ‰ƒ[_]_ : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } โ†’ ฮฃ S โ†’ SNS S ๐“ฆ โ†’ ฮฃ S โ†’ ๐“ค โŠ” ๐“ฆ ฬ‡
 A โ‰ƒ[ ฯƒ ] B = ฮฃ f ๊ž‰ (โŸจ A โŸฉ โ†’ โŸจ B โŸฉ)
            , ฮฃ i ๊ž‰ is-equiv f
            , homomorphic ฯƒ A B (f , i)

 Idโ†’homEq : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } (ฯƒ : SNS S ๐“ฆ)
          โ†’ (A B : ฮฃ S) โ†’ (A ๏ผ B) โ†’ (A โ‰ƒ[ ฯƒ ] B)
 Idโ†’homEq (_ , ฯ , _) A A (refl {A}) = id , id-is-equiv โŸจ A โŸฉ , ฯ A

 homomorphism-lemma : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } (ฯƒ : SNS S ๐“ฆ)
                      (A B : ฮฃ S) (p : โŸจ A โŸฉ ๏ผ โŸจ B โŸฉ)
                    โ†’
                      (transport S p (structure A) ๏ผ structure B)
                    โ†ช  homomorphic ฯƒ A B (idtoeq โŸจ A โŸฉ โŸจ B โŸฉ p)
 homomorphism-lemma (ฮน , ฯ , ฮธ) (X , s) (X , t) (refl {X}) = ฮณ
  where
   ฮณ : (s ๏ผ t) โ†ช ฮน (X , s) (X , t) (โ‰ƒ-refl X)
   ฮณ = (canonical-map ฮน ฯ s t ,
        ฮธ s t)

 ๏ผ-embedding : is-preunivalent ๐“ค
              โ†’ {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } (ฯƒ : SNS S ๐“ฆ)
                (A B : ฮฃ S)
              โ†’ (A ๏ผ B) โ†ช (A โ‰ƒ[ ฯƒ ] B)
 ๏ผ-embedding pua {S} ฯƒ A B =
    (A ๏ผ B)                                                            โ†ชโŸจ i โŸฉ
    (ฮฃ p ๊ž‰ โŸจ A โŸฉ ๏ผ โŸจ B โŸฉ , transport S p (structure A) ๏ผ structure B) โ†ชโŸจ ii โŸฉ
    (ฮฃ p ๊ž‰ โŸจ A โŸฉ ๏ผ โŸจ B โŸฉ , ฮน A B (idtoeq โŸจ A โŸฉ โŸจ B โŸฉ p))               โ†ชโŸจ iii โŸฉ
    (ฮฃ e ๊ž‰ โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ , ฮน A B e)                                     โ†ชโŸจ iv โŸฉ
    (A โ‰ƒ[ ฯƒ ] B)                                                        โ–ก
  where
   open import UF.PairFun
   ฮน   = homomorphic ฯƒ
   i   = โ‰ƒ-gives-โ†ช ฮฃ-๏ผ-โ‰ƒ
   ii  = Natฮฃ-embedding (homomorphism-lemma ฯƒ A B)
   iii = ฮฃ-change-of-variable-embedding
          (ฮน A B) (idtoeq โŸจ A โŸฉ โŸจ B โŸฉ) (pua โŸจ A โŸฉ โŸจ B โŸฉ)
   iv  = โ‰ƒ-gives-โ†ช ฮฃ-assoc

module presip-with-axioms where

 open presip

 [_] : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } {axioms : (X : ๐“ค ฬ‡ ) โ†’ S X โ†’ ๐“ฆ ฬ‡ }
     โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , ฮฃ s ๊ž‰ S X , axioms X s) โ†’ ฮฃ S
 [ X , s , _ ] = (X , s)

 โŸช_โŸซ : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } {axioms : (X : ๐“ค ฬ‡ ) โ†’ S X โ†’ ๐“ฆ ฬ‡ }
     โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , ฮฃ s ๊ž‰ S X , axioms X s) โ†’ ๐“ค ฬ‡
 โŸช X , _ , _ โŸซ = X

 add-axioms : {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ }
              (axioms : (X : ๐“ค ฬ‡ ) โ†’ S X โ†’ ๐“ฆ ฬ‡ )
            โ†’ ((X : ๐“ค ฬ‡ ) (s : S X) โ†’ is-prop (axioms X s))
            โ†’ SNS S ๐“ฃ
            โ†’ SNS (ฮป X โ†’ ฮฃ s ๊ž‰ S X , axioms X s) ๐“ฃ
 add-axioms {๐“ค} {๐“ฅ} {๐“ฆ} {๐“ฃ} {S} axioms i (ฮน , ฯ , ฮธ) = ฮน' , ฯ' , ฮธ'
  where
   S' : ๐“ค ฬ‡ โ†’ ๐“ฅ โŠ” ๐“ฆ  ฬ‡
   S' X = ฮฃ s ๊ž‰ S X , axioms X s

   ฮน' : (A B : ฮฃ S') โ†’ โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ โ†’ ๐“ฃ ฬ‡
   ฮน' A B = ฮน [ A ] [ B ]

   ฯ' : (A : ฮฃ S') โ†’ ฮน' A A (โ‰ƒ-refl โŸจ A โŸฉ)
   ฯ' A = ฯ [ A ]

   ฮธ' : {X : ๐“ค ฬ‡ } (s' t' : S' X) โ†’ is-embedding (canonical-map ฮน' ฯ' s' t')
   ฮธ' {X} (s , a) (t , b) = ฮณ
    where
     ฯ€ : S' X โ†’ S X
     ฯ€ (s , _) = s

     j : is-embedding ฯ€
     j = prโ‚-is-embedding (i X)

     k : {s' t' : S' X} โ†’ is-embedding (ap ฯ€ {s'} {t'})
     k {s'} {t'} = equivs-are-embeddings (ap ฯ€)
                    (embedding-gives-embedding' ฯ€ j s' t')

     l : canonical-map ฮน' ฯ' (s , a) (t , b)
       โˆผ canonical-map ฮน ฯ s t โˆ˜ ap ฯ€ {s , a} {t , b}

     l (refl {s , a}) = ๐“ป๐“ฎ๐’ป๐“ต (ฯ (X , s))

     e : is-embedding (canonical-map ฮน ฯ s t โˆ˜ ap ฯ€ {s , a} {t , b})
     e = โˆ˜-is-embedding k (ฮธ s t)

     ฮณ : is-embedding (canonical-map ฮน' ฯ' (s , a) (t , b))
     ฮณ = embedding-closed-under-โˆผ _ _ e l

 ๏ผ-embedding-with-axioms : is-preunivalent ๐“ค
                          โ†’ {S : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ }
                            (ฯƒ : SNS S ๐“ฃ)
                            (axioms : (X : ๐“ค ฬ‡ ) โ†’ S X โ†’ ๐“ฆ ฬ‡ )
                          โ†’ ((X : ๐“ค ฬ‡ ) (s : S X) โ†’ is-prop (axioms X s))
                          โ†’ (A B : ฮฃ X ๊ž‰ ๐“ค ฬ‡ , ฮฃ s ๊ž‰ S X , axioms X s)
                          โ†’ (A ๏ผ B) โ†ช ([ A ] โ‰ƒ[ ฯƒ ] [ B ])
 ๏ผ-embedding-with-axioms ua ฯƒ axioms i = ๏ผ-embedding ua (add-axioms axioms i ฯƒ)

{- TODO. Not needed yet. Only the technical lemma needs to be proved to conclude.

module sip-join where

 technical-lemma :

     {X : ๐“ค ฬ‡ } {A : X โ†’ X โ†’ ๐“ฅ ฬ‡ }
     {Y : ๐“ฆ ฬ‡ } {B : Y โ†’ Y โ†’ ๐“ฃ ฬ‡ }
     (f : (xโ‚€ xโ‚ : X) โ†’ xโ‚€ ๏ผ xโ‚ โ†’ A xโ‚€ xโ‚)
     (g : (yโ‚€ yโ‚ : Y) โ†’ yโ‚€ ๏ผ yโ‚ โ†’ B yโ‚€ yโ‚)
   โ†’ ((xโ‚€ xโ‚ : X) โ†’ is-embedding (f xโ‚€ xโ‚))
   โ†’ ((yโ‚€ yโ‚ : Y) โ†’ is-embedding (g yโ‚€ yโ‚))

   โ†’ ((xโ‚€ , yโ‚€) (xโ‚ , yโ‚) : X ร— Y)
   โ†’ is-embedding (ฮป (p : (xโ‚€ , yโ‚€) ๏ผ (xโ‚ , yโ‚))
                        โ†’ f xโ‚€ xโ‚ (ap prโ‚ p) ,
                          g yโ‚€ yโ‚ (ap prโ‚‚ p))

 technical-lemma {๐“ค} {๐“ฅ} {๐“ฆ} {๐“ฃ} {X} {A} {Y} {B} f g i j (xโ‚€ , yโ‚€)  (xโ‚ , yโ‚) = {!!}

 variable
  ๐“ฅโ‚€ ๐“ฅโ‚ ๐“ฆโ‚€ ๐“ฆโ‚ : Universe

 open presip

 โŸช_โŸซ : {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚€ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
     โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X) โ†’ ๐“ค ฬ‡
 โŸช X , sโ‚€ , sโ‚ โŸซ = X

 [_]โ‚€ : {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚€ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
      โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X) โ†’ ฮฃ Sโ‚€
 [ X , sโ‚€ , sโ‚ ]โ‚€ = (X , sโ‚€)

 [_]โ‚ : {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚€ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
      โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X) โ†’ ฮฃ Sโ‚
 [ X , sโ‚€ , sโ‚ ]โ‚ = (X , sโ‚)

 join : {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚€ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
      โ†’ SNS Sโ‚€ ๐“ฆโ‚€
      โ†’ SNS Sโ‚ ๐“ฆโ‚
      โ†’ SNS (ฮป X โ†’ Sโ‚€ X ร— Sโ‚ X) (๐“ฆโ‚€ โŠ” ๐“ฆโ‚)
 join {๐“ค} {๐“ฅโ‚€} {๐“ฅโ‚} {๐“ฆโ‚€} {๐“ฆโ‚} {Sโ‚€} {Sโ‚} (ฮนโ‚€ , ฯโ‚€ , ฮธโ‚€) (ฮนโ‚ , ฯโ‚ , ฮธโ‚) = ฮน , ฯ , ฮธ
  where
   S : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚€ โŠ” ๐“ฅโ‚ ฬ‡
   S X = Sโ‚€ X ร— Sโ‚ X

   ฮน : (A B : ฮฃ S) โ†’ โŸจ A โŸฉ โ‰ƒ โŸจ B โŸฉ โ†’ ๐“ฆโ‚€ โŠ” ๐“ฆโ‚ ฬ‡
   ฮน A B e = ฮนโ‚€ [ A ]โ‚€ [ B ]โ‚€ e  ร—  ฮนโ‚ [ A ]โ‚ [ B ]โ‚ e

   ฯ : (A : ฮฃ S) โ†’ ฮน A A (โ‰ƒ-refl โŸจ A โŸฉ)
   ฯ A = (ฯโ‚€ [ A ]โ‚€ , ฯโ‚ [ A ]โ‚)

   ฮธ : {X : ๐“ค ฬ‡ } (s t : S X) โ†’ is-embedding (canonical-map ฮน ฯ s t)
   ฮธ {X} (sโ‚€ , sโ‚) (tโ‚€ , tโ‚) = ฮณ
    where
     c : (p : sโ‚€ , sโ‚ ๏ผ tโ‚€ , tโ‚) โ†’ ฮนโ‚€ (X , sโ‚€) (X , tโ‚€) (โ‰ƒ-refl X)
                                 ร— ฮนโ‚ (X , sโ‚) (X , tโ‚) (โ‰ƒ-refl X)

     c p = (canonical-map ฮนโ‚€ ฯโ‚€ sโ‚€ tโ‚€ (ap prโ‚ p) ,
            canonical-map ฮนโ‚ ฯโ‚ sโ‚ tโ‚ (ap prโ‚‚ p))

     i : is-embedding c
     i = technical-lemma
          (canonical-map ฮนโ‚€ ฯโ‚€)
          (canonical-map ฮนโ‚ ฯโ‚)
          ฮธโ‚€ ฮธโ‚ (sโ‚€ , sโ‚) (tโ‚€ , tโ‚)

     e : canonical-map ฮน ฯ (sโ‚€ , sโ‚) (tโ‚€ , tโ‚) โˆผ c
     e (refl {sโ‚€ , sโ‚}) = ๐“ป๐“ฎ๐’ป๐“ต (ฯโ‚€ (X , sโ‚€) , ฯโ‚ (X , sโ‚))

     ฮณ : is-embedding (canonical-map ฮน ฯ (sโ‚€ , sโ‚) (tโ‚€ , tโ‚))
     ฮณ = embedding-closed-under-โˆผ _ _ i e

 _โ‰ƒโŸฆ_,_โŸง_ : {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
          โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X)
          โ†’ SNS Sโ‚€ ๐“ฆโ‚€
          โ†’ SNS Sโ‚ ๐“ฆโ‚
          โ†’ (ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X)
          โ†’ ๐“ค โŠ” ๐“ฆโ‚€ โŠ” ๐“ฆโ‚ ฬ‡
 A โ‰ƒโŸฆ ฯƒโ‚€ , ฯƒโ‚ โŸง B = ฮฃ f ๊ž‰ (โŸช A โŸซ โ†’ โŸช B โŸซ)
                  , ฮฃ i ๊ž‰ is-equiv f , homomorphic ฯƒโ‚€ [ A ]โ‚€ [ B ]โ‚€ (f , i)
                                     ร— homomorphic ฯƒโ‚ [ A ]โ‚ [ B ]โ‚ (f , i)

 join-๏ผ-embedding : is-preunivalent ๐“ค
                  โ†’ {Sโ‚€ : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ } {Sโ‚ : ๐“ค ฬ‡ โ†’ ๐“ฅโ‚ ฬ‡ }
                    (ฯƒโ‚€ : SNS Sโ‚€ ๐“ฆโ‚€)  (ฯƒโ‚ : SNS Sโ‚ ๐“ฆโ‚)
                    (A B : ฮฃ X ๊ž‰ ๐“ค ฬ‡ , Sโ‚€ X ร— Sโ‚ X)
                  โ†’ (A ๏ผ B) โ†ช (A โ‰ƒโŸฆ ฯƒโ‚€ , ฯƒโ‚ โŸง B)
 join-๏ผ-embedding ua ฯƒโ‚€ ฯƒโ‚ = ๏ผ-embedding ua (join ฯƒโ‚€ ฯƒโ‚)
-}

\end{code}