@@ -267,6 +267,10 @@ end set
267
267
lemma finset.card_univ [fintype α] : (finset.univ : finset α).card = fintype.card α :=
268
268
rfl
269
269
270
+ lemma finset.eq_univ_of_card [fintype α] (s : finset α) (hs : s.card = fintype.card α) :
271
+ s = univ :=
272
+ eq_of_subset_of_card_le (subset_univ _) $ by rw [hs, finset.card_univ]
273
+
270
274
lemma finset.card_le_univ [fintype α] (s : finset α) :
271
275
s.card ≤ fintype.card α :=
272
276
card_le_of_subset (subset_univ s)
@@ -430,75 +434,73 @@ instance (α : Type u) (β : Type v) [fintype α] [fintype β] : fintype (α ⊕
430
434
((equiv.sum_equiv_sigma_bool _ _).symm.trans
431
435
(equiv.sum_congr equiv.ulift equiv.ulift))
432
436
433
- lemma fintype.card_le_of_injective [fintype α] [fintype β] (f : α → β)
434
- (hf : function.injective f) : fintype.card α ≤ fintype.card β :=
437
+ namespace fintype
438
+ variables [fintype α] [fintype β]
439
+
440
+ lemma card_le_of_injective (f : α → β) (hf : function.injective f) : card α ≤ card β :=
435
441
finset.card_le_card_of_inj_on f (λ _ _, finset.mem_univ _) (λ _ _ _ _ h, hf h)
436
442
437
- lemma fintype. card_eq_one_iff [fintype α] : fintype. card α = 1 ↔ (∃ x : α, ∀ y, y = x) :=
438
- by rw [← fintype. card_unit, fintype. card_eq]; exact
443
+ lemma card_eq_one_iff : card α = 1 ↔ (∃ x : α, ∀ y, y = x) :=
444
+ by rw [← card_unit, card_eq]; exact
439
445
⟨λ ⟨a⟩, ⟨a.symm (), λ y, a.injective (subsingleton.elim _ _)⟩,
440
446
λ ⟨x, hx⟩, ⟨⟨λ _, (), λ _, x, λ _, (hx _).trans (hx _).symm,
441
447
λ _, subsingleton.elim _ _⟩⟩⟩
442
448
443
- lemma fintype. card_eq_zero_iff [fintype α] : fintype. card α = 0 ↔ (α → false) :=
444
- ⟨λ h a, have e : α ≃ empty := classical.choice (fintype. card_eq.1 (by simp [h])), (e a).elim,
449
+ lemma card_eq_zero_iff : card α = 0 ↔ (α → false) :=
450
+ ⟨λ h a, have e : α ≃ empty := classical.choice (card_eq.1 (by simp [h])), (e a).elim,
445
451
λ h, have e : α ≃ empty := ⟨λ a, (h a).elim, λ a, a.elim, λ a, (h a).elim, λ a, a.elim⟩,
446
- by simp [fintype. card_congr e]⟩
452
+ by simp [card_congr e]⟩
447
453
448
454
/-- A `fintype` with cardinality zero is (constructively) equivalent to `pempty`. -/
449
- def fintype. card_eq_zero_equiv_equiv_pempty {α : Type v} [fintype α] :
450
- fintype. card α = 0 ≃ (α ≃ pempty.{v+1 }) :=
455
+ def card_eq_zero_equiv_equiv_pempty :
456
+ card α = 0 ≃ (α ≃ pempty.{v+1 }) :=
451
457
{ to_fun := λ h,
452
- { to_fun := λ a, false.elim (fintype. card_eq_zero_iff.1 h a),
458
+ { to_fun := λ a, false.elim (card_eq_zero_iff.1 h a),
453
459
inv_fun := λ a, pempty.elim a,
454
- left_inv := λ a, false.elim (fintype. card_eq_zero_iff.1 h a),
460
+ left_inv := λ a, false.elim (card_eq_zero_iff.1 h a),
455
461
right_inv := λ a, pempty.elim a, },
456
462
inv_fun := λ e,
457
- by { simp only [←fintype. of_equiv_card e], convert fintype. card_pempty, },
463
+ by { simp only [←of_equiv_card e], convert card_pempty, },
458
464
left_inv := λ h, rfl,
459
465
right_inv := λ e, by { ext x, cases e x, } }
460
466
461
- lemma fintype. card_pos_iff [fintype α] : 0 < fintype. card α ↔ nonempty α :=
467
+ lemma card_pos_iff : 0 < card α ↔ nonempty α :=
462
468
⟨λ h, classical.by_contradiction (λ h₁,
463
- have fintype. card α = 0 := fintype. card_eq_zero_iff.2 (λ a, h₁ ⟨a⟩),
469
+ have card α = 0 := card_eq_zero_iff.2 (λ a, h₁ ⟨a⟩),
464
470
lt_irrefl 0 $ by rwa this at h),
465
- λ ⟨a⟩, nat.pos_of_ne_zero (mt fintype. card_eq_zero_iff.1 (λ h, h a))⟩
471
+ λ ⟨a⟩, nat.pos_of_ne_zero (mt card_eq_zero_iff.1 (λ h, h a))⟩
466
472
467
- lemma fintype. card_le_one_iff [fintype α] : fintype. card α ≤ 1 ↔ (∀ a b : α, a = b) :=
468
- let n := fintype. card α in
469
- have hn : n = fintype. card α := rfl,
473
+ lemma card_le_one_iff : card α ≤ 1 ↔ (∀ a b : α, a = b) :=
474
+ let n := card α in
475
+ have hn : n = card α := rfl,
470
476
match n, hn with
471
- | 0 := λ ha, ⟨λ h, λ a, (fintype. card_eq_zero_iff.1 ha.symm a).elim, λ _, ha ▸ nat.le_succ _⟩
472
- | 1 := λ ha, ⟨λ h, λ a b, let ⟨x, hx⟩ := fintype. card_eq_one_iff.1 ha.symm in
477
+ | 0 := λ ha, ⟨λ h, λ a, (card_eq_zero_iff.1 ha.symm a).elim, λ _, ha ▸ nat.le_succ _⟩
478
+ | 1 := λ ha, ⟨λ h, λ a b, let ⟨x, hx⟩ := card_eq_one_iff.1 ha.symm in
473
479
by rw [hx a, hx b],
474
480
λ _, ha ▸ le_refl _⟩
475
481
| (n+2 ) := λ ha, ⟨λ h, by rw ← ha at h; exact absurd h dec_trivial,
476
- (λ h, fintype. card_unit ▸ fintype. card_le_of_injective (λ _, ())
482
+ (λ h, card_unit ▸ card_le_of_injective (λ _, ())
477
483
(λ _ _ _, h _ _))⟩
478
484
end
479
485
480
- lemma fintype.card_le_one_iff_subsingleton [fintype α] :
481
- fintype.card α ≤ 1 ↔ subsingleton α :=
482
- iff.trans fintype.card_le_one_iff subsingleton_iff.symm
486
+ lemma card_le_one_iff_subsingleton : card α ≤ 1 ↔ subsingleton α :=
487
+ iff.trans card_le_one_iff subsingleton_iff.symm
483
488
484
- lemma fintype.one_lt_card_iff_nontrivial [fintype α] :
485
- 1 < fintype.card α ↔ nontrivial α :=
489
+ lemma one_lt_card_iff_nontrivial : 1 < card α ↔ nontrivial α :=
486
490
begin
487
491
classical,
488
492
rw ← not_iff_not,
489
493
push_neg,
490
- rw [not_nontrivial_iff_subsingleton, fintype. card_le_one_iff_subsingleton]
494
+ rw [not_nontrivial_iff_subsingleton, card_le_one_iff_subsingleton]
491
495
end
492
496
493
- lemma fintype.exists_ne_of_one_lt_card [fintype α] (h : 1 < fintype.card α) (a : α) :
494
- ∃ b : α, b ≠ a :=
495
- by { haveI : nontrivial α := fintype.one_lt_card_iff_nontrivial.1 h, exact exists_ne a }
497
+ lemma exists_ne_of_one_lt_card (h : 1 < card α) (a : α) : ∃ b : α, b ≠ a :=
498
+ by { haveI : nontrivial α := one_lt_card_iff_nontrivial.1 h, exact exists_ne a }
496
499
497
- lemma fintype.exists_pair_of_one_lt_card [fintype α] (h : 1 < fintype.card α) :
498
- ∃ (a b : α), a ≠ b :=
499
- by { haveI : nontrivial α := fintype.one_lt_card_iff_nontrivial.1 h, exact exists_pair_ne α }
500
+ lemma exists_pair_of_one_lt_card (h : 1 < card α) : ∃ (a b : α), a ≠ b :=
501
+ by { haveI : nontrivial α := one_lt_card_iff_nontrivial.1 h, exact exists_pair_ne α }
500
502
501
- lemma fintype. injective_iff_surjective [fintype α] {f : α → α} : injective f ↔ surjective f :=
503
+ lemma injective_iff_surjective {f : α → α} : injective f ↔ surjective f :=
502
504
by haveI := classical.prop_decidable; exact
503
505
have ∀ {f : α → α}, injective f → surjective f,
504
506
from λ f hinj x,
@@ -511,20 +513,58 @@ from λ f hinj x,
511
513
⟨surj_inv hsurj, left_inverse_of_surjective_of_right_inverse
512
514
(this (injective_surj_inv _)) (right_inverse_surj_inv _)⟩⟩
513
515
514
- lemma fintype. injective_iff_bijective [fintype α] {f : α → α} : injective f ↔ bijective f :=
515
- by simp [bijective, fintype. injective_iff_surjective]
516
+ lemma injective_iff_bijective {f : α → α} : injective f ↔ bijective f :=
517
+ by simp [bijective, injective_iff_surjective]
516
518
517
- lemma fintype. surjective_iff_bijective [fintype α] {f : α → α} : surjective f ↔ bijective f :=
518
- by simp [bijective, fintype. injective_iff_surjective]
519
+ lemma surjective_iff_bijective {f : α → α} : surjective f ↔ bijective f :=
520
+ by simp [bijective, injective_iff_surjective]
519
521
520
- lemma fintype. injective_iff_surjective_of_equiv [fintype α] {f : α → β} (e : α ≃ β) :
522
+ lemma injective_iff_surjective_of_equiv {β : Type *} {f : α → β} (e : α ≃ β) :
521
523
injective f ↔ surjective f :=
522
- have injective (e.symm ∘ f) ↔ surjective (e.symm ∘ f), from fintype. injective_iff_surjective,
524
+ have injective (e.symm ∘ f) ↔ surjective (e.symm ∘ f), from injective_iff_surjective,
523
525
⟨λ hinj, by simpa [function.comp] using
524
526
e.surjective.comp (this.1 (e.symm.injective.comp hinj)),
525
527
λ hsurj, by simpa [function.comp] using
526
528
e.injective.comp (this.2 (e.symm.surjective.comp hsurj))⟩
527
529
530
+ lemma nonempty_equiv_of_card_eq (h : card α = card β) :
531
+ nonempty (α ≃ β) :=
532
+ begin
533
+ obtain ⟨m, ⟨f⟩⟩ := exists_equiv_fin α,
534
+ obtain ⟨n, ⟨g⟩⟩ := exists_equiv_fin β,
535
+ suffices : m = n,
536
+ { subst this , exact ⟨f.trans g.symm⟩ },
537
+ calc m = card (fin m) : (card_fin m).symm
538
+ ... = card α : card_congr f.symm
539
+ ... = card β : h
540
+ ... = card (fin n) : card_congr g
541
+ ... = n : card_fin n
542
+ end
543
+
544
+ lemma bijective_iff_injective_and_card (f : α → β) :
545
+ bijective f ↔ injective f ∧ card α = card β :=
546
+ begin
547
+ split,
548
+ { intro h, exact ⟨h.1 , card_congr (equiv.of_bijective f h)⟩ },
549
+ { rintro ⟨hf, h⟩,
550
+ refine ⟨hf, _⟩,
551
+ obtain ⟨e⟩ : nonempty (α ≃ β) := nonempty_equiv_of_card_eq h,
552
+ rwa ← injective_iff_surjective_of_equiv e }
553
+ end
554
+
555
+ lemma bijective_iff_surjective_and_card (f : α → β) :
556
+ bijective f ↔ surjective f ∧ card α = card β :=
557
+ begin
558
+ split,
559
+ { intro h, exact ⟨h.2 , card_congr (equiv.of_bijective f h)⟩, },
560
+ { rintro ⟨hf, h⟩,
561
+ refine ⟨_, hf⟩,
562
+ obtain ⟨e⟩ : nonempty (α ≃ β) := nonempty_equiv_of_card_eq h,
563
+ rwa injective_iff_surjective_of_equiv e }
564
+ end
565
+
566
+ end fintype
567
+
528
568
lemma fintype.coe_image_univ [fintype α] [decidable_eq β] {f : α → β} :
529
569
↑(finset.image f finset.univ) = set.range f :=
530
570
by { ext x, simp }
@@ -940,7 +980,7 @@ section choose
940
980
open fintype
941
981
open equiv
942
982
943
- variables [decidable_eq α] [ fintype α] (p : α → Prop ) [decidable_pred p]
983
+ variables [fintype α] (p : α → Prop ) [decidable_pred p]
944
984
945
985
def choose_x (hp : ∃! a : α, p a) : {a // p a} :=
946
986
⟨finset.choose p univ (by simp; exact hp), finset.choose_property _ _ _⟩
@@ -955,8 +995,8 @@ end choose
955
995
section bijection_inverse
956
996
open function
957
997
958
- variables [decidable_eq α] [ fintype α]
959
- variables [decidable_eq β] [fintype β]
998
+ variables [fintype α]
999
+ variables [decidable_eq β]
960
1000
variables {f : α → β}
961
1001
962
1002
/-- `
0 commit comments