Martin Escardo, 2nd December 2019
\begin{code}
{-# OPTIONS --safe --without-K #-}
module Fin.Variation where
open import Fin.Type
open import MLTT.Spartan
open import Naturals.Order
open import Notation.Order
open import UF.Equiv
\end{code}
An isomorphic copy of the type Fin n:
\begin{code}
Fin' : ℕ → 𝓤₀ ̇
Fin' n = Σ k ꞉ ℕ , k < n
𝟎' : {n : ℕ} → Fin' (succ n)
𝟎' {n} = 0 , zero-least n
suc' : {n : ℕ} → Fin' n → Fin' (succ n)
suc' (k , l) = succ k , l
Fin-unprime : (n : ℕ) → Fin' n → Fin n
Fin-unprime 0 (k , l) = 𝟘-elim l
Fin-unprime (succ n) (0 , l) = 𝟎
Fin-unprime (succ n) (succ k , l) = suc (Fin-unprime n (k , l))
Fin-prime : (n : ℕ) → Fin n → Fin' n
Fin-prime 0 i = 𝟘-elim i
Fin-prime (succ n) (suc i) = suc' (Fin-prime n i)
Fin-prime (succ n) 𝟎 = 𝟎'
ηFin : (n : ℕ) → Fin-prime n ∘ Fin-unprime n ∼ id
ηFin 0 (k , l) = 𝟘-elim l
ηFin (succ n) (0 , *) = refl
ηFin (succ n) (succ k , l) = ap suc' (ηFin n (k , l))
εFin : (n : ℕ) → Fin-unprime n ∘ Fin-prime n ∼ id
εFin 0 i = 𝟘-elim i
εFin (succ n) (suc i) = ap suc (εFin n i)
εFin (succ n) 𝟎 = refl
Fin-prime-is-equiv : (n : ℕ) → is-equiv (Fin-prime n)
Fin-prime-is-equiv n = qinvs-are-equivs (Fin-prime n)
(Fin-unprime n , εFin n , ηFin n)
≃-Fin : (n : ℕ) → Fin n ≃ Fin' n
≃-Fin n = Fin-prime n , Fin-prime-is-equiv n
\end{code}