@@ -7,6 +7,7 @@ import Mathlib.Algebra.Order.BigOperators.Group.Finset
77import Mathlib.Algebra.Order.Sub.Basic
88import Mathlib.Data.Finset.NAry
99import Mathlib.Data.Finset.Slice
10+ import Mathlib.SetTheory.Cardinal.Finite
1011
1112/-!
1213
@@ -29,42 +30,52 @@ size at least l.
2930
3031-/
3132
32- namespace Finset
3333
3434variable {α : Type *} [DecidableEq α]
3535
36- def IsIntersectingFamily (l : ℕ) (𝒜 : Finset (Finset α)) : Prop :=
36+ def IsIntersectingFamily (l : ℕ) (𝒜 : Set (Finset α)) : Prop :=
3737 ∀ a ∈ 𝒜, ∀ b ∈ 𝒜, l ≤ (a ∩ b).card
3838
39- theorem IsIntersectingFamily.le_of_sized {l r : ℕ} {𝒜 : Finset (Finset α)}
40- (sized : 𝒜.toSet.Sized r) (inter : IsIntersectingFamily l 𝒜)
39+ namespace Finset
40+
41+ theorem IsIntersectingFamily.le_of_sized {l r : ℕ} {𝒜 : Set (Finset α)}
42+ (sized : 𝒜.Sized r) (inter : IsIntersectingFamily l 𝒜)
4143 (nonempty : Nonempty 𝒜) : l ≤ r := by
4244 obtain ⟨x, x_in_𝒜⟩ := nonempty
43- rw [← sized x_in_𝒜, ← inter_self x]
45+ rw [← sized x_in_𝒜, ← Finset. inter_self x]
4446 exact inter x x_in_𝒜 x x_in_𝒜
4547
4648variable [Fintype α]
4749
48- theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset α)} (sized𝒜 : @Set.Sized α r 𝒜)
49- (inter : IsIntersectingFamily l 𝒜) (n_much_bigger_r :2 ^ (3 * r) * r * r+ 5 * r ≤ Fintype.card α):
50- #𝒜 ≤ ((Fintype.card α)-l).choose (r-l) := by
51- obtain rfl | ⟨el,el_in_𝒜⟩ := 𝒜.eq_empty_or_nonempty
50+ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Set (Finset α)}
51+ (sized𝒜 : Set.Sized r 𝒜) (inter : IsIntersectingFamily l 𝒜)
52+ (n_much_bigger_r :2 ^ (3 * r) * r * r+ 5 * r ≤ Fintype.card α):
53+ Nat.card 𝒜 ≤ ((Fintype.card α)-l).choose (r-l) := by
54+ have fin : Fintype 𝒜 := Fintype.ofFinite ↑𝒜
55+ let ℬ := 𝒜.toFinset
56+ have 𝒜_eq_ℬ_toSet : ℬ.toSet = 𝒜 := by simp [ℬ]
57+ have sizedℬ : @Set.Sized α r ℬ := by rwa [𝒜_eq_ℬ_toSet]
58+ have interℬ : IsIntersectingFamily l ℬ.toSet := by rwa [𝒜_eq_ℬ_toSet]
59+ simp [←𝒜_eq_ℬ_toSet]
60+ clear_value ℬ
61+ clear! 𝒜
62+ obtain rfl | ⟨el,el_in_ℬ⟩ := ℬ.eq_empty_or_nonempty
5263 . simp only [card_empty, zero_le]
53- have l_le_r := inter .le_of_sized sized𝒜 ⟨el, el_in_𝒜 ⟩
54- simp [Set.Sized] at sized𝒜
64+ have l_le_r := IsIntersectingFamily .le_of_sized sizedℬ interℬ ⟨el, el_in_ℬ ⟩
65+ simp [Set.Sized] at sizedℬ
5566 have r_le_card_α := card_le_card (subset_univ el)
56- rw [sized𝒜 el_in_𝒜 ,card_univ] at r_le_card_α
67+ rw [sizedℬ el_in_ℬ ,card_univ] at r_le_card_α
5768 induction l_le_r using Nat.decreasingInduction with
5869 | self =>
5970 simp only [tsub_self, Nat.choose_zero_right, ge_iff_le,card_le_one_iff]
60- intro a b a_in_𝒜 b_in_𝒜
71+ intro a b a_in_ℬ b_in_ℬ
6172 suffices a_cap_b_eq_a : a ∩ b = a from by
6273 apply eq_of_subset_of_card_le (inter_eq_left.mp a_cap_b_eq_a)
63- simp [(sized𝒜 a_in_𝒜 ),(sized𝒜 b_in_𝒜 )]
64- simp [(eq_of_subset_of_card_le inter_subset_left),(sized𝒜 a_in_𝒜 ),(sized𝒜 b_in_𝒜 ),
65- (inter a a_in_𝒜 b b_in_𝒜 )]
74+ simp [(sizedℬ a_in_ℬ ),(sizedℬ b_in_ℬ )]
75+ simp [(eq_of_subset_of_card_le inter_subset_left),(sizedℬ a_in_ℬ ),(sizedℬ b_in_ℬ ),
76+ (interℬ a a_in_ℬ b b_in_ℬ )]
6677 | of_succ k k_leq_r ind =>
67- by_cases inter_succ_k : IsIntersectingFamily (k + 1 ) 𝒜
78+ by_cases inter_succ_k : IsIntersectingFamily (k + 1 ) ℬ.toSet
6879 . calc
6980 _ ≤ (Fintype.card α - (k + 1 )).choose (r - (k + 1 )) := ind inter_succ_k
7081 _ = (Fintype.card α - (k + 1 )).choose (Fintype.card α - (k + 1 ) - (r - (k + 1 ))) := by
@@ -76,51 +87,51 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
7687 rw [Nat.choose_symm];omega
7788 _ = (Fintype.card α - k).choose (r - k) := by congr 1 ; omega
7889 simp [IsIntersectingFamily] at inter_succ_k
79- obtain ⟨A₁,A₁_in_𝒜 ,A₂,A₂_in_𝒜 ,card_x₁_x₂⟩ := inter_succ_k
80- have k_le_inter := inter A₁ A₁_in_𝒜 A₂ A₂_in_𝒜
90+ obtain ⟨A₁,A₁_in_ℬ ,A₂,A₂_in_ℬ ,card_x₁_x₂⟩ := inter_succ_k
91+ have k_le_inter := interℬ A₁ A₁_in_ℬ A₂ A₂_in_ℬ
8192 have inter_eq_k : #(A₁ ∩ A₂) = k :=
82- Eq.symm (Nat.le_antisymm (inter A₁ A₁_in_𝒜 A₂ A₂_in_𝒜 ) (Nat.lt_succ.mp card_x₁_x₂))
83- by_cases s_eq_inter_all : ∃ s , (k ≤ #s) ∧ (∀a∈𝒜 , s ⊆ a)
93+ Eq.symm (Nat.le_antisymm (interℬ A₁ A₁_in_ℬ A₂ A₂_in_ℬ ) (Nat.lt_succ.mp card_x₁_x₂))
94+ by_cases s_eq_inter_all : ∃ s , (k ≤ #s) ∧ (∀a∈ℬ , s ⊆ a)
8495 . obtain ⟨s,_,s_inter_a⟩ := s_eq_inter_all
85- have card𝒜_eq_cardℬ : #(image (·\s) 𝒜 ) = #𝒜 := by
96+ have cardℬ_eq_cardℬ : #(image (·\s) ℬ ) = #ℬ := by
8697 refine card_image_iff.mpr ?_
8798 simp [Set.InjOn]
88- intro x₁ x₁_in_𝒜 x₂ x₂_in_𝒜 x₁_sub_eq_x₂_sub
99+ intro x₁ x₁_in_ℬ x₂ x₂_in_ℬ x₁_sub_eq_x₂_sub
89100 ext a
90101 by_cases a_in_s:a∈s
91- . exact (iff_true_right (s_inter_a x₂ x₂_in_𝒜 a_in_s)).mpr (s_inter_a x₁ x₁_in_𝒜 a_in_s)
92- . have a_x_iff_a_in_mp : ∀ x∈𝒜 , a∈x ↔ a ∈ ((·\s) x) := by
102+ . exact (iff_true_right (s_inter_a x₂ x₂_in_ℬ a_in_s)).mpr (s_inter_a x₁ x₁_in_ℬ a_in_s)
103+ . have a_x_iff_a_in_mp : ∀ x∈ℬ , a∈x ↔ a ∈ ((·\s) x) := by
93104 simp only [mem_sdiff, iff_self_and]
94105 exact fun x a_1 a ↦ a_in_s
95- rw [(a_x_iff_a_in_mp x₁ x₁_in_𝒜 ),(a_x_iff_a_in_mp x₂ x₂_in_𝒜 )]
106+ rw [(a_x_iff_a_in_mp x₁ x₁_in_ℬ ),(a_x_iff_a_in_mp x₂ x₂_in_ℬ )]
96107 exact Eq.to_iff (congrFun (congrArg Membership.mem x₁_sub_eq_x₂_sub) a)
97- have sized_ℬ : (image (·\s) 𝒜 ) ⊆ powersetCard (r-#s) (univ\s) := by
108+ have sized_ℬ : (image (·\s) ℬ ) ⊆ powersetCard (r-#s) (univ\s) := by
98109 simp [powersetCard,subset_iff]
99- intro x x_in_𝒜
110+ intro x x_in_ℬ
100111 exists ((·\s) x).1
101112 simp only [card_val, exists_prop, and_true]
102113 constructor
103114 simp only [sdiff_val]
104115 refine Multiset.sub_le_sub_right ?_
105116 simp
106117 rw [card_sdiff]
107- exact congrFun (congrArg HSub.hSub (sized𝒜 x_in_𝒜 )) #s
108- exact s_inter_a x x_in_𝒜
109- rw [←card𝒜_eq_cardℬ ]
118+ exact congrFun (congrArg HSub.hSub (sizedℬ x_in_ℬ )) #s
119+ exact s_inter_a x x_in_ℬ
120+ rw [←cardℬ_eq_cardℬ ]
110121 apply le_trans (card_le_card sized_ℬ)
111122 simp [card_sdiff]
112123 rw [←Nat.choose_symm]
113124 nth_rw 2 [←Nat.choose_symm]
114125 have _ : #s ≤ r := by
115- rw [←(sized𝒜 el_in_𝒜 )]
116- exact card_le_card (s_inter_a el el_in_𝒜 )
126+ rw [←(sizedℬ el_in_ℬ )]
127+ exact card_le_card (s_inter_a el el_in_ℬ )
117128 have α_sub_s_sub_r_sub_s_ : Fintype.card α - #s - (r - #s) = Fintype.card α - r := by omega
118129 have α_sub_k_sub_r_sub_k_ : Fintype.card α - k - (r - k) = Fintype.card α - r := by omega
119130 rw [α_sub_s_sub_r_sub_s_,α_sub_k_sub_r_sub_k_]
120131 refine Nat.choose_le_choose (Fintype.card α - r) ?_
121132 all_goals omega
122133 simp at s_eq_inter_all
123- have ⟨A₃,A₃_in_𝒜 ,A₃_prop⟩ := s_eq_inter_all (A₁ ∩ A₂) k_le_inter
134+ have ⟨A₃,A₃_in_ℬ ,A₃_prop⟩ := s_eq_inter_all (A₁ ∩ A₂) k_le_inter
124135 have inter_lt_k : #((A₁ ∩ A₂) ∩ A₃) < k := by
125136 by_contra k_le_inter₃
126137 simp [not_lt,←inter_eq_k,←(card_inter_add_card_sdiff (A₁ ∩ A₂) A₃)] at k_le_inter₃
@@ -131,18 +142,18 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
131142 calc
132143 #(A₁ ∪ (A₂ ∪ A₃)) ≤ #(A₁) + #(A₂ ∪ A₃) := card_union_le A₁ (A₂ ∪ A₃)
133144 _ ≤ #A₁ + (#A₂ + #A₃) := by gcongr; exact card_union_le ..
134- _ ≤ r + (r + r) := by gcongr <;> exact sized𝒜 ‹_›
145+ _ ≤ r + (r + r) := by gcongr <;> exact Nat.le_of_eq (sizedℬ ‹_›)
135146 _ = 3 * r := by omega
136147 have _ : k ≤ #U := by
137148 calc
138149 k ≤ r := by omega
139- _ = #A₁ := by rw [sized𝒜 A₁_in_𝒜 ]
150+ _ = #A₁ := by rw [sizedℬ A₁_in_ℬ ]
140151 _ ≤ #U := by apply card_le_card;simp [U]
141- have succ_k_le_inter_a_U : ∀ a ∈ 𝒜 , k + 1 ≤ #(a∩U) := by
152+ have succ_k_le_inter_a_U : ∀ a ∈ ℬ , k + 1 ≤ #(a∩U) := by
142153 by_contra! ex
143- obtain ⟨a,a_in_𝒜 ,a_inter_le_k⟩ := ex
154+ obtain ⟨a,a_in_ℬ ,a_inter_le_k⟩ := ex
144155 have k_le_inter_U : k ≤ #(a ∩ U) := by calc
145- k ≤ #(a ∩ A₁) := inter a a_in_𝒜 A₁ A₁_in_𝒜
156+ k ≤ #(a ∩ A₁) := interℬ a a_in_ℬ A₁ A₁_in_ℬ
146157 _ ≤ #(a ∩ U) := by
147158 apply card_le_card
148159 simp [U,inter_subset_inter]
@@ -157,7 +168,7 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
157168 simp [←card_inter_eq_k,card_le_card, inter_union_distrib_left]
158169 _ ≤ k + k - #(a ∩ A₁ ∪ (a ∩ A₂)) := by simp [inter_union_distrib_left]
159170 _ ≤ #(a ∩ A₁) + #(a ∩ A₂) - #(a ∩ A₁ ∪ (a ∩ A₂)) := by
160- gcongr <;> apply inter <;> trivial
171+ gcongr <;> apply interℬ <;> trivial
161172 _ = #((a ∩ A₁) ∩ (a ∩ A₂)) := Eq.symm (card_inter (a ∩ A₁) (a ∩ A₂))
162173 _ = #(a ∩ (A₁ ∩ A₂)) := by congr 1 ;exact Eq.symm (inter_inter_distrib_left a A₁ A₂)
163174 have k_lt_k:= calc
@@ -170,7 +181,7 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
170181 nth_rw 2 [inter_comm]
171182 exact inter_subset_right
172183 _ ≤ #(a ∩ A₃) + #(a ∩ (A₁ ∩ A₂)) - #(a ∩ (A₃ ∩ (A₁ ∩ A₂))) := by
173- solve_by_elim [Nat.sub_le_sub_right, Nat.add_le_add (inter a a_in_𝒜 A₃ A₃_in_𝒜 )]
184+ solve_by_elim [Nat.sub_le_sub_right, Nat.add_le_add (interℬ a a_in_ℬ A₃ A₃_in_ℬ )]
174185 _ = #(a ∩ A₃) + #(a ∩ (A₁ ∩ A₂))- #(a ∩ A₃ ∩ (a ∩ (A₁ ∩ A₂))) := by
175186 congr 2
176187 rw [inter_inter_distrib_left]
@@ -183,20 +194,20 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
183194 apply_rules [inter_subset_inter_left, union_subset_union_left, inter_subset_union]
184195 _ ≤ k := Nat.le_of_lt_succ a_inter_le_k
185196 simp [GT.gt] at k_lt_k
186- have card_𝒜_leq_prod : #𝒜 ≤ #U.powerset * #{p : Finset α| ∃ a ∈𝒜 , a\U = p} := by
197+ have card_ℬ_leq_prod : #ℬ ≤ #U.powerset * #{p : Finset α| ∃ a ∈ℬ , a\U = p} := by
187198 let fn : (Finset α) → (Finset α) → (Finset α) := fun a b ↦ a ∪ b
188- rw [←((@card_image₂_iff _ _ _ _ fn U.powerset {p : Finset α| ∃ a ∈𝒜 , a\U = p}).mpr ?_)]
199+ rw [←((@card_image₂_iff _ _ _ _ fn U.powerset {p : Finset α| ∃ a ∈ℬ , a\U = p}).mpr ?_)]
189200 apply card_le_card
190201 rw [subset_iff]
191- intro x x_in_𝒜
202+ intro x x_in_ℬ
192203 simp [fn]
193204 exists x∩U
194205 simp
195206 exists x
196207 rw [union_comm,sdiff_union_inter]
197- simp [x_in_𝒜 ]
208+ simp [x_in_ℬ ]
198209 simp [Set.InjOn,fn]
199- intro a b a_in_U x x_in_𝒜 x_minus_U_eq_b a' b' a'_in_U x' x'_in_𝒜 x'_minus_U_eq_b cup_eq
210+ intro a b a_in_U x x_in_ℬ x_minus_U_eq_b a' b' a'_in_U x' x'_in_ℬ x'_minus_U_eq_b cup_eq
200211 constructor
201212 . have a_cup_b_cap_u_eq_a : (a ∪ b) ∩ U = a := by
202213 rw [←x_minus_U_eq_b,inter_comm,inter_union_distrib_left]
@@ -212,18 +223,18 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
212223 rw [union_sdiff_distrib,←x'_minus_U_eq_b,(sdiff_eq_empty_iff_subset).mpr a'_in_U]
213224 simp
214225 rw [←a_cup_b_sdiff_u_eq_a,←a'_cup_b'_sdiff_u_eq_a',cup_eq]
215- have card_filt_le_chooce : #(filter (fun p ↦ ∃ a ∈ 𝒜 , a \ U = p) univ)
226+ have card_filt_le_chooce : #(filter (fun p ↦ ∃ a ∈ ℬ , a \ U = p) univ)
216227 ≤ (Fintype.card α - #(U)).choose (r - (k + 1 )) * r := by
217228 calc
218- #{p | ∃ a ∈ 𝒜 , a \ U = p}
229+ #{p | ∃ a ∈ ℬ , a \ U = p}
219230 ≤ #((range (r - k)).biUnion fun n' ↦ powersetCard n' (univ \ U)) := card_le_card ?_
220231 _ ≤ (Fintype.card α - #U).choose (r - (k + 1 )) * (r - k) := ?_
221232 _ ≤ (Fintype.card α - #U).choose (r - (k + 1 )) * r := by apply Nat.mul_le_mul_left;omega
222233 . simp [subset_iff]
223- intro a a_in_𝒜
224- rw [←sized𝒜 a_in_𝒜 ,←card_sdiff_add_card_inter a U,Nat.lt_sub_iff_add_lt]
234+ intro a a_in_ℬ
235+ rw [←sizedℬ a_in_ℬ ,←card_sdiff_add_card_inter a U,Nat.lt_sub_iff_add_lt]
225236 apply Nat.add_lt_add_left
226- exact succ_k_le_inter_a_U a a_in_𝒜
237+ exact succ_k_le_inter_a_U a a_in_ℬ
227238 . rw [mul_comm]
228239 nth_rw 2 [←card_range (r-k)]
229240 apply card_biUnion_le_card_mul
@@ -237,8 +248,8 @@ theorem IsIntersectingFamily.card_le_of_sized {l r:ℕ} {𝒜 : Finset (Finset
237248 have _ := @Nat.choose_le_succ_of_lt_half_left lvl' (Fintype.card α - #U) ?_
238249 all_goals omega
239250 calc
240- #𝒜 ≤ #U.powerset * #(filter (fun p ↦ ∃ a ∈ 𝒜 , a \ U = p) univ) := card_𝒜_leq_prod
241- _ ≤ 2 ^ #U * #(filter (fun p ↦ ∃ a ∈ 𝒜 , a \ U = p) univ) := by
251+ #ℬ ≤ #U.powerset * #(filter (fun p ↦ ∃ a ∈ ℬ , a \ U = p) univ) := card_ℬ_leq_prod
252+ _ ≤ 2 ^ #U * #(filter (fun p ↦ ∃ a ∈ ℬ , a \ U = p) univ) := by
242253 simp only [card_powerset, le_refl, U]
243254 _ ≤ 2 ^ #U * ((Fintype.card α - #U).choose (r-(k+1 )) * r) := by gcongr
244255 _ ≤ 2 ^ #U * ((Fintype.card α - k).choose (r-(k+1 )) * r) := by
0 commit comments