Martin Escardo, sometime between 2014 and 2021.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module Fin.Embeddings where
open import Fin.Properties
open import Fin.Type
open import Fin.Variation
open import MLTT.Plus-Properties
open import MLTT.Spartan
open import Naturals.Order
open import Notation.CanonicalMap
open import Notation.Order
open import UF.Embeddings
⟦_⟧ : {n : ℕ} → Fin n → ℕ
⟦_⟧ {n} = pr₁ ∘ Fin-prime n
module _ {n : ℕ} where
instance
canonical-map-Fin-ℕ : Canonical-Map (Fin n) ℕ
ι {{canonical-map-Fin-ℕ}} = ⟦_⟧ {n}
⟦⟧-property : {n : ℕ} (k : Fin n) → ⟦ k ⟧ < n
⟦⟧-property {n} k = pr₂ (Fin-prime n k)
⟦_⟧-is-embedding : (n : ℕ) → is-embedding (⟦_⟧ {n})
⟦_⟧-is-embedding n = ∘-is-embedding
(equivs-are-embeddings (Fin-prime n) (Fin-prime-is-equiv n))
(pr₁-is-embedding (λ i → <-is-prop-valued i n))
⟦⟪⟫⟧-property : {n : ℕ} → ⟦ ⟪ n ⟫ ⟧ = n
⟦⟪⟫⟧-property {0} = refl
⟦⟪⟫⟧-property {succ n} = ap succ (⟦⟪⟫⟧-property {n})
⟦_⟧-lc : (n : ℕ) → left-cancellable (⟦_⟧ {n})
⟦_⟧-lc n = embeddings-are-lc ⟦_⟧ (⟦_⟧-is-embedding n)
coerce : {n : ℕ} {i : Fin n} → Fin ⟦ i ⟧ → Fin n
coerce {succ n} {suc i} 𝟎 = 𝟎
coerce {succ n} {suc i} (suc j) = suc (coerce j)
coerce-lc : {n : ℕ} {i : Fin n} (j k : Fin ⟦ i ⟧)
→ coerce {n} {i} j = coerce {n} {i} k → j = k
coerce-lc {succ n} {suc i} 𝟎 𝟎 p = refl
coerce-lc {succ n} {suc i} 𝟎 (suc j) p = 𝟘-elim (+disjoint' p)
coerce-lc {succ n} {suc i} (suc j) 𝟎 p = 𝟘-elim (+disjoint p)
coerce-lc {succ n} {suc i} (suc j) (suc k) p = ap suc (coerce-lc {n} j k (suc-lc p))
incl : {n : ℕ} {k : ℕ} → k ≤ n → Fin k → Fin n
incl {succ n} {succ k} l 𝟎 = 𝟎
incl {succ n} {succ k} l (suc i) = suc (incl l i)
incl-lc : {n : ℕ} {k : ℕ} (l : k ≤ n)
→ (i j : Fin k) → incl l i = incl l j → i = j
incl-lc {succ n} {succ k} l 𝟎 𝟎 p = refl
incl-lc {succ n} {succ k} l 𝟎 (suc j) p = 𝟘-elim (positive-not-𝟎 (p ⁻¹))
incl-lc {succ n} {succ k} l (suc i) 𝟎 p = 𝟘-elim (positive-not-𝟎 p)
incl-lc {succ n} {succ k} l (suc i) (suc j) p = ap suc (incl-lc l i j (suc-lc p))
_/_ : {n : ℕ} (k : Fin (succ n)) → Fin ⟦ k ⟧ → Fin n
k / i = incl (⟦⟧-property k) i
_╱_ : (n : ℕ) → Fin n → Fin (succ n)
n ╱ k = incl (≤-succ n) k
mirror : {n : ℕ} → Fin n → Fin n
mirror {succ n} 𝟎 = ⟪ n ⟫
mirror {succ n} (suc k) = n ╱ mirror {n} k
\end{code}
TODO. Show that the above coersions are left cancellable (easy).
TODO. Rewrite above code to use the notation ι for all coersions,
defined in the module Notation.CanonicalMap.