Cardinality of finite types #
The cardinality of a finite type α
is given by Nat.card α
. This function has
the "junk value" of 0
for infinite types, but to ensure the function has valid
output, one just needs to know that it's possible to produce a Finite
instance
for the type. (Note: we could have defined a Finite.card
that required you to
supply a Finite
instance, but (a) the function would be noncomputable
anyway
so there is no need to supply the instance and (b) the function would have a more
complicated dependent type that easily leads to "motive not type correct" errors.)
Implementation notes #
Theorems about Nat.card
are sometimes incidentally true for both finite and infinite
types. If removing a finiteness constraint results in no loss in legibility, we remove
it. We generally put such theorems into the SetTheory.Cardinal.Finite
module.
There is (noncomputably) an equivalence between a finite type α
and Fin (Nat.card α)
.
Equations
- Finite.equivFin α = let_fun this := Nonempty.some ⋯; Eq.mpr ⋯ this
Instances For
Similar to Finite.equivFin
but with control over the term used for the cardinality.
Equations
- Finite.equivFinOfCardEq h = h ▸ Finite.equivFin α
Instances For
If f
is injective, then Nat.card α ≤ Nat.card β
. We must also assume
Nat.card β = 0 → Nat.card α = 0
since Nat.card
is defined to be 0
for infinite types.
If f
is surjective, then Nat.card β ≤ Nat.card α
. We must also assume
Nat.card α = 0 → Nat.card β = 0
since Nat.card
is defined to be 0
for infinite types.
NB: Nat.card
is defined to be 0
for infinite types.