Definition ofNat n := match R_nat_nat n with Some (n, m) => nthe n ((L m)) | None => None end.

(* Specifications: *)
Lemma enum_count : enumerable p.
Lemma discrete_prod X Y : discrete X -> discrete Y -> discrete (X * Y).
Lemma discrete_sum X Y : discrete X -> discrete Y -> discrete (X + Y).
Lemma discrete_option X : discrete X -> discrete (option X).
Lemma discrete_list X : discrete X -> discrete (list X).
Lemma enumerable_enum X p : (exists L, enum p L) <-> @enumerable X p.
Lemma enum_enumT X : enumerable__T X <-> inhabited (enumT X).
Lemma enumerable__T_prod X Y : enumerable__T X -> enumerable__T Y -> enumerable__T (X * Y).
Lemma enumerable__T_sum X Y : enumerable__T X -> enumerable__T Y -> enumerable__T (X + Y).
Lemma enumerable__T_option X : enumerable__T X -> enumerable__T (option X).
Lemma T_list_cum : cumulative T_list.
Lemma T_list_el LX l : exists n, l el T_list LX n.