\import Equiv
\import Function
\import Function.Meta
\import Logic
\import Paths
\import Set.Fin.Pigeonhole
\type isDFin (A : \Set) : \Prop
=> \Pi (f : A -> A) -> isInj f -> isSurj f
\where {
\lemma isEquiv {A : \Set} (p : isDFin A) (f : A -> A) (inj : isInj f) : Equiv f
=> Equiv.fromInjSurj f inj (p f inj)
\func isSplit {A : \Set} (p : isDFin A) (f : A -> A) (inj : isInj f) (a : A) : \Sigma (a' : A) (f a' = a)
=> (ret {isEquiv p f inj} a, Equiv.f_ret a)
\lemma fromPigeonhole (A : PigeonholeSet) : isDFin A
=> \lam f inj a => TruncP.map (A.pigeonhole< (\lam i => iterr f i a))
\lam t => (_, inv $ iterr_inj f inj a t.1 t.2 t.3 t.4)
}