Definition FiniteT_nat_cardinal (X:Type) (H:FiniteT X) : nat :=
proj1_sig (constructive_definite_description _
(FiniteT_has_nat_cardinal X H)).

(* Specifications: *)
Lemma FiniteT_nat_cardinal_def: forall (X:Type) (H:FiniteT X),
cardinal _ (@Full_set X) (FiniteT_nat_cardinal X H).
Lemma FiniteT_nat_cardinal_cond: forall (X:Type) (H:FiniteT X)
(n:nat),
cardinal _ (@Full_set X) n ->
FiniteT_nat_cardinal X H = n.
Lemma FiniteT_nat_cardinal_False:
FiniteT_nat_cardinal False empty_finite = 0.
Lemma injection_preserves_cardinal: forall (X Y:Type)
(f:X->Y) (n:nat) (S:Ensemble X), cardinal _ S n ->
injective f -> cardinal _ (Im S f) n.
Lemma FiniteT_nat_cardinal_option:
forall (X:Type) (H:FiniteT X),
FiniteT_nat_cardinal (option X) (add_finite X H) =
S (FiniteT_nat_cardinal X H).
Lemma FiniteT_nat_cardinal_bijection:
forall (X Y:Type) (H:FiniteT X) (g:X->Y) (Hinv:invertible g),
FiniteT_nat_cardinal Y (bij_finite X Y g H Hinv) =
FiniteT_nat_cardinal X H.
Lemma unique_FiniteT_nat_cardinal:
exists! f: (forall (X:Type), FiniteT X -> nat),
f False empty_finite = 0 /\
(forall (X:Type) (H:FiniteT X),
f (option X) (add_finite X H) = S (f X H)) /\
(forall (X Y:Type) (H:FiniteT X) (g:X->Y) (Hinv:invertible g),
f Y (bij_finite X Y g H Hinv) = f X H).