Martin Escardo, 8th December 2019.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module Fin.Bishop where
open import Fin.Properties
open import Fin.Type
open import MLTT.Spartan
open import UF.Base
open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.PropTrunc
open import UF.Subsingletons
open import UF.UA-FunExt
open import UF.Univalence
open import UF.UniverseEmbedding
\end{code}
One defines a type to be finite, in univalent mathematics, if it is
isomorphic to Fin n for some n. But one has to be careful to express
this, if we want finiteness to be property rather than structure, with
a suitably chosen notion of existence.
The following is structure rather than property. It amounts to the
type of finite linear orders on X.
\begin{code}
finite-linear-order : π€ Μ β π€ Μ
finite-linear-order X = Ξ£ n κ β , X β Fin n
\end{code}
There are two ways of making π + π into a linear order. We choose the
following one.
\begin{code}
π+π-natural-finite-linear-order : finite-linear-order (π {π€} + π {π€})
π+π-natural-finite-linear-order {π€} = 2 , g
where
f : π {π€} + π {π€} β (π {π€β} + π {π€β}) + π {π€β}
f = +-cong π-lneutral'' one-π-only
f' : π {π€} + π {π€} β Fin 2
f' = f
g : π {π€} + π {π€} β Fin 2
g = +comm β f'
observation : (β g β (inl β) οΌ π) Γ (β g β (inr β) οΌ π)
observation = refl , refl
\end{code}
Exercise: If X β Fin n, then the type finite-linear-order X has n! elements (solved
elsewhere in TypeTopology).
\begin{code}
type-of-linear-orders-is-β : Univalence β (Ξ£ X κ π€ Μ , finite-linear-order X) β β
type-of-linear-orders-is-β {π€} ua =
(Ξ£ X κ π€ Μ , Ξ£ n κ β , X β Fin n) ββ¨ i β©
(Ξ£ X κ π€ Μ , Ξ£ n κ β , Fin n β X) ββ¨ ii β©
(Ξ£ X κ π€ Μ , Ξ£ n κ β , Lift π€ (Fin n) β X) ββ¨ iii β©
(Ξ£ X κ π€ Μ , Ξ£ n κ β , Lift π€ (Fin n) οΌ X) ββ¨ iv β©
β β
where
fe : FunExt
fe = Univalence-gives-FunExt ua
i = Ξ£-cong (Ξ» X β Ξ£-cong (Ξ» n β β-Sym fe))
ii = Ξ£-cong (Ξ» X β Ξ£-cong (Ξ» n β β-cong-left fe (β-Lift π€ (Fin n))))
iii = Ξ£-cong (Ξ» X β Ξ£-cong (Ξ» n β β-sym (univalence-β (ua π€) (Lift π€ (Fin n)) X)))
iv = total-fiber-is-domain (Lift π€ β Fin)
\end{code}
Hence one considers the following notion of finiteness, which is
property rather than structure:
\begin{code}
module finiteness (pt : propositional-truncations-exist) where
open PropositionalTruncation pt
_has-cardinality_ : π€ Μ β β β π€ Μ
X has-cardinality n = β₯ X β Fin n β₯
is-finite : π€ Μ β π€ Μ
is-finite X = Ξ£ n κ β , X has-cardinality n
cardinality : (X : π€ Μ ) β is-finite X β β
cardinality X = prβ
cardinality-β : (X : π€ Μ ) (Ο : is-finite X) β X has-cardinality (cardinality X Ο)
cardinality-β X = prβ
being-finite-is-prop : (X : π€ Μ ) β is-prop (is-finite X)
being-finite-is-prop X (m , d) (n , e) = Ξ³
where
Ξ± : (m n : β) β X β Fin m β X β Fin n β m οΌ n
Ξ± m n d e = Fin-lc m n (β-sym d β e)
Ξ² : (m n : β) β β₯ X β Fin m β₯ β β₯ X β Fin n β₯ β m οΌ n
Ξ² m n = β₯β₯-recβ β-is-set (Ξ± m n)
Ξ³ : m , d οΌ n , e
Ξ³ = to-Ξ£-οΌ (Ξ² m n d e , β₯β₯-is-prop _ _)
\end{code}
Equivalently, one can define finiteness as follows, with the
truncation outside the Ξ£:
\begin{code}
is-finite' : π€ Μ β π€ Μ
is-finite' X = β n κ β , X β Fin n
being-finite'-is-prop : (X : π€ Μ ) β is-prop (is-finite' X)
being-finite'-is-prop X = β-is-prop
finite'-gives-finite : (X : π€ Μ ) β is-finite' X β is-finite X
finite'-gives-finite X = β₯β₯-rec (being-finite-is-prop X) Ξ³
where
Ξ³ : (Ξ£ n κ β , X β Fin n) β Ξ£ n κ β , β₯ X β Fin n β₯
Ξ³ (n , e) = n , β£ e β£
finite-gives-finite' : (X : π€ Μ ) β is-finite X β is-finite' X
finite-gives-finite' X (n , s) = β₯β₯-rec β₯β₯-is-prop (Ξ» e β β£ n , e β£) s
\end{code}