Skip to content

Commit ccd9f9b

Browse files
committed
some small fixs
1 parent e21c6f5 commit ccd9f9b

File tree

1 file changed

+64
-53
lines changed

1 file changed

+64
-53
lines changed

LeanCamCombi/PlainCombi/intersectingFamilies.lean

Lines changed: 64 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Mathlib.Algebra.Order.BigOperators.Group.Finset
77
import Mathlib.Algebra.Order.Sub.Basic
88
import Mathlib.Data.Finset.NAry
99
import 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

3434
variable {α : 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

4648
variable [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

Comments
 (0)