Skip to content

Factorial.PlusOneLC

Martin Escardo, 21 March 2018, 1st December 2019.

We prove the known (constructive) fact that

  X + ๐Ÿ™ โ‰ƒ Y + ๐Ÿ™ โ†’ X โ‰ƒ Y.

The new proof from 1st December 2019 is extracted from the module
UF.Factorial and doesn't use function extensionality. The old proof
from 21 March 2018 is included at the end.


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

module Factorial.PlusOneLC where

open import Factorial.Swap
open import MLTT.Plus-Properties
open import MLTT.Spartan
open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.Retracts

+๐Ÿ™-cancellable : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
               โ†’ (X + ๐Ÿ™ {๐“ฆ} โ‰ƒ Y + ๐Ÿ™ {๐“ฃ})
               โ†’ X โ‰ƒ Y
+๐Ÿ™-cancellable {๐“ค} {๐“ฅ} {๐“ฆ} {๐“ฃ} {X} {Y} (ฯ† , i) = qinveq f' (g' , ฮท' , ฮต')
 where
  zโ‚€ : X + ๐Ÿ™
  zโ‚€ = inr โ‹†

  tโ‚€ : Y + ๐Ÿ™
  tโ‚€ = inr โ‹†

  j : is-isolated zโ‚€
  j = new-point-is-isolated

  k : is-isolated (ฯ† zโ‚€)
  k = equivs-preserve-isolatedness ฯ† i zโ‚€ j

  l : is-isolated tโ‚€
  l = new-point-is-isolated

  s : Y + ๐Ÿ™ โ†’ Y + ๐Ÿ™
  s = swap (ฯ† zโ‚€) tโ‚€ k l

  f : X + ๐Ÿ™ โ†’ Y + ๐Ÿ™
  f = s โˆ˜ ฯ†

  p : f zโ‚€ ๏ผ tโ‚€
  p = swap-equationโ‚€ (ฯ† zโ‚€) tโ‚€ k l

  g : Y + ๐Ÿ™ โ†’ X + ๐Ÿ™
  g = inverse ฯ† i โˆ˜ s

  h : s โˆ˜ s โˆผ id
  h = swap-involutive (ฯ† zโ‚€) tโ‚€ k l

  ฮท : g โˆ˜ f โˆผ id
  ฮท z = inverse ฯ† i (s (s (ฯ† z))) ๏ผโŸจ ap (inverse ฯ† i) (h (ฯ† z)) โŸฉ
        inverse ฯ† i (ฯ† z)         ๏ผโŸจ inverses-are-retractions ฯ† i z โŸฉ
        z                         โˆŽ

  ฮต : f โˆ˜ g โˆผ id
  ฮต t = s (ฯ† (inverse ฯ† i (s t))) ๏ผโŸจ ap s (inverses-are-sections ฯ† i (s t)) โŸฉ
        s (s t)                   ๏ผโŸจ h t โŸฉ
        t                         โˆŽ

  f' : X โ†’ Y
  f' x = prโ‚ (inl-preservation f p (sections-are-lc f (g , ฮท)) x)

  a : (x : X) โ†’ f (inl x) ๏ผ inl (f' x)
  a x = prโ‚‚ (inl-preservation f p (sections-are-lc f (g , ฮท)) x)

  q = g tโ‚€     ๏ผโŸจ ap g (p โปยน) โŸฉ
      g (f zโ‚€) ๏ผโŸจ ฮท zโ‚€ โŸฉ
      inr โ‹†    โˆŽ

  g' : Y โ†’ X
  g' y = prโ‚ (inl-preservation g q (sections-are-lc g (f , ฮต)) y)

  b : (y : Y) โ†’ g (inl y) ๏ผ inl (g' y)
  b y = prโ‚‚ (inl-preservation g q (sections-are-lc g (f , ฮต)) y)

  ฮท' : (x : X) โ†’ g' (f' x) ๏ผ x
  ฮท' x = inl-lc (inl (g' (f' x)) ๏ผโŸจ (b (f' x))โปยน โŸฉ
                 g (inl (f' x))  ๏ผโŸจ (ap g (a x))โปยน โŸฉ
                 g (f (inl x))   ๏ผโŸจ ฮท (inl x) โŸฉ
                 inl x           โˆŽ)

  ฮต' : (y : Y) โ†’ f' (g' y) ๏ผ y
  ฮต' y = inl-lc (inl (f' (g' y)) ๏ผโŸจ (a (g' y))โปยน โŸฉ
                 f (inl (g' y))  ๏ผโŸจ (ap f (b y))โปยน โŸฉ
                 f (g (inl y))   ๏ผโŸจ ฮต (inl y) โŸฉ
                 inl y           โˆŽ)


The old version from 21 March 2018, which uses function
extensionality:


_โˆ–_ : (X : ๐“ค ฬ‡ ) (a : X) โ†’ ๐“ค ฬ‡
X โˆ– a = ฮฃ x ๊ž‰ X , x โ‰  a

open import UF.FunExt

module _ (fe : FunExt) where

 open import UF.Base
 open import UF.Subsingletons-FunExt

 add-and-remove-point : {X : ๐“ค ฬ‡ } โ†’  X โ‰ƒ (X + ๐Ÿ™) โˆ– (inr โ‹†)
 add-and-remove-point {๐“ค} {X} = qinveq f (g , ฮต , ฮท)
  where
   f : X โ†’ (X + ๐Ÿ™ {๐“ค}) โˆ– inr โ‹†
   f x = (inl x , +disjoint)

   g : (X + ๐Ÿ™) โˆ– inr โ‹† โ†’ X
   g (inl x , u) = x
   g (inr โ‹† , u) = ๐Ÿ˜-elim (u refl)

   ฮท : f โˆ˜ g โˆผ id
   ฮท (inl x , u) = to-ฮฃ-๏ผ' (negations-are-props (fe ๐“ค ๐“คโ‚€) _ _)
   ฮท (inr โ‹† , u) = ๐Ÿ˜-elim (u refl)

   ฮต : g โˆ˜ f โˆผ id
   ฮต x = refl

 remove-points : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
               โ†’ qinv f
               โ†’ (a : X) โ†’ X โˆ– a โ‰ƒ Y โˆ– (f a)
 remove-points {๐“ค} {๐“ฅ} {X} {Y} f (g , ฮต , ฮท) a = qinveq f' (g' , ฮต' , ฮท')
  where
   f' : X โˆ– a โ†’ Y โˆ– (f a)
   f' (x , u) = (f x , ฮป (p : f x ๏ผ f a) โ†’ u ((ฮต x)โปยน โˆ™ ap g p โˆ™ ฮต a))

   g' : Y โˆ– (f a) โ†’ X โˆ– a
   g' (y , v) = (g y , ฮป (p : g y ๏ผ a) โ†’ v ((ฮท y) โปยน โˆ™ ap f p))

   ฮต' : g' โˆ˜ f' โˆผ id
   ฮต' (x , _) = to-ฮฃ-๏ผ (ฮต x , negations-are-props (fe ๐“ค ๐“คโ‚€) _ _)

   ฮท' : f' โˆ˜ g' โˆผ id
   ฮท' (y , _) = to-ฮฃ-๏ผ (ฮท y , negations-are-props (fe ๐“ฅ ๐“คโ‚€) _ _)

 add-one-and-remove-isolated-point : {Y : ๐“ฅ ฬ‡ } (z : Y + ๐Ÿ™)
                                   โ†’ is-isolated z
                                   โ†’ ((Y + ๐Ÿ™) โˆ– z) โ‰ƒ Y
 add-one-and-remove-isolated-point {๐“ฅ} {Y} (inl b) i = qinveq f (g , ฮต , ฮท)
  where
   f : (Y + ๐Ÿ™) โˆ– (inl b) โ†’ Y
   f (inl y , u) = y
   f (inr โ‹† , u) = b

   g' : (y : Y) โ†’ is-decidable (inl b ๏ผ inl y) โ†’ (Y + ๐Ÿ™) โˆ– (inl b)
   g' y (inl p) = (inr โ‹† , +disjoint')
   g' y (inr u) = (inl y , contrapositive (_โปยน) u)

   g : Y โ†’ (Y + ๐Ÿ™) โˆ– (inl b)
   g y = g' y (i (inl y))

   ฮต : g โˆ˜ f โˆผ id
   ฮต (inl y , u) = to-ฮฃ-๏ผ (p , negations-are-props (fe ๐“ฅ ๐“คโ‚€) _ _)
    where
     ฯ† : (p : inl b ๏ผ inl y) (q : i (inl y) ๏ผ inl p) โ†’ i (inl y) ๏ผ inr (โ‰ -sym u)
     ฯ† p q = ๐Ÿ˜-elim (u (p โปยน))
     ฯˆ : (v : inl b โ‰  inl y) (q : i (inl y) ๏ผ inr v) โ†’ i (inl y) ๏ผ inr (โ‰ -sym u)
     ฯˆ v q = q โˆ™ ap inr (negations-are-props (fe ๐“ฅ ๐“คโ‚€) _ _)
     h : i (inl y) ๏ผ inr (โ‰ -sym u)
     h = equality-cases (i (inl y)) ฯ† ฯˆ
     p : prโ‚ (g' y (i (inl y))) ๏ผ inl y
     p = ap (prโ‚ โˆ˜ (g' y)) h
   ฮต (inr โ‹† , u) = equality-cases (i (inl b)) ฯ† ฯˆ
    where
     ฯ† : (p : inl b ๏ผ inl b) โ†’ i (inl b) ๏ผ inl p โ†’ g (f (inr โ‹† , u)) ๏ผ (inr โ‹† , u)
     ฯ† p q = r โˆ™ to-ฮฃ-๏ผ (refl , negations-are-props (fe ๐“ฅ ๐“คโ‚€) _ _)
      where
       r : g b ๏ผ (inr โ‹† , +disjoint')
       r = ap (g' b) q
     ฯˆ : (v : inl b โ‰  inl b) โ†’ i (inl b) ๏ผ inr v โ†’ g (f (inr โ‹† , u)) ๏ผ (inr โ‹† , u)
     ฯˆ v q = ๐Ÿ˜-elim (v refl)

   ฮท : f โˆ˜ g โˆผ id
   ฮท y = equality-cases (i (inl y)) ฯ† ฯˆ
    where
     ฯ† : (p : inl b ๏ผ inl y) โ†’ i (inl y) ๏ผ inl p โ†’ f (g' y (i (inl y))) ๏ผ y
     ฯ† p q = ap (ฮป - โ†’ f (g' y -)) q โˆ™ inl-lc p
     ฯˆ : (u : inl b โ‰  inl y) โ†’ i (inl y) ๏ผ inr u โ†’ f (g' y (i (inl y))) ๏ผ y
     ฯˆ _ = ap ((ฮป d โ†’ f (g' y d)))

 add-one-and-remove-isolated-point {๐“ฅ} {Y} (inr โ‹†) _ = โ‰ƒ-sym add-and-remove-point

 +๐Ÿ™-cancellable' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ (X + ๐Ÿ™) โ‰ƒ (Y + ๐Ÿ™) โ†’ X โ‰ƒ Y
 +๐Ÿ™-cancellable' {๐“ค} {๐“ฅ} {X} {Y} (ฯ† , e) =
    X                  โ‰ƒโŸจ add-and-remove-point โŸฉ
   (X + ๐Ÿ™) โˆ– inr โ‹†     โ‰ƒโŸจ remove-points ฯ† (equivs-are-qinvs ฯ† e) (inr โ‹†) โŸฉ
   (Y + ๐Ÿ™) โˆ– ฯ† (inr โ‹†) โ‰ƒโŸจ add-one-and-remove-isolated-point
                           (ฯ† (inr โ‹†))
                           (equivs-preserve-isolatedness ฯ† e (inr โ‹†)
                             new-point-is-isolated) โŸฉ
    Y                  โ– 


Added 16th April 2021.


open import UF.Subsingletons-FunExt

remove-and-add-isolated-point : funext ๐“ค ๐“คโ‚€
                              โ†’ {X : ๐“ค ฬ‡ } (xโ‚€ : X)
                              โ†’ is-isolated xโ‚€
                              โ†’ X โ‰ƒ (X โˆ– xโ‚€ + ๐Ÿ™ {๐“ฅ})
remove-and-add-isolated-point fe {X} xโ‚€ ฮน = qinveq f (g , ฮต , ฮท)
 where
  ฯ• : (x : X) โ†’ is-decidable (xโ‚€ ๏ผ x) โ†’ X โˆ– xโ‚€ + ๐Ÿ™
  ฯ• x (inl p) = inr โ‹†
  ฯ• x (inr ฮฝ) = inl (x , (ฮป (p : x ๏ผ xโ‚€) โ†’ ฮฝ (p โปยน)))

  f : X โ†’ X โˆ– xโ‚€ + ๐Ÿ™
  f x = ฯ• x (ฮน x)

  g : X โˆ– xโ‚€ + ๐Ÿ™ โ†’ X
  g (inl (x , _)) = x
  g (inr โ‹†) = xโ‚€

  ฮท' : (y : X โˆ– xโ‚€ + ๐Ÿ™) (d : is-decidable (xโ‚€ ๏ผ g y)) โ†’ ฯ• (g y) d ๏ผ y
  ฮท' (inl (x , ฮฝ)) (inl q) = ๐Ÿ˜-elim (ฮฝ (q โปยน))
  ฮท' (inl (x , ฮฝ)) (inr _) = ap (ฮป - โ†’ inl (x , -)) (negations-are-props fe _ _)
  ฮท' (inr โ‹†) (inl p)       = refl
  ฮท' (inr โ‹†) (inr ฮฝ)       = ๐Ÿ˜-elim (ฮฝ refl)

  ฮท : f โˆ˜ g โˆผ id
  ฮท y = ฮท' y (ฮน (g y))

  ฮต' : (x : X) (d : is-decidable (xโ‚€ ๏ผ x)) โ†’ g (ฯ• x d) ๏ผ x
  ฮต' x (inl p) = p
  ฮต' x (inr ฮฝ) = refl

  ฮต : g โˆ˜ f โˆผ id
  ฮต x = ฮต' x (ฮน x)