Section enumerable_definitions.
Variable (X : Type).
(* enumerability of a Type *)
Definition type_enum := exists f : nat -> option X, forall x, exists n, Some x = f n.
Definition type_enum_t := { f : nat -> option X | forall x, exists n, Some x = f n }.
Definition list_enum := exists f : nat -> list X, forall x, exists n, In x (f n).
Definition list_enum_t := { f : nat -> list X | forall x, exists n, In x (f n) }.
(* of a predicate, definition 1 *)
Definition opt_enum P := exists f : nat -> option X, forall x, P x <-> exists n, Some x = f n.
Definition opt_enum_t P := { f : nat -> option X | forall x, P x <-> exists n, Some x = f n }.
(* of a predicate, definition 2 *)
Definition rec_enum P := exists (Q : nat -> X -> bool),
forall x, P x <-> exists n, Q n x = true.
Definition rec_enum_t P := { Q : nat -> X -> bool | forall x, P x <-> exists n, Q n x = true }.

Theorem type_list_enum : type_enum <-> list_enum.