feat(library/data/finset/{basic,card,comb}.lean: add theorems, including card of an injective image

This commit is contained in:
Jeremy Avigad 2015-05-10 20:07:03 +10:00 committed by Leonardo de Moura
parent 95dae11670
commit a009cf24e3
4 changed files with 81 additions and 5 deletions

View file

@ -463,6 +463,12 @@ quot.induction_on₂ s₁ s₂ (λ l₁ l₂ h₁ h₂, h₁ a h₂)
theorem subset_of_forall {s₁ s₂ : finset A} : (∀x, x ∈ s₁ → x ∈ s₂) → s₁ ⊆ s₂ :=
quot.induction_on₂ s₁ s₂ (λ l₁ l₂ H, H)
theorem subset_insert [h : decidable_eq A] (s : finset A) (a : A) : s ⊆ insert a s :=
subset_of_forall (take x, assume H : x ∈ s, mem_insert_of_mem _ H)
theorem eq_of_subset_of_subset {s₁ s₂ : finset A} (H₁ : s₁ ⊆ s₂) (H₂ : s₂ ⊆ s₁) : s₁ = s₂ :=
ext (take x, iff.intro (assume H, mem_of_subset_of_mem H₁ H) (assume H, mem_of_subset_of_mem H₂ H))
/- upto -/
section upto
definition upto (n : nat) : finset nat :=

View file

@ -5,14 +5,14 @@ Author: Jeremy Avigad
Cardinality calculations for finite sets.
-/
import data.finset.comb
import data.finset.to_set data.set.function
open nat eq.ops
namespace finset
variable {A : Type}
variable [deceq : decidable_eq A]
include deceq
variables {A B : Type}
variables [deceqA : decidable_eq A] [deceqB : decidable_eq B]
include deceqA
theorem card_add_card (s₁ s₂ : finset A) : card s₁ + card s₂ = card (s₁ s₂) + card (s₁ ∩ s₂) :=
finset.induction_on s₂
@ -58,4 +58,34 @@ calc
... = card s₁ + card (s₂ \ s₁) : card_union_of_disjoint H1
... ≥ card s₁ : le_add_right
section card_image
open set
include deceqB
theorem card_image_eq_of_inj_on {f : A → B} {s : finset A} :
inj_on f (ts s) → card (image f s) = card s :=
finset.induction_on s
(assume H : inj_on f (ts empty), calc
card (image f empty) = 0 : card_empty
... = card empty : card_empty)
(take t a,
assume H : a ∉ t,
assume IH : inj_on f (ts t) → card (image f t) = card t,
assume H1 : inj_on f (ts (insert a t)),
have H2 : ts t ⊆ ts (insert a t), by rewrite [-subset_eq_to_set_subset]; apply subset_insert,
have H3 : card (image f t) = card t, from IH (inj_on_of_inj_on_of_subset H1 H2),
have H4 : f a ∉ image f t,
proof
assume H5 : f a ∈ image f t,
obtain x (H6 : x ∈ t ∧ f x = f a), from exists_of_mem_image H5,
have H7 : x = a, from H1 (mem_insert_of_mem _ (and.left H6)) !mem_insert (and.right H6),
show false, from H (H7 ▸ and.left H6)
qed,
calc
card (image f (insert a t)) = card (insert (f a) (image f t)) : image_insert
... = card (image f t) + 1 : card_insert_of_not_mem H4
... = card t + 1 : H3
... = card (insert a t) : card_insert_of_not_mem H)
end card_image
end finset

View file

@ -27,6 +27,11 @@ rfl
theorem mem_image_of_mem (f : A → B) {s : finset A} {a : A} : a ∈ s → f a ∈ image f s :=
quot.induction_on s (take l, assume H : a ∈ elt_of l, mem_to_finset (mem_map f H))
theorem mem_image_of_mem_of_eq {f : A → B} {s : finset A} {a : A} {b : B}
(H1 : a ∈ s) (H2 : f a = b) :
b ∈ image f s :=
eq.subst H2 (mem_image_of_mem f H1)
theorem exists_of_mem_image {f : A → B} {s : finset A} {b : B} :
b ∈ image f s → ∃a, a ∈ s ∧ f a = b :=
quot.induction_on s
@ -37,10 +42,39 @@ theorem mem_image_iff (f : A → B) {s : finset A} {y : B} : y ∈ image f s ↔
iff.intro exists_of_mem_image
(assume H,
obtain x (H1 : x ∈ s ∧ f x = y), from H,
eq.subst (and.right H1) (mem_image_of_mem f (and.left H1)))
mem_image_of_mem_of_eq (and.left H1) (and.right H1))
theorem mem_image_eq (f : A → B) {s : finset A} {y : B} : y ∈ image f s = ∃x, x ∈ s ∧ f x = y :=
propext (mem_image_iff f)
theorem mem_image_of_mem_image_of_subset {f : A → B} {s t : finset A} {y : B}
(H1 : y ∈ image f s) (H2 : s ⊆ t) : y ∈ image f t :=
obtain x (H3: x ∈ s ∧ f x = y), from exists_of_mem_image H1,
have H4 : x ∈ t, from mem_of_subset_of_mem H2 (and.left H3),
show y ∈ image f t, from mem_image_of_mem_of_eq H4 (and.right H3)
theorem image_insert [h' : decidable_eq A] (f : A → B) (s : finset A) (a : A) :
image f (insert a s) = insert (f a) (image f s) :=
ext (take y, iff.intro
(assume H : y ∈ image f (insert a s),
obtain x (H1 : x ∈ insert a s ∧ f x = y), from exists_of_mem_image H,
have H2 : x = a x ∈ s, from eq_or_mem_of_mem_insert (and.left H1),
or.elim H2
(assume H3 : x = a,
have H4 : f a = y, from eq.subst H3 (and.right H1),
show y ∈ insert (f a) (image f s), from eq.subst H4 !mem_insert)
(assume H3 : x ∈ s,
have H4 : f x = y, from and.right H1,
have H5 : f x ∈ image f s, from mem_image_of_mem f H3,
show y ∈ insert (f a) (image f s), from eq.subst H4 (mem_insert_of_mem _ H5)))
(assume H : y ∈ insert (f a) (image f s),
have H1 : y = f a y ∈ image f s, from eq_or_mem_of_mem_insert H,
or.elim H1
(assume H2 : y = f a,
have H3 : f a ∈ image f (insert a s), from mem_image_of_mem f !mem_insert,
show y ∈ image f (insert a s), from eq.subst (eq.symm H2) H3)
(assume H2 : y ∈ image f s,
show y ∈ image f (insert a s), from mem_image_of_mem_image_of_subset H2 !subset_insert)))
end image
/- filter and set-builder notation -/

View file

@ -96,6 +96,12 @@ assume H1 : g (f x1) = g (f x2),
have H2 : f x1 = f x2, from Hg fx1b fx2b H1,
show x1 = x2, from Hf x1a x2a H2
theorem inj_on_of_inj_on_of_subset {f : X → Y} {a b : set X} (H1 : inj_on f b) (H2 : a ⊆ b) :
inj_on f a :=
take x1 x2 : X, assume (x1a : x1 ∈ a) (x2a : x2 ∈ a),
assume H : f x1 = f x2,
show x1 = x2, from H1 (H2 x1a) (H2 x2a) H
/- surjectivity -/
definition surj_on [reducible] (f : X → Y) (a : set X) (b : set Y) : Prop := b ⊆ f '[a]