{-# OPTIONS --cubical --no-import-sorts --safe #-} module Cubical.Data.FinData.Properties where open import Cubical.Foundations.Function open import Cubical.Foundations.Prelude open import Cubical.Data.FinData.Base as Fin import Cubical.Data.Nat as open import Cubical.Data.Empty as Empty open import Cubical.Relation.Nullary private variable : Level A : Type znots : ∀{k} {m : Fin k} ¬ (zero (suc m)) znots {k} {m} x = subst (Fin.rec (Fin k) ) x m snotz : ∀{k} {m : Fin k} ¬ ((suc m) zero) snotz {k} {m} x = subst (Fin.rec (Fin k)) x m isPropFin0 : isProp (Fin 0) isPropFin0 = Empty.rec ¬Fin0 isContrFin1 : isContr (Fin 1) isContrFin1 .fst = zero isContrFin1 .snd zero = refl injSucFin : {n} { p q : Fin n} suc p suc q p q injSucFin {ℕ.suc ℕ.zero} {zero} {zero} pf = refl injSucFin {ℕ.suc (ℕ.suc n)} pf = cong predFin pf discreteFin : ∀{k} Discrete (Fin k) discreteFin zero zero = yes refl discreteFin zero (suc y) = no znots discreteFin (suc x) zero = no snotz discreteFin (suc x) (suc y) with discreteFin x y ... | yes p = yes (cong suc p) ... | no ¬p = no q ¬p (injSucFin q)) isSetFin : ∀{k} isSet (Fin k) isSetFin = Discrete→isSet discreteFin