Require Export FiniteTypes.
Require Export Relation_Definitions.
Set Asymmetric Patterns.
Inductive CountableT (X:Type) : Prop :=
| intro_nat_injection: forall f:X->nat, injective f -> CountableT X.

(* Specifications: *)
Lemma CountableT_is_FiniteT_or_countably_infinite:
forall X:Type, CountableT X ->
{FiniteT X} + {exists f:X->nat, bijective f}.
Lemma countable_nat_product: CountableT (nat*nat).
Lemma countable_sum: forall X Y:Type,
CountableT X -> CountableT Y -> CountableT (X+Y).
Lemma countable_product: forall X Y:Type,
CountableT X -> CountableT Y -> CountableT (X*Y).
Lemma countable_exp: forall X Y:Type,
FiniteT X -> CountableT Y -> CountableT (X->Y).