@@ -651,4 +651,67 @@ lt_of_not_ge $ λ ⟨F⟩, begin
651
651
hc i a (congr_fun h _),
652
652
end
653
653
654
+ theorem mk_le_mk_finset (α : Type u) : mk α ≤ mk (finset α) :=
655
+ ⟨⟨finset.singleton, λ _ _, finset.singleton_inj.1 ⟩⟩
656
+
657
+ theorem mk_finset_le_mk_list (α : Type u) : mk (finset α) ≤ mk (list α) :=
658
+ ⟨⟨quotient.out ∘ finset.val, λ x y H, finset.val_inj.1 $
659
+ calc x.1 = _ : (quotient.out_eq x.1 ).symm ... = _ : congr_arg _ H
660
+ ... = _ : quotient.out_eq y.1 ⟩⟩
661
+
662
+ def vector_equiv_fin_fn (α : Type u) (n : ℕ) : vector α n ≃ (ulift.{u 0 } (fin n) → α) :=
663
+ { to_fun := λ L i, vector.nth L i.down,
664
+ inv_fun := λ f, vector.of_fn (λ i, f (ulift.up i)),
665
+ left_inv := vector.of_fn_nth,
666
+ right_inv := λ f, funext (λ ⟨i⟩, vector.nth_of_fn _ i) }
667
+
668
+ theorem vector_equiv_fin_fn_length (α : Type u) (n : ℕ) (f : ulift (fin n) → α) :
669
+ ((vector_equiv_fin_fn α n).symm f).1 .length = n :=
670
+ ((vector_equiv_fin_fn α n).symm f).2
671
+
672
+ theorem mk_list_eq_sum_pow (α : Type u) : mk (list α) = sum (λ n : ℕ, (mk α)^(n:cardinal.{u})) :=
673
+ by conv {to_rhs, congr, funext, rw [← lift_mk_fin, lift_mk, power_def]};
674
+ rw [sum_mk]; from
675
+ (quotient.sound $ nonempty.intro $
676
+ { to_fun := λ L, ⟨L.length, vector_equiv_fin_fn α L.length ⟨L, rfl⟩⟩,
677
+ inv_fun := λ x, ((vector_equiv_fin_fn α x.1 ).symm x.2 ).to_list,
678
+ left_inv := λ L, by dsimp only; simp only [equiv.inverse_apply_apply]; refl,
679
+ right_inv := λ x, sigma.eq (vector_equiv_fin_fn_length _ _ _)
680
+ (begin dsimp only, generalize : rfl = H1,
681
+ generalize : vector_equiv_fin_fn_length α (x.fst) (x.snd) = H,
682
+ let N1 := ((vector_equiv_fin_fn α x.1 ).symm x.2 ).1 .length,
683
+ change N1 = _ at H1,
684
+ generalize_hyp : ((vector_equiv_fin_fn α x.1 ).symm x.2 ).1 .length = N3 at H H1 ⊢,
685
+ subst H,
686
+ simp only [vector.mk_to_list, equiv.apply_inverse_apply], end ) })
687
+
688
+ theorem mk_union_le_mk_mul_omega {α : Type u} {S : set α} {f : S → set α}
689
+ (hf : ∀ s, set.finite (f s)) : mk (⋃ s, f s) ≤ mk S * omega :=
690
+ ⟨⟨λ x, (classical.some (set.mem_Union.1 x.2 ),
691
+ (classical.choice (le_of_lt $ lt_omega_iff_finite.2 $ (hf $ classical.some (set.mem_Union.1 x.2 )))).1
692
+ ⟨x.1 , classical.some_spec (set.mem_Union.1 x.2 )⟩),
693
+ λ x y H, subtype.eq $ begin
694
+ cases prod.ext_iff.1 H with H1 H2, clear H,
695
+ dsimp only at H1 H2,
696
+ generalize_hyp : set.mem_Union.1 x.2 = H3 at H1 H2,
697
+ generalize_hyp : hf (classical.some H3) = H5 at H2,
698
+ generalize_hyp : classical.some_spec H3 = H7 at H2,
699
+ generalize_hyp : classical.some H3 = i at H1 H2 H5 H7,
700
+ subst H1,
701
+ exact subtype.mk.inj (function.embedding.inj _ H2)
702
+ end ⟩⟩
703
+
704
+ theorem mk_le_mk_of_finset_card_to_finset_le {α : Type u} {S T : set α}
705
+ {HS : set.finite S} {HT : set.finite T}
706
+ (H : finset.card (set.finite.to_finset HS) ≤ finset.card (set.finite.to_finset HT)) :
707
+ mk S ≤ mk T :=
708
+ begin
709
+ tactic.unfreeze_local_instances,
710
+ cases HS, cases HT,
711
+ rw [fintype_card, fintype_card, nat_cast_le],
712
+ rw [← fintype.card_coe, ← fintype.card_coe] at H,
713
+ convert H;
714
+ { ext z, rw [finset.mem_coe, set.finite.mem_to_finset] }
715
+ end
716
+
654
717
end cardinal
0 commit comments