(** ** Discrete types are closed under ... *)

(* Specifications: *)
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).
(** ** Enumerable types are closed under ... *)
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).
Section enumerable_list.