Martin Escardo, 2014.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module Fin.Type where
open import MLTT.Spartan
open import MLTT.Plus-Properties
Fin : ℕ → 𝓤₀ ̇
Fin 0 = 𝟘
Fin (succ n) = Fin n + 𝟙
\end{code}
We have zero and successor for finite sets, with the following types:
\begin{code}
fzero : {n : ℕ} → Fin (succ n)
fzero = inr ⋆
fsucc : {n : ℕ} → Fin n → Fin (succ n)
fsucc = inl
suc-lc : {n : ℕ} {j k : Fin n} → fsucc j = fsucc k → j = k
suc-lc = inl-lc
\end{code}
But it will more convenient to have them as patterns, for the sake of
clarity in definitions by pattern matching:
\begin{code}
pattern 𝟎 = inr ⋆
pattern suc i = inl i
pattern 𝟏 = suc 𝟎
pattern 𝟐 = suc 𝟏
pattern 𝟑 = suc 𝟐
pattern 𝟒 = suc 𝟑
pattern 𝟓 = suc 𝟒
pattern 𝟔 = suc 𝟓
pattern 𝟕 = suc 𝟔
pattern 𝟖 = suc 𝟕
pattern 𝟗 = suc 𝟖
\end{code}
The induction principle for Fin is proved by induction on ℕ:
\begin{code}
Fin-induction : (P : (n : ℕ) → Fin n → 𝓤 ̇ )
→ ((n : ℕ) → P (succ n) 𝟎)
→ ((n : ℕ) (i : Fin n) → P n i → P (succ n) (suc i))
→ (n : ℕ) (i : Fin n) → P n i
Fin-induction P β σ 0 i = 𝟘-elim i
Fin-induction P β σ (succ n) 𝟎 = β n
Fin-induction P β σ (succ n) (suc i) = σ n i (Fin-induction P β σ n i)
\end{code}