Standard Finite Types Properties
Table of Contents
1 Fin
Properties
module Lib.Prop.Fin where
This file states and shows more properties about finite types.
1.1 Packages imports
The imported packages can be accessed via the following links:
import Lib.Data.Fin import Lib.Prop.Coprod import Lib.Prop.Equiv import Lib.Prop.Nat
1.2 Fin k + l
is Fin k + Fin l
The proof is easy by induction on l
.
Fin/Equiv-add-copr (k : Nat) : (l : Nat) → (Equiv (Fin (plus-Nat k l)) (Coprod (Fin k) (Fin l))) = split zero → Equiv/sym (Coprod (Fin k) Empty) (Fin k) (Equiv/Equiv-copr-type-empty (Fin k)) suc l → Equiv/trans (Fin (plus-Nat k (suc l))) (Coprod (Coprod (Fin k) (Fin l)) Unit) (Coprod (Fin k) (Fin (suc l))) (Coprod/closed-Equiv (Fin (plus-Nat k l)) (Coprod (Fin k) (Fin l)) Unit Unit (Fin/Equiv-add-copr k l) (Equiv/refl Unit)) (Coprod/assoc (Fin k) (Fin l) Unit)
1.3 Relation to classical Fin
The classical version of Fin
is defined as a Σ-type Σ(x: Nat)x < k for Fin k. There's an equivalence between the classical version of the standard finite type and the classical finite type.
classical-Fin : Nat → U = λk. Σ Nat (λx. Prop/type (lt x k))
First, we define the inclusion map from Fin k to Nat.
Fin/inclusion' (k : Nat) (f : Fin k → Nat) : Fin (suc k) → Nat = split inl x → f x inr s → k Fin/inclusion : (k : Nat) → Fin k → Nat = split zero → ex-falso Nat suc k → Fin/inclusion' k (Fin/inclusion k)
For any x in Fin k, we obviously have that inclusion(x) < k.
Fin/inclusion/lt' (k : Nat) (H : (x : Fin k) → Prop/type (lt (Fin/inclusion k x) k)) : (x : Fin (suc k)) → Prop/type (lt (Fin/inclusion (suc k) x) (suc k)) = split inl x → lt/suc-right (Fin/inclusion k x) k (H x) inr s → lt/next k Fin/inclusion/lt : (k : Nat) → (x : Fin k) → Prop/type (lt (Fin/inclusion k x) k) = split zero → λx. ex-falso (Prop/type (lt (Fin/inclusion zero x) zero)) x suc k → Fin/inclusion/lt' k (Fin/inclusion/lt k)
Hence, the inclusion function induces a map from Fin k to classical-Fin k.
classical-Fin/from-Fin (k : Nat) (x : Fin k) : classical-Fin k = ( Fin/inclusion k x, Fin/inclusion/lt k x)
We show that there's a map from classical-Fin to Fin.
Fin/from-classical-Fin' (k : Nat) (x : classical-Fin (suc k)) (f : classical-Fin k → Fin k) : Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k)) → Fin (suc k) = split inl _ → inr star inr np → inl (f (x.1, le-neq-lt x.1 k x.2 np)) Fin/from-classical-Fin : (k : Nat) (x : classical-Fin k) → Fin k = split zero → λx. x.2 suc k → λx. Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) (Nat/has-decidable-eq x.1 k)
These maps are inverse to each other, as witnessed by the right homotopy:
Fin-classical-Fin/right-htpy' (k : Nat) (x : classical-Fin (suc k)) (IH : (x' : classical-Fin k) → Path (classical-Fin k) (classical-Fin/from-Fin k (Fin/from-classical-Fin k x')) x') : (u : Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) → Path (Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) (Nat/has-decidable-eq x.1 k) u → Path (classical-Fin (suc k)) (classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)) x = split inl p → λq. let r : Path (classical-Fin (suc k)) (classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)) (classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) (inl p))) = ( ap (Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) (classical-Fin (suc k)) (λr'. classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) r')) (Nat/has-decidable-eq x.1 k) (inl p) q) in SgPath-prop Nat ( λz. Prop/type (lt z (suc k))) ( λz. Prop/is-prop (lt z (suc k))) ( classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)) x ( comp Nat ( classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)).1 ( classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) (inl p))).1 ( λi. (r i).1) x.1 (inv Nat x.1 k p)) inr np → λp. let x' : classical-Fin k = (x.1, le-neq-lt x.1 k x.2 np) q : Path (classical-Fin k) (classical-Fin/from-Fin k (Fin/from-classical-Fin k x')) x' = IH x' r : Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) x) (inl (Fin/from-classical-Fin k x')) = ap (Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) (Fin (suc k)) (λu. Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) u) (Nat/has-decidable-eq x.1 k) (inr np) p s : Path (classical-Fin (suc k)) (classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)) (classical-Fin/from-Fin (suc k) (inl (Fin/from-classical-Fin k x'))) = ap (Fin (suc k)) (classical-Fin (suc k)) (classical-Fin/from-Fin (suc k)) (Fin/from-classical-Fin (suc k) x) (inl (Fin/from-classical-Fin k x')) r in SgPath-prop Nat ( λz. Prop/type (lt z (suc k))) ( λz. Prop/is-prop (lt z (suc k))) ( classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)) x ( comp Nat ( classical-Fin/from-Fin (suc k) (Fin/from-classical-Fin (suc k) x)).1 ( classical-Fin/from-Fin (suc k) (inl (Fin/from-classical-Fin k x'))).1 ( λi. (s i).1) x.1 (λi. (q i).1)) Fin-classical-Fin/right-htpy : (k : Nat) → (x : classical-Fin k) → Path (classical-Fin k) (classical-Fin/from-Fin k (Fin/from-classical-Fin k x)) x = split zero → λx. ex-falso (Path (classical-Fin zero) (classical-Fin/from-Fin zero (Fin/from-classical-Fin zero x)) x) x.2 suc k → λx. Fin-classical-Fin/right-htpy' k x (Fin-classical-Fin/right-htpy k) ( Nat/has-decidable-eq x.1 k) ( refl (Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) (Nat/has-decidable-eq x.1 k))
and the left homotopy:
lock Coprod/Eq/map Fin-classical-Fin/left-htpy'' (k : Nat) (s : Unit) : (u : Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k))) → Path (Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k))) (Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inr s)).1 k) u → Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) (classical-Fin/from-Fin (suc k) (inr s))) (inr s) = split inl p → λq. let x : classical-Fin (suc k) = (classical-Fin/from-Fin (suc k) (inr s)) in comp ( Fin (suc k)) ( Fin/from-classical-Fin (suc k) x) ( Fin/from-classical-Fin' k x (Fin/from-classical-Fin k) (inl p)) ( ap (Coprod (Path Nat x.1 k) (neg (Path Nat x.1 k))) (Fin (suc k)) (Fin/from-classical-Fin' k x (Fin/from-classical-Fin k)) (Nat/has-decidable-eq x.1 k) (inl p) q) ( inr s) ( Coprod/Eq/map ( Fin k) Unit ( inr star) ( inr s) ( Unit/all-elements-equal star s)) inr np → λ_. ex-falso ( Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) (classical-Fin/from-Fin (suc k) (inr s))) (inr s)) ( np (refl Nat k)) Fin-classical-Fin/left-htpy/inl (k : Nat) (IH : (x : Fin k) → Path (Fin k) (Fin/from-classical-Fin k (classical-Fin/from-Fin k x)) x) (x : Fin k) : (u : Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k))) → Path (Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k))) (Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inl x)).1 k) u → Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) (classical-Fin/from-Fin (suc k) (inl x))) (inl x) = split inl p → λ_. let x' : classical-Fin k = (classical-Fin/from-Fin k x) in ex-falso ( Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) (classical-Fin/from-Fin (suc k) (inl x))) (inl x)) ( lt-neq x'.1 k x'.2 p) inr np → λq. let x' : classical-Fin (suc k) = (classical-Fin/from-Fin (suc k) (inl x)) in comp-n ( Fin (suc k)) three-Nat ( Fin/from-classical-Fin (suc k) x') ( Fin/from-classical-Fin' k x' (Fin/from-classical-Fin k) (inr np)) ( ap (Coprod (Path Nat x'.1 k) (neg (Path Nat x'.1 k))) (Fin (suc k)) (Fin/from-classical-Fin' k x' (Fin/from-classical-Fin k)) (Nat/has-decidable-eq x'.1 k) (inr np) q) ( inl (Fin/from-classical-Fin k (classical-Fin/from-Fin k x))) ( Coprod/Eq/map ( Fin k) Unit ( Fin/from-classical-Fin' k x' (Fin/from-classical-Fin k) (inr np)) ( inl (Fin/from-classical-Fin k (classical-Fin/from-Fin k x))) ( ap (classical-Fin k) (Fin k) (Fin/from-classical-Fin k) (x'.1, le-neq-lt x'.1 k x'.2 np) (classical-Fin/from-Fin k x) (SgPath-prop Nat ( λn. Prop/type (lt n k)) ( λn. Prop/is-prop (lt n k)) ( x'.1, le-neq-lt x'.1 k x'.2 np) ( classical-Fin/from-Fin k x) ( refl Nat x'.1)))) ( inl x) ( Coprod/Eq/map ( Fin k) Unit ( inl (Fin/from-classical-Fin k (classical-Fin/from-Fin k x))) ( inl x) ( IH x)) Fin-classical-Fin/left-htpy' (k : Nat) (IH : (x : Fin k) → Path (Fin k) (Fin/from-classical-Fin k (classical-Fin/from-Fin k x)) x) : (x : Fin (suc k)) → Path (Fin (suc k)) (Fin/from-classical-Fin (suc k) (classical-Fin/from-Fin (suc k) x)) x = split inl x → Fin-classical-Fin/left-htpy/inl k IH x ( Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inl x)).1 k) ( refl (Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inl x)).1 k))) ( Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inl x)).1 k)) inr s → Fin-classical-Fin/left-htpy'' k s ( Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inr s)).1 k) ( refl (Coprod (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k) (neg (Path Nat (classical-Fin/from-Fin (suc k) (inr s)).1 k))) ( Nat/has-decidable-eq (classical-Fin/from-Fin (suc k) (inr s)).1 k)) Fin-classical-Fin/left-htpy : (k : Nat) → (x : Fin k) → Path (Fin k) (Fin/from-classical-Fin k (classical-Fin/from-Fin k x)) x = split zero → λx. ex-falso (Path Empty (Fin/from-classical-Fin zero (classical-Fin/from-Fin zero x)) x) x suc k → Fin-classical-Fin/left-htpy' k (Fin-classical-Fin/left-htpy k)
Equivalence:
Fin-is-classical-Fin (k : Nat) : Equiv (Fin k) (classical-Fin k) = has-inverse/Equiv ( Fin k) ( classical-Fin k) ( classical-Fin/from-Fin k) ( Fin/from-classical-Fin k, ( Fin-classical-Fin/right-htpy k, Fin-classical-Fin/left-htpy k)) classical-Fin-is-Fin (k : Nat) : Equiv (classical-Fin k) (Fin k) = has-inverse/Equiv ( classical-Fin k) ( Fin k) ( Fin/from-classical-Fin k) ( classical-Fin/from-Fin k, ( Fin-classical-Fin/left-htpy k, Fin-classical-Fin/right-htpy k))
From this equivalence, we can deduce that Fin k
is equivalent to a family indexed over the natural numbers.
Fin-Nat-family (k : Nat) (P : Fin k → U) : Nat → U = λn. Σ ( Prop/type (lt n k)) (λp. P ( Fin/from-classical-Fin k ( n, p))) Fin-Nat-family/Equiv (k : Nat) (P : Fin k → U) : Equiv (Σ (Fin k) P) (Σ Nat (Fin-Nat-family k P)) = Equiv/trans ( Σ (Fin k) P) ( Σ (classical-Fin k) (λx. P (Fin/from-classical-Fin k x))) ( Σ Nat (Fin-Nat-family k P)) ( Sg/equiv-base' ( classical-Fin k) ( Fin k) P ( classical-Fin-is-Fin k)) ( Equiv/associative-Sg' Nat ( λn. Prop/type (lt n k)) ( λn p. P (Fin/from-classical-Fin k (n, p))))