Martin Escardo, 1st September 2023

\begin{code}

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

open import UF.FunExt
open import UF.PropTrunc

module UF.HiddenSwap
        (fe : Fun-Ext)
        (pt : propositional-truncations-exist)
       where

open import MLTT.Spartan
open import MLTT.Two-Properties
open import UF.Base
open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons
open import UF.Subsingletons-FunExt

open PropositionalTruncation pt

\end{code}

What is noteworthy about the following is that, without knowing a
specific equivalence of X with ๐Ÿš, so that, in particular, we cannot
get any particular point of X, we can still swap the two unknown
points of X, so to speak.

\begin{code}

hidden-swap : {X : ๐“ค ฬ‡ }
            โ†’ โˆฅ X โ‰ƒ ๐Ÿš โˆฅ
            โ†’ ฮฃ f ๊ž‰ (X โ†’ X) , (f โ‰  id) ร— (f โˆ˜ f โˆผ id)
hidden-swap {๐“ค} {X} s = VII
 where
  I : (x : X) โ†’ X โ‰ƒ ๐Ÿš โ†’ ฮฃ y ๊ž‰ X , x โ‰  y
  I x ๐•˜ = โŒœ ๐•˜ โŒโปยน (complement (โŒœ ๐•˜ โŒ x)) , Iโ‚€
   where
    Iโ‚€ : x โ‰  โŒœ ๐•˜ โŒโปยน (complement (โŒœ ๐•˜ โŒ x))
    Iโ‚€ p = complement-no-fp (โŒœ ๐•˜ โŒ x) Iโ‚
     where
      Iโ‚ = โŒœ ๐•˜ โŒ x                                 ๏ผโŸจ ap โŒœ ๐•˜ โŒ p โŸฉ
            โŒœ ๐•˜ โŒ (โŒœ ๐•˜ โŒโปยน (complement (โŒœ ๐•˜ โŒ x))) ๏ผโŸจ Iโ‚‚ โŸฉ
            (complement (โŒœ ๐•˜ โŒ x))                 โˆŽ
            where
             Iโ‚‚ = inverses-are-sections โŒœ ๐•˜ โŒ โŒœ ๐•˜ โŒ-is-equiv _

  X-is-set : is-set X
  X-is-set = โˆฅโˆฅ-rec (being-set-is-prop fe) (ฮป ๐•˜ โ†’ equiv-to-set ๐•˜ ๐Ÿš-is-set) s

  II : (x y y' : X) โ†’ x โ‰  y โ†’ x โ‰  y' โ†’ y ๏ผ y'
  II x y y' ฮฝ ฮฝ' = โˆฅโˆฅ-rec X-is-set (ฮป ๐•˜ โ†’ d' ๐•˜ x y y' ฮฝ ฮฝ') s
   where
    d' : X โ‰ƒ ๐Ÿš โ†’ (x y y' : X) โ†’ x โ‰  y โ†’ x โ‰  y' โ†’ y ๏ผ y'
    d' ๐•˜ x y y' ฮฝ ฮฝ' = equivs-are-lc โŒœ ๐•˜ โŒ โŒœ ๐•˜ โŒ-is-equiv IIโ‚€
     where
      IIโ‚€ : โŒœ ๐•˜ โŒ y ๏ผ โŒœ ๐•˜ โŒ y'
      IIโ‚€ = ๐Ÿš-things-distinct-from-a-third-are-equal (โŒœ ๐•˜ โŒ y) (โŒœ ๐•˜ โŒ y') (โŒœ ๐•˜ โŒ x)
             (ฮป (p : โŒœ ๐•˜ โŒ y ๏ผ โŒœ ๐•˜ โŒ x)
                   โ†’ ฮฝ (equivs-are-lc โŒœ ๐•˜ โŒ โŒœ ๐•˜ โŒ-is-equiv (p โปยน)))
             (ฮป (p : โŒœ ๐•˜ โŒ y' ๏ผ โŒœ ๐•˜ โŒ x)
                   โ†’ ฮฝ' (equivs-are-lc โŒœ ๐•˜ โŒ โŒœ ๐•˜ โŒ-is-equiv (p โปยน)))

  III : (x : X) โ†’ is-prop (ฮฃ y ๊ž‰ X , x โ‰  y)
  III x (y , ฮฝ) (y' , ฮฝ') =
   to-subtype-๏ผ (ฮป x โ†’ negations-are-props fe) (II x y y' ฮฝ ฮฝ')

  IV : (x : X) โ†’ ฮฃ y ๊ž‰ X , x โ‰  y
  IV x = โˆฅโˆฅ-rec (III x) (I x) s

  f : X โ†’ X
  f x = prโ‚ (IV x)

  V : f โˆ˜ f โˆผ id
  V x = Vโ‚‚
   where
    Vโ‚€ : x โ‰  f x
    Vโ‚€ = prโ‚‚ (IV x)

    Vโ‚ : f x โ‰  f (f x)
    Vโ‚ = prโ‚‚ (IV (f x))

    Vโ‚‚ : f (f x) ๏ผ x
    Vโ‚‚ = II (f x) (f (f x)) x Vโ‚ (โ‰ -sym Vโ‚€)

  VI : f โ‰  id
  VI p = VIโ‚
   where
    VIโ‚€ : โˆƒ x ๊ž‰ X , (x โ‰  f x)
    VIโ‚€ = โˆฅโˆฅ-rec โˆƒ-is-prop (ฮป ๐•˜ โ†’ โˆฃ โŒœ ๐•˜ โŒโปยน โ‚€ , prโ‚‚ (IV (โŒœ ๐•˜ โŒโปยน โ‚€)) โˆฃ) s

    VIโ‚ : ๐Ÿ˜
    VIโ‚ = โˆฅโˆฅ-rec ๐Ÿ˜-is-prop (ฮป (x , ฮฝ) โ†’ ฮฝ (happly (p โปยน) x)) VIโ‚€

  VII :  ฮฃ f ๊ž‰ (X โ†’ X) , (f โ‰  id) ร— (f โˆ˜ f โˆผ id)
  VII = f , VI , V

\end{code}

Because involutions are equivalences, we get the following.

\begin{code}

hidden-swap-corollary : {X : ๐“ค ฬ‡ }
                      โ†’ โˆฅ X โ‰ƒ ๐Ÿš โˆฅ
                      โ†’ ฮฃ ๐•— ๊ž‰ X โ‰ƒ X , โŒœ ๐•— โŒ โ‰  id
hidden-swap-corollary {๐“ค} {X} s = I (hidden-swap s)
 where
  I : (ฮฃ f ๊ž‰ (X โ†’ X) , (f โ‰  id) ร— (f โˆ˜ f โˆผ id))
    โ†’ ฮฃ ๐•— ๊ž‰ X โ‰ƒ X , (โŒœ ๐•— โŒ โ‰  id)
  I (f , ฮฝ , i) = qinveq f (f , i , i) , ฮฝ

\end{code}

The above is a solution to exercises proposed on
https://mathstodon.xyz/@MartinEscardo/110991799307299727

An independent solution by github user Seiryn21 is at
https://gist.github.com/Seiryn21/4173b1ee0b88be7b5a6054ac3222c8e1