Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit c4c2ed6

Browse files
committed
feat(order/sup_indep): More lemmas (#11932)
A few more lemmas about `finset.sup_indep` and `set.pairwise_disjoint`.
1 parent 5563b1b commit c4c2ed6

5 files changed

Lines changed: 185 additions & 10 deletions

File tree

src/data/finset/pairwise.lean

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,23 @@ lemma pairwise_disjoint.elim_finset {s : set ι} {f : ι → finset α}
3939
i = j :=
4040
hs.elim hi hj (finset.not_disjoint_iff.2 ⟨a, hai, haj⟩)
4141

42-
lemma pairwise_disjoint.image_finset_of_le [decidable_eq ι] [semilattice_inf α] [order_bot α]
43-
{s : finset ι} {f : ι → α} (hs : (s : set ι).pairwise_disjoint f) {g : ι → ι}
44-
(hf : ∀ a, f (g a) ≤ f a) :
42+
section semilattice_inf
43+
variables [semilattice_inf α] [order_bot α] {s : finset ι} {f : ι → α}
44+
45+
lemma pairwise_disjoint.image_finset_of_le [decidable_eq ι] {s : finset ι} {f : ι → α}
46+
(hs : (s : set ι).pairwise_disjoint f) {g : ι → ι} (hf : ∀ a, f (g a) ≤ f a) :
4547
(s.image g : set ι).pairwise_disjoint f :=
4648
begin
4749
rw coe_image,
4850
exact hs.image_of_le hf,
4951
end
5052

53+
lemma pairwise_disjoint.attach (hs : (s : set ι).pairwise_disjoint f) :
54+
(s.attach : set {x // x ∈ s}).pairwise_disjoint (f ∘ subtype.val) :=
55+
λ i _ j _ hij, hs i.2 j.2 $ mt subtype.ext_val hij
56+
57+
end semilattice_inf
58+
5159
variables [lattice α] [order_bot α]
5260

5361
/-- Bind operation for `set.pairwise_disjoint`. In a complete lattice, you can use

src/data/set/pairwise/basic.lean

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ The spelling `s.pairwise_disjoint id` is preferred over `s.pairwise disjoint` to
3030
on `set.pairwise_disjoint`, even though the latter unfolds to something nicer.
3131
-/
3232

33-
open set function
33+
open function order set
3434

3535
variables {α β γ ι ι' : Type*} {r p q : α → α → Prop}
3636

@@ -296,6 +296,8 @@ end semilattice_inf_bot
296296

297297
/-! ### Pairwise disjoint set of sets -/
298298

299+
variables {s : set ι} {t : set ι'}
300+
299301
lemma pairwise_disjoint_range_singleton :
300302
(set.range (singleton : ι → set ι)).pairwise_disjoint id :=
301303
begin
@@ -311,6 +313,18 @@ lemma pairwise_disjoint.elim_set {s : set ι} {f : ι → set α} (hs : s.pairwi
311313
(hi : i ∈ s) (hj : j ∈ s) (a : α) (hai : a ∈ f i) (haj : a ∈ f j) : i = j :=
312314
hs.elim hi hj $ not_disjoint_iff.2 ⟨a, hai, haj⟩
313315

316+
lemma pairwise_disjoint.prod {f : ι → set α} {g : ι' → set β} (hs : s.pairwise_disjoint f)
317+
(ht : t.pairwise_disjoint g) :
318+
(s ×ˢ t : set (ι × ι')).pairwise_disjoint (λ i, f i.1 ×ˢ g i.2) :=
319+
λ ⟨i, i'⟩ ⟨hi, hi'⟩ ⟨j, j'⟩ ⟨hj, hj'⟩ hij, disjoint_left.2 $ λ ⟨a, b⟩ ⟨hai, hbi⟩ ⟨haj, hbj⟩,
320+
hij $ prod.ext (hs.elim_set hi hj _ hai haj) $ ht.elim_set hi' hj' _ hbi hbj
321+
322+
lemma pairwise_disjoint_pi {ι' α : ι → Type*} {s : Π i, set (ι' i)} {f : Π i, ι' i → set (α i)}
323+
(hs : ∀ i, (s i).pairwise_disjoint (f i)) :
324+
((univ : set ι).pi s).pairwise_disjoint (λ I, (univ : set ι).pi (λ i, f _ (I i))) :=
325+
λ I hI J hJ hIJ, disjoint_left.2 $ λ a haI haJ, hIJ $ funext $ λ i,
326+
(hs i).elim_set (hI i trivial) (hJ i trivial) (a i) (haI i trivial) (haJ i trivial)
327+
314328
/-- The partial images of a binary function `f` whose partial evaluations are injective are pairwise
315329
disjoint iff `f` is injective . -/
316330
lemma pairwise_disjoint_image_right_iff {f : α → β → γ} {s : set α} {t : set β}

src/data/set/pairwise/lattice.lean

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ import data.set.pairwise.basic
1515
In this file we prove many facts about `pairwise` and the set lattice.
1616
-/
1717

18-
open set function
18+
open function set order
1919

20-
variables {α β γ ι ι' : Type*} {r p q : α → α → Prop}
20+
variables {α β γ ι ι' : Type*} {κ : Sort*} {r p q : α → α → Prop}
2121

2222
section pairwise
2323
variables {f g : ι → α} {s t u : set α} {a b : α}
2424

2525
namespace set
2626

27-
lemma pairwise_Union {f : ι → set α} (h : directed (⊆) f) :
27+
lemma pairwise_Union {f : κ → set α} (h : directed (⊆) f) :
2828
(⋃ n, f n).pairwise r ↔ ∀ n, (f n).pairwise r :=
2929
begin
3030
split,
@@ -60,7 +60,7 @@ pairwise_sUnion h
6060
end partial_order_bot
6161

6262
section complete_lattice
63-
variables [complete_lattice α]
63+
variables [complete_lattice α] {s : set ι} {t : set ι'}
6464

6565
/-- Bind operation for `set.pairwise_disjoint`. If you want to only consider finsets of indices, you
6666
can use `set.pairwise_disjoint.bUnion_finset`. -/
@@ -78,8 +78,41 @@ begin
7878
{ exact (hs hc hd $ ne_of_apply_ne _ hcd).mono (le_supr₂ a ha) (le_supr₂ b hb) }
7979
end
8080

81+
/-- If the suprema of columns are pairwise disjoint and suprema of rows as well, then everything is
82+
pairwise disjoint. Not to be confused with `set.pairwise_disjoint.prod`. -/
83+
lemma pairwise_disjoint.prod_left {f : ι × ι' → α}
84+
(hs : s.pairwise_disjoint $ λ i, ⨆ i' ∈ t, f (i, i'))
85+
(ht : t.pairwise_disjoint $ λ i', ⨆ i ∈ s, f (i, i')) :
86+
(s ×ˢ t : set (ι × ι')).pairwise_disjoint f :=
87+
begin
88+
rintro ⟨i, i'⟩ hi ⟨j, j'⟩ hj h,
89+
rw mem_prod at hi hj,
90+
obtain rfl | hij := eq_or_ne i j,
91+
{ refine (ht hi.2 hj.2 $ (prod.mk.inj_left _).ne_iff.1 h).mono _ _,
92+
{ convert le_supr₂ i hi.1, refl },
93+
{ convert le_supr₂ i hj.1, refl } },
94+
{ refine (hs hi.1 hj.1 hij).mono _ _,
95+
{ convert le_supr₂ i' hi.2, refl },
96+
{ convert le_supr₂ j' hj.2, refl } }
97+
end
98+
8199
end complete_lattice
82100

101+
section frame
102+
variables [frame α]
103+
104+
lemma pairwise_disjoint_prod_left {s : set ι} {t : set ι'} {f : ι × ι' → α} :
105+
(s ×ˢ t : set (ι × ι')).pairwise_disjoint f ↔ s.pairwise_disjoint (λ i, ⨆ i' ∈ t, f (i, i')) ∧
106+
t.pairwise_disjoint (λ i', ⨆ i ∈ s, f (i, i')) :=
107+
begin
108+
refine (⟨λ h, ⟨λ i hi j hj hij, _, λ i hi j hj hij, _⟩, λ h, h.1.prod_left h.2⟩);
109+
simp_rw [function.on_fun, supr_disjoint_iff, disjoint_supr_iff]; intros i' hi' j' hj',
110+
{ exact h (mk_mem_prod hi hi') (mk_mem_prod hj hj') (ne_of_apply_ne prod.fst hij) },
111+
{ exact h (mk_mem_prod hi' hi) (mk_mem_prod hj' hj) (ne_of_apply_ne prod.snd hij) }
112+
end
113+
114+
end frame
115+
83116
lemma bUnion_diff_bUnion_eq {s t : set ι} {f : ι → set α} (h : (s ∪ t).pairwise_disjoint f) :
84117
(⋃ i ∈ s, f i) \ (⋃ i ∈ t, f i) = (⋃ i ∈ s \ t, f i) :=
85118
begin

src/data/set/prod.lean

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,21 @@ by { ext ⟨x, y⟩, simp only [←and_and_distrib_left, mem_inter_iff, mem_prod
106106
lemma prod_inter_prod : s₁ ×ˢ t₁ ∩ s₂ ×ˢ t₂ = (s₁ ∩ s₂) ×ˢ (t₁ ∩ t₂) :=
107107
by { ext ⟨x, y⟩, simp [and_assoc, and.left_comm] }
108108

109-
lemma disjoint_prod : disjoint (s₁ ×ˢ t₁) (s₂ ×ˢ t₂) ↔ disjoint s₁ s₂ ∨ disjoint t₁ t₂ :=
109+
@[simp] lemma disjoint_prod : disjoint (s₁ ×ˢ t₁) (s₂ ×ˢ t₂) ↔ disjoint s₁ s₂ ∨ disjoint t₁ t₂ :=
110110
begin
111111
simp_rw [disjoint_left, mem_prod, not_and_distrib, prod.forall, and_imp,
112112
←@forall_or_distrib_right α, ←@forall_or_distrib_left β,
113113
←@forall_or_distrib_right (_ ∈ s₁), ←@forall_or_distrib_left (_ ∈ t₁)],
114114
end
115115

116+
lemma _root_.disjoint.set_prod_left (hs : disjoint s₁ s₂) (t₁ t₂ : set β) :
117+
disjoint (s₁ ×ˢ t₁) (s₂ ×ˢ t₂) :=
118+
disjoint_left.2 $ λ ⟨a, b⟩ ⟨ha₁, hb₁⟩ ⟨ha₂, hb₂⟩, disjoint_left.1 hs ha₁ ha₂
119+
120+
lemma _root_.disjoint.set_prod_right (ht : disjoint t₁ t₂) (s₁ s₂ : set α) :
121+
disjoint (s₁ ×ˢ t₁) (s₂ ×ˢ t₂) :=
122+
disjoint_left.2 $ λ ⟨a, b⟩ ⟨ha₁, hb₁⟩ ⟨ha₂, hb₂⟩, disjoint_left.1 ht hb₁ hb₂
123+
116124
lemma insert_prod : insert a s ×ˢ t = (prod.mk a '' t) ∪ s ×ˢ t :=
117125
by { ext ⟨x, y⟩, simp [image, iff_def, or_imp_distrib, imp.swap] {contextual := tt} }
118126

@@ -479,6 +487,20 @@ univ_pi_eq_empty_iff.2 $ h.elim $ λ x, ⟨x, rfl⟩
479487
@[simp] lemma disjoint_univ_pi : disjoint (pi univ t₁) (pi univ t₂) ↔ ∃ i, disjoint (t₁ i) (t₂ i) :=
480488
by simp only [disjoint_iff_inter_eq_empty, ← pi_inter_distrib, univ_pi_eq_empty_iff]
481489

490+
lemma _root_.disjoint.set_pi (hi : i ∈ s) (ht : disjoint (t₁ i) (t₂ i)) :
491+
disjoint (s.pi t₁) (s.pi t₂) :=
492+
disjoint_left.2 $ λ h h₁ h₂, disjoint_left.1 ht (h₁ _ hi) (h₂ _ hi)
493+
494+
section nonempty
495+
variables [Π i, nonempty (α i)]
496+
497+
lemma pi_eq_empty_iff' : s.pi t = ∅ ↔ ∃ i ∈ s, t i = ∅ := by simp [pi_eq_empty_iff]
498+
499+
@[simp] lemma disjoint_pi : disjoint (s.pi t₁) (s.pi t₂) ↔ ∃ i ∈ s, disjoint (t₁ i) (t₂ i) :=
500+
by simp only [disjoint_iff_inter_eq_empty, ← pi_inter_distrib, pi_eq_empty_iff']
501+
502+
end nonempty
503+
482504
@[simp] lemma range_dcomp (f : Π i, α i → β i) :
483505
range (λ (g : Π i, α i), (λ i, f i (g i))) = pi univ (λ i, range (f i)) :=
484506
begin

src/order/sup_indep.lean

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Copyright (c) 2021 Aaron Anderson, Yaël Dillies. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Aaron Anderson, Kevin Buzzard, Yaël Dillies, Eric Wieser
55
-/
6+
import data.finset.sigma
67
import data.finset.pairwise
78
import data.finset.powerset
89
import data.fintype.basic
@@ -77,12 +78,45 @@ end
7778
lemma sup_indep.pairwise_disjoint (hs : s.sup_indep f) : (s : set ι).pairwise_disjoint f :=
7879
λ a ha b hb hab, sup_singleton.subst $ hs (singleton_subset_iff.2 hb) ha $ not_mem_singleton.2 hab
7980

81+
lemma sup_indep.le_sup_iff (hs : s.sup_indep f) (hts : t ⊆ s) (hi : i ∈ s) (hf : ∀ i, f i ≠ ⊥) :
82+
f i ≤ t.sup f ↔ i ∈ t :=
83+
begin
84+
refine ⟨λ h, _, le_sup⟩,
85+
by_contra hit,
86+
exact hf i (disjoint_self.1 $ (hs hts hi hit).mono_right h),
87+
end
88+
8089
/-- The RHS looks like the definition of `complete_lattice.independent`. -/
8190
lemma sup_indep_iff_disjoint_erase [decidable_eq ι] :
8291
s.sup_indep f ↔ ∀ i ∈ s, disjoint (f i) ((s.erase i).sup f) :=
8392
⟨λ hs i hi, hs (erase_subset _ _) hi (not_mem_erase _ _), λ hs t ht i hi hit,
8493
(hs i hi).mono_right (sup_mono $ λ j hj, mem_erase.2 ⟨ne_of_mem_of_not_mem hj hit, ht hj⟩)⟩
8594

95+
lemma sup_indep.image [decidable_eq ι] {s : finset ι'} {g : ι' → ι} (hs : s.sup_indep (f ∘ g)) :
96+
(s.image g).sup_indep f :=
97+
begin
98+
intros t ht i hi hit,
99+
rw mem_image at hi,
100+
obtain ⟨i, hi, rfl⟩ := hi,
101+
haveI : decidable_eq ι' := classical.dec_eq _,
102+
suffices hts : t ⊆ (s.erase i).image g,
103+
{ refine (sup_indep_iff_disjoint_erase.1 hs i hi).mono_right ((sup_mono hts).trans _),
104+
rw sup_image },
105+
rintro j hjt,
106+
obtain ⟨j, hj, rfl⟩ := mem_image.1 (ht hjt),
107+
exact mem_image_of_mem _ (mem_erase.2 ⟨ne_of_apply_ne g (ne_of_mem_of_not_mem hjt hit), hj⟩),
108+
end
109+
110+
lemma sup_indep_map {s : finset ι'} {g : ι' ↪ ι} : (s.map g).sup_indep f ↔ s.sup_indep (f ∘ g) :=
111+
begin
112+
refine ⟨λ hs t ht i hi hit, _, λ hs, _⟩,
113+
{ rw ←sup_map,
114+
exact hs (map_subset_map.2 ht) ((mem_map' _).2 hi) (by rwa mem_map') },
115+
{ classical,
116+
rw map_eq_image,
117+
exact hs.image }
118+
end
119+
86120
@[simp] lemma sup_indep_pair [decidable_eq ι] {i j : ι} (hij : i ≠ j) :
87121
({i, j} : finset ι).sup_indep f ↔ disjoint (f i) (f j) :=
88122
⟨λ h, h.pairwise_disjoint (by simp) (by simp) hij, λ h, begin
@@ -117,7 +151,7 @@ begin
117151
exact sup_indep_pair this,
118152
end
119153

120-
lemma sup_indep.attach (hs : s.sup_indep f) : s.attach.sup_indep (f ∘ subtype.val) :=
154+
lemma sup_indep.attach (hs : s.sup_indep f) : s.attach.sup_indep (λ a, f a) :=
121155
begin
122156
intros t ht i _ hi,
123157
classical,
@@ -128,6 +162,18 @@ begin
128162
rwa subtype.ext hji at hj,
129163
end
130164

165+
@[simp] lemma sup_indep_attach : s.attach.sup_indep (λ a, f a) ↔ s.sup_indep f :=
166+
begin
167+
refine ⟨λ h t ht i his hit, _, sup_indep.attach⟩,
168+
classical,
169+
convert h (filter_subset (λ i, (i : ι) ∈ t) _) (mem_attach _ ⟨i, ‹_›⟩)
170+
(λ hi, hit $ by simpa using hi) using 1,
171+
refine eq_of_forall_ge_iff _,
172+
simp only [finset.sup_le_iff, mem_filter, mem_attach, true_and, function.comp_app, subtype.forall,
173+
subtype.coe_mk],
174+
exact λ a, forall_congr (λ j, ⟨λ h _, h, λ h hj, h (ht hj) hj⟩),
175+
end
176+
131177
end lattice
132178

133179
section distrib_lattice
@@ -156,6 +202,58 @@ lemma sup_indep.bUnion [decidable_eq ι] {s : finset ι'} {g : ι' → finset ι
156202
(s.bUnion g).sup_indep f :=
157203
by { rw ←sup_eq_bUnion, exact hs.sup hg }
158204

205+
/-- Bind operation for `sup_indep`. -/
206+
lemma sup_indep.sigma {β : ι → Type*} {s : finset ι} {g : Π i, finset (β i)} {f : sigma β → α}
207+
(hs : s.sup_indep $ λ i, (g i).sup $ λ b, f ⟨i, b⟩)
208+
(hg : ∀ i ∈ s, (g i).sup_indep $ λ b, f ⟨i, b⟩) :
209+
(s.sigma g).sup_indep f :=
210+
begin
211+
rintro t ht ⟨i, b⟩ hi hit,
212+
rw finset.disjoint_sup_right,
213+
rintro ⟨j, c⟩ hj,
214+
have hbc := (ne_of_mem_of_not_mem hj hit).symm,
215+
replace hj := ht hj,
216+
rw mem_sigma at hi hj,
217+
obtain rfl | hij := eq_or_ne i j,
218+
{ exact (hg _ hj.1).pairwise_disjoint hi.2 hj.2 (sigma_mk_injective.ne_iff.1 hbc) },
219+
{ refine (hs.pairwise_disjoint hi.1 hj.1 hij).mono _ _,
220+
{ convert le_sup hi.2 },
221+
{ convert le_sup hj.2 } }
222+
end
223+
224+
lemma sup_indep.product {s : finset ι} {t : finset ι'} {f : ι × ι' → α}
225+
(hs : s.sup_indep $ λ i, t.sup $ λ i', f (i, i'))
226+
(ht : t.sup_indep $ λ i', s.sup $ λ i, f (i, i')) :
227+
(s.product t).sup_indep f :=
228+
begin
229+
rintro u hu ⟨i, i'⟩ hi hiu,
230+
rw finset.disjoint_sup_right,
231+
rintro ⟨j, j'⟩ hj,
232+
have hij := (ne_of_mem_of_not_mem hj hiu).symm,
233+
replace hj := hu hj,
234+
rw mem_product at hi hj,
235+
obtain rfl | hij := eq_or_ne i j,
236+
{ refine (ht.pairwise_disjoint hi.2 hj.2 $ (prod.mk.inj_left _).ne_iff.1 hij).mono _ _,
237+
{ convert le_sup hi.1 },
238+
{ convert le_sup hj.1 } },
239+
{ refine (hs.pairwise_disjoint hi.1 hj.1 hij).mono _ _,
240+
{ convert le_sup hi.2 },
241+
{ convert le_sup hj.2 } }
242+
end
243+
244+
lemma sup_indep_product_iff {s : finset ι} {t : finset ι'} {f : ι × ι' → α} :
245+
(s.product t).sup_indep f ↔
246+
s.sup_indep (λ i, t.sup $ λ i', f (i, i')) ∧ t.sup_indep (λ i', s.sup $ λ i, f (i, i')) :=
247+
begin
248+
refine ⟨_, λ h, h.1.product h.2⟩,
249+
simp_rw sup_indep_iff_pairwise_disjoint,
250+
refine (λ h, ⟨λ i hi j hj hij, _, λ i hi j hj hij, _⟩);
251+
simp_rw [function.on_fun, finset.disjoint_sup_left, finset.disjoint_sup_right];
252+
intros i' hi' j' hj',
253+
{ exact h (mk_mem_product hi hi') (mk_mem_product hj hj') (ne_of_apply_ne prod.fst hij) },
254+
{ exact h (mk_mem_product hi' hi) (mk_mem_product hj' hj) (ne_of_apply_ne prod.snd hij) }
255+
end
256+
159257
end distrib_lattice
160258
end finset
161259

0 commit comments

Comments
 (0)