feat(library/data/fintype,finset): add cardinality for finite types from Haitao Zhang
This commit is contained in:
parent
f475408f4c
commit
370860e1b0
6 changed files with 73 additions and 4 deletions
|
@ -33,5 +33,5 @@ Constructors:
|
||||||
|
|
||||||
Types with extra information:
|
Types with extra information:
|
||||||
|
|
||||||
* [fintype](fintype.lean) : finite types
|
* [fintype](fintype/fintype.md) : finite types
|
||||||
* [encodable](encodable.lean) : types with a coding to nat
|
* [encodable](encodable.lean) : types with a coding to nat
|
||||||
|
|
|
@ -5,7 +5,7 @@ Author: Leonardo de Moura, Jeremy Avigad
|
||||||
|
|
||||||
Finite sets.
|
Finite sets.
|
||||||
-/
|
-/
|
||||||
import data.fintype data.nat data.list.perm data.subtype algebra.binary
|
import data.fintype.basic data.nat data.list.perm data.subtype algebra.binary
|
||||||
open nat quot list subtype binary function
|
open nat quot list subtype binary function
|
||||||
open [declarations] perm
|
open [declarations] perm
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,8 @@ section card_image
|
||||||
open set
|
open set
|
||||||
include deceqB
|
include deceqB
|
||||||
|
|
||||||
theorem card_image_eq_of_inj_on {f : A → B} {s : finset A} (H1 : inj_on f (ts s)) : card (image f s) = card s :=
|
theorem card_image_eq_of_inj_on {f : A → B} {s : finset A} (H1 : inj_on f (ts s)) :
|
||||||
|
card (image f s) = card s :=
|
||||||
begin
|
begin
|
||||||
induction s with a t H IH,
|
induction s with a t H IH,
|
||||||
{ rewrite [card_empty] },
|
{ rewrite [card_empty] },
|
||||||
|
@ -81,6 +82,15 @@ begin
|
||||||
... = card (insert a t) : card_insert_of_not_mem H
|
... = card (insert a t) : card_insert_of_not_mem H
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
lemma card_le_of_inj_on (a : finset A) (b : finset B)
|
||||||
|
(Pex : ∃ f : A → B, set.inj_on f (ts a) ∧ (image f a ⊆ b)):
|
||||||
|
card a ≤ card b :=
|
||||||
|
obtain f Pinj, from Pex,
|
||||||
|
assert Psub : _, from and.right Pinj,
|
||||||
|
assert Ple : card (image f a) ≤ card b, from card_le_card_of_subset Psub,
|
||||||
|
by rewrite [(card_image_eq_of_inj_on (and.left Pinj))⁻¹]; exact Ple
|
||||||
|
|
||||||
end card_image
|
end card_image
|
||||||
|
|
||||||
theorem Sum_const_eq_card_mul (s : finset A) (n : nat) : (∑ x ∈ s, n) = card s * n :=
|
theorem Sum_const_eq_card_mul (s : finset A) (n : nat) : (∑ x ∈ s, n) = card s * n :=
|
||||||
|
|
51
library/data/fintype/card.lean
Normal file
51
library/data/fintype/card.lean
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/-
|
||||||
|
Copyright (c) 2015 Haitao Zhang. All rights reserved.
|
||||||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
Author: Haitao Zhang
|
||||||
|
|
||||||
|
Cardinality for finite types.
|
||||||
|
-/
|
||||||
|
import .basic data.list data.finset.card
|
||||||
|
open eq.ops nat function list finset
|
||||||
|
|
||||||
|
namespace fintype
|
||||||
|
|
||||||
|
definition card [reducible] (A : Type) [finA : fintype A] := finset.card (@finset.univ A _)
|
||||||
|
|
||||||
|
lemma card_eq_card_image_of_inj
|
||||||
|
{A : Type} [finA : fintype A] [deceqA : decidable_eq A]
|
||||||
|
{B : Type} [finB : fintype B] [deceqB : decidable_eq B]
|
||||||
|
{f : A → B} :
|
||||||
|
injective f → finset.card (image f univ) = card A :=
|
||||||
|
assume Pinj,
|
||||||
|
card_image_eq_of_inj_on (to_set_univ⁻¹ ▸ (iff.mp !set.injective_iff_inj_on_univ Pinj))
|
||||||
|
|
||||||
|
-- General version of the pigeonhole principle. See also data.less_than.
|
||||||
|
lemma card_le_of_inj (A : Type) [finA : fintype A] [deceqA : decidable_eq A]
|
||||||
|
(B : Type) [finB : fintype B] [deceqB : decidable_eq B] :
|
||||||
|
(∃ f : A → B, injective f) → card A ≤ card B :=
|
||||||
|
assume Pex, obtain f Pinj, from Pex,
|
||||||
|
assert Pinj_on_univ : _, from iff.mp !set.injective_iff_inj_on_univ Pinj,
|
||||||
|
assert Pinj_ts : _, from to_set_univ⁻¹ ▸ Pinj_on_univ,
|
||||||
|
assert Psub : (image f univ) ⊆ univ, from !subset_univ,
|
||||||
|
finset.card_le_of_inj_on univ univ (exists.intro f (and.intro Pinj_ts Psub))
|
||||||
|
|
||||||
|
-- used to prove that inj ∧ eq card => surj
|
||||||
|
lemma univ_of_card_eq_univ {A : Type} [finA : fintype A] [deceqA : decidable_eq A] {s : finset A} :
|
||||||
|
finset.card s = card A → s = univ :=
|
||||||
|
assume Pcardeq, ext (take a,
|
||||||
|
assert D : decidable (a ∈ s), from decidable_mem a s, begin
|
||||||
|
apply iff.intro,
|
||||||
|
intro ain, apply mem_univ,
|
||||||
|
intro ain, cases D with Pin Pnin,
|
||||||
|
exact Pin,
|
||||||
|
assert Pplus1 : finset.card (insert a s) = finset.card s + 1,
|
||||||
|
exact card_insert_of_not_mem Pnin,
|
||||||
|
rewrite Pcardeq at Pplus1,
|
||||||
|
assert Ple : finset.card (insert a s) ≤ card A,
|
||||||
|
apply card_le_card_of_subset, apply subset_univ,
|
||||||
|
rewrite Pplus1 at Ple,
|
||||||
|
exact false.elim (not_succ_le_self Ple)
|
||||||
|
end)
|
||||||
|
|
||||||
|
end fintype
|
|
@ -5,4 +5,4 @@ Authors: Leonardo de Moura
|
||||||
|
|
||||||
Finite type (type class).
|
Finite type (type class).
|
||||||
-/
|
-/
|
||||||
import data.fintype.basic data.fintype.function
|
import .basic .function .card
|
||||||
|
|
8
library/data/fintype/fintype.md
Normal file
8
library/data/fintype/fintype.md
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
data.fintype
|
||||||
|
============
|
||||||
|
|
||||||
|
Finite types.
|
||||||
|
|
||||||
|
* [basic](basic.lean)
|
||||||
|
* [function](function.lean)
|
||||||
|
* [card](card.lean)
|
Loading…
Reference in a new issue