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

Commit 3f16409

Browse files
committed
feat(data/finset/*): Random lemmas (#10955)
Prove some `compl` lemmas for `finset`, `(s.erase a).card + 1 = s.card` for `list`, `multiset`, `set`, copy over one more `generalized_boolean_algebra` lemma.
1 parent 2b9ab3b commit 3f16409

File tree

5 files changed

+58
-32
lines changed

5 files changed

+58
-32
lines changed

src/data/finset/basic.lean

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,14 +1112,15 @@ lemma erase_inj_on (s : finset α) : set.inj_on s.erase s :=
11121112

11131113
/-! ### sdiff -/
11141114

1115+
variables {s t : finset α} {a : α}
1116+
11151117
/-- `s \ t` is the set consisting of the elements of `s` that are not in `t`. -/
11161118
instance : has_sdiff (finset α) :=
11171119
⟨λs₁ s₂, ⟨s₁.1 - s₂.1, nodup_of_le tsub_le_self s₁.2⟩⟩
11181120

11191121
@[simp] lemma sdiff_val (s₁ s₂ : finset α) : (s₁ \ s₂).val = s₁.val - s₂.val := rfl
11201122

1121-
@[simp] theorem mem_sdiff {a : α} {s₁ s₂ : finset α} :
1122-
a ∈ s₁ \ s₂ ↔ a ∈ s₁ ∧ a ∉ s₂ := mem_sub_of_nodup s₁.2
1123+
@[simp] theorem mem_sdiff : a ∈ s \ t ↔ a ∈ s ∧ a ∉ t := mem_sub_of_nodup s.2
11231124

11241125
@[simp] theorem inter_sdiff_self (s₁ s₂ : finset α) : s₁ ∩ (s₂ \ s₁) = ∅ :=
11251126
eq_empty_of_forall_not_mem $
@@ -1134,7 +1135,7 @@ instance : generalized_boolean_algebra (finset α) :=
11341135
..finset.distrib_lattice,
11351136
..finset.order_bot }
11361137

1137-
lemma not_mem_sdiff_of_mem_right {a : α} {s t : finset α} (h : a ∈ t) : a ∉ s \ t :=
1138+
lemma not_mem_sdiff_of_mem_right (h : a ∈ t) : a ∉ s \ t :=
11381139
by simp only [mem_sdiff, h, not_true, not_false_iff, and_false]
11391140

11401141
theorem union_sdiff_of_subset {s₁ s₂ : finset α} (h : s₁ ⊆ s₂) : s₁ ∪ (s₂ \ s₁) = s₂ :=
@@ -1172,23 +1173,19 @@ sdiff_le_sdiff ‹t₁ ≤ t₂› ‹s₂ ≤ s₁›
11721173
@[simp, norm_cast] lemma coe_sdiff (s₁ s₂ : finset α) : ↑(s₁ \ s₂) = (s₁ \ s₂ : set α) :=
11731174
set.ext $ λ _, mem_sdiff
11741175

1175-
@[simp] theorem union_sdiff_self_eq_union {s t : finset α} : s ∪ (t \ s) = s ∪ t :=
1176-
sup_sdiff_self_right
1176+
@[simp] theorem union_sdiff_self_eq_union : s ∪ (t \ s) = s ∪ t := sup_sdiff_self_right
11771177

1178-
@[simp] theorem sdiff_union_self_eq_union {s t : finset α} : (s \ t) ∪ t = s ∪ t :=
1179-
sup_sdiff_self_left
1178+
@[simp] theorem sdiff_union_self_eq_union : (s \ t) ∪ t = s ∪ t := sup_sdiff_self_left
11801179

1181-
lemma union_sdiff_symm {s t : finset α} : s ∪ (t \ s) = t ∪ (s \ t) :=
1182-
sup_sdiff_symm
1180+
lemma union_sdiff_symm : s ∪ (t \ s) = t ∪ (s \ t) := sup_sdiff_symm
11831181

11841182
lemma sdiff_union_inter (s t : finset α) : (s \ t) ∪ (s ∩ t) = s :=
11851183
by { rw union_comm, exact sup_inf_sdiff _ _ }
11861184

11871185
@[simp] lemma sdiff_idem (s t : finset α) : s \ t \ t = s \ t :=
11881186
sdiff_idem
11891187

1190-
lemma sdiff_eq_empty_iff_subset {s t : finset α} : s \ t = ∅ ↔ s ⊆ t :=
1191-
sdiff_eq_bot_iff
1188+
lemma sdiff_eq_empty_iff_subset : s \ t = ∅ ↔ s ⊆ t := sdiff_eq_bot_iff
11921189

11931190
@[simp] lemma empty_sdiff (s : finset α) : ∅ \ s = ∅ :=
11941191
bot_sdiff
@@ -1222,8 +1219,7 @@ end
12221219
@[simp] lemma sdiff_subset (s t : finset α) : s \ t ⊆ s :=
12231220
show s \ t ≤ s, from sdiff_le
12241221

1225-
lemma sdiff_ssubset {s t : finset α} (h : t ⊆ s) (ht : t.nonempty) :
1226-
s \ t ⊂ s :=
1222+
lemma sdiff_ssubset (h : t ⊆ s) (ht : t.nonempty) : s \ t ⊂ s :=
12271223
sdiff_lt (le_iff_subset.2 h) ht.ne_empty
12281224

12291225
lemma union_sdiff_distrib (s₁ s₂ t : finset α) : (s₁ ∪ s₂) \ t = s₁ \ t ∪ s₂ \ t :=
@@ -1250,6 +1246,8 @@ end
12501246
lemma sdiff_sdiff_self_left (s t : finset α) : s \ (s \ t) = s ∩ t :=
12511247
sdiff_sdiff_right_self
12521248

1249+
lemma sdiff_sdiff_eq_self (h : t ⊆ s) : s \ (s \ t) = t := sdiff_sdiff_eq_self h
1250+
12531251
lemma sdiff_eq_sdiff_iff_inter_eq_inter {s t₁ t₂ : finset α} : s \ t₁ = s \ t₂ ↔ s ∩ t₁ = s ∩ t₂ :=
12541252
sdiff_eq_sdiff_iff_inf_eq_inf
12551253

@@ -1954,12 +1952,14 @@ by simp only [insert_eq, map_union, map_singleton]
19541952
⟨λ h, eq_empty_of_forall_not_mem $
19551953
λ a m, ne_empty_of_mem (mem_map_of_mem _ m) h, λ e, e.symm ▸ rfl⟩
19561954

1955+
@[simp] lemma map_nonempty : (s.map f).nonempty ↔ s.nonempty :=
1956+
by rw [nonempty_iff_ne_empty, nonempty_iff_ne_empty, ne.def, map_eq_empty]
1957+
1958+
alias map_nonempty ↔ _ finset.nonempty.map
1959+
19571960
lemma attach_map_val {s : finset α} : s.attach.map (embedding.subtype _) = s :=
19581961
eq_of_veq $ by rw [map_val, attach_val]; exact attach_map_val _
19591962

1960-
lemma nonempty.map (h : s.nonempty) (f : α ↪ β) : (s.map f).nonempty :=
1961-
let ⟨a, ha⟩ := h in ⟨f a, (mem_map' f).mpr ha⟩
1962-
19631963
end map
19641964

19651965
lemma range_add_one' (n : ℕ) :

src/data/finset/card.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ end
9191
@[simp]
9292
lemma card_erase_of_mem : a ∈ s → (s.erase a).card = pred s.card := card_erase_of_mem
9393

94+
@[simp] lemma card_erase_add_one : a ∈ s → (s.erase a).card + 1 = s.card := card_erase_add_one
95+
9496
lemma card_erase_lt_of_mem : a ∈ s → (s.erase a).card < s.card := card_erase_lt_of_mem
9597

9698
lemma card_erase_le : (s.erase a).card ≤ s.card := card_erase_le

src/data/fintype/basic.lean

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ fintype.complete x
9393

9494
@[simp] theorem mem_univ_val : ∀ x, x ∈ (univ : finset α).1 := mem_univ
9595

96+
lemma eq_univ_iff_forall {s : finset α} : s = univ ↔ ∀ x, x ∈ s := by simp [ext_iff]
97+
9698
@[simp] lemma coe_univ : ↑(univ : finset α) = (set.univ : set α) :=
9799
by ext; simp
98100

@@ -116,7 +118,10 @@ instance : order_top (finset α) :=
116118
{ top := univ,
117119
le_top := subset_univ }
118120

119-
instance [decidable_eq α] : boolean_algebra (finset α) :=
121+
section boolean_algebra
122+
variables [decidable_eq α] {s : finset α} {a : α}
123+
124+
instance : boolean_algebra (finset α) :=
120125
{ compl := λ s, univ \ s,
121126
inf_compl_le_bot := λ s x hx, by simpa using hx,
122127
top_le_sup_compl := λ s x hx, by simp,
@@ -125,34 +130,40 @@ instance [decidable_eq α] : boolean_algebra (finset α) :=
125130
..finset.order_bot,
126131
..finset.generalized_boolean_algebra }
127132

128-
lemma compl_eq_univ_sdiff [decidable_eq α] (s : finset α) : sᶜ = univ \ s := rfl
133+
lemma compl_eq_univ_sdiff (s : finset α) : sᶜ = univ \ s := rfl
134+
135+
@[simp] lemma mem_compl : a ∈ sᶜ ↔ a ∉ s := by simp [compl_eq_univ_sdiff]
129136

130-
@[simp] lemma mem_compl [decidable_eq α] {s : finset α} {x : α} : x ∈ sᶜ ↔ x ∉ s :=
131-
by simp [compl_eq_univ_sdiff]
137+
lemma not_mem_compl : a ∉ sᶜ ↔ a ∈ s := by rw [mem_compl, not_not]
132138

133-
@[simp, norm_cast] lemma coe_compl [decidable_eq α] (s : finset α) : ↑(sᶜ) = (↑s : set α)ᶜ :=
139+
@[simp, norm_cast] lemma coe_compl (s : finset α) : ↑(sᶜ) = (↑s : set α)ᶜ :=
134140
set.ext $ λ x, mem_compl
135141

136-
@[simp] theorem union_compl [decidable_eq α] (s : finset α) : s ∪ sᶜ = finset.univ :=
137-
sup_compl_eq_top
142+
@[simp] lemma compl_empty : (∅ : finset α)ᶜ = univ := compl_bot
143+
144+
@[simp] lemma union_compl (s : finset α) : s ∪ sᶜ = finset.univ := sup_compl_eq_top
145+
146+
@[simp] lemma compl_erase : (s.erase a)ᶜ = insert a sᶜ :=
147+
by { ext, simp only [or_iff_not_imp_left, mem_insert, not_and, mem_compl, mem_erase] }
138148

139-
@[simp] theorem insert_compl_self [decidable_eq α] (x : α) : insert x ({x}ᶜ : finset α) = univ :=
140-
by { ext y, simp [eq_or_ne] }
149+
@[simp] lemma compl_insert : (insert a s)ᶜ = sᶜ.erase a :=
150+
by { ext, simp only [not_or_distrib, mem_insert, iff_self, mem_compl, mem_erase] }
141151

142-
@[simp] lemma compl_filter [decidable_eq α] (p : α → Prop) [decidable_pred p]
143-
[Π x, decidable (¬p x)] :
152+
@[simp] lemma insert_compl_self (x : α) : insert x ({x}ᶜ : finset α) = univ :=
153+
by rw [←compl_erase, erase_singleton, compl_empty]
154+
155+
@[simp] lemma compl_filter (p : α → Prop) [decidable_pred p] [Π x, decidable (¬p x)] :
144156
(univ.filter p)ᶜ = univ.filter (λ x, ¬p x) :=
145157
(filter_not _ _).symm
146158

147-
theorem eq_univ_iff_forall {s : finset α} : s = univ ↔ ∀ x, x ∈ s :=
148-
by simp [ext_iff]
149-
150-
lemma compl_ne_univ_iff_nonempty [decidable_eq α] (s : finset α) : sᶜ ≠ univ ↔ s.nonempty :=
159+
lemma compl_ne_univ_iff_nonempty (s : finset α) : sᶜ ≠ univ ↔ s.nonempty :=
151160
by simp [eq_univ_iff_forall, finset.nonempty]
152161

153-
lemma compl_singleton [decidable_eq α] (a : α) : ({a} : finset α)ᶜ = univ.erase a :=
162+
lemma compl_singleton (a : α) : ({a} : finset α)ᶜ = univ.erase a :=
154163
by rw [compl_eq_univ_sdiff, sdiff_singleton_eq_erase]
155164

165+
end boolean_algebra
166+
156167
@[simp] lemma univ_inter [decidable_eq α] (s : finset α) :
157168
univ ∩ s = s := ext $ λ a, by simp
158169

src/data/list/basic.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3478,6 +3478,11 @@ end
34783478
by rcases exists_of_erasep al pa with ⟨_, l₁, l₂, _, _, e₁, e₂⟩;
34793479
rw e₂; simp [-add_comm, e₁]; refl
34803480

3481+
@[simp] lemma length_erasep_add_one {l : list α} {a} (al : a ∈ l) (pa : p a) :
3482+
(l.erasep p).length + 1 = l.length :=
3483+
let ⟨_, l₁, l₂, _, _, h₁, h₂⟩ := exists_of_erasep al pa in
3484+
by { rw [h₂, h₁, length_append, length_append], refl }
3485+
34813486
theorem erasep_append_left {a : α} (pa : p a) :
34823487
∀ {l₁ : list α} (l₂), a ∈ l₁ → (l₁++l₂).erasep p = l₁.erasep p ++ l₂
34833488
| (x::xs) l₂ h := begin
@@ -3568,6 +3573,10 @@ by rcases exists_of_erasep h rfl with ⟨_, l₁, l₂, h₁, rfl, h₂, h₃⟩
35683573
length (l.erase a) = pred (length l) :=
35693574
by rw erase_eq_erasep; exact length_erasep_of_mem h rfl
35703575

3576+
@[simp] lemma length_erase_add_one {a : α} {l : list α} (h : a ∈ l) :
3577+
(l.erase a).length + 1 = l.length :=
3578+
by rw [erase_eq_erasep, length_erasep_add_one h rfl]
3579+
35713580
theorem erase_append_left {a : α} {l₁ : list α} (l₂) (h : a ∈ l₁) :
35723581
(l₁++l₂).erase a = l₁.erase a ++ l₂ :=
35733582
by simp [erase_eq_erasep]; exact erasep_append_left (by refl) l₂ h

src/data/multiset/basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,10 @@ theorem erase_le_iff_le_cons {s t : multiset α} {a : α} : s.erase a ≤ t ↔
701701
a ∈ s → card (s.erase a) = pred (card s) :=
702702
quot.induction_on s $ λ l, length_erase_of_mem
703703

704+
@[simp] lemma card_erase_add_one {a : α} {s : multiset α} :
705+
a ∈ s → (s.erase a).card + 1 = s.card :=
706+
quot.induction_on s $ λ l, length_erase_add_one
707+
704708
theorem card_erase_lt_of_mem {a : α} {s : multiset α} : a ∈ s → card (s.erase a) < card s :=
705709
λ h, card_lt_of_lt (erase_lt.mpr h)
706710

0 commit comments

Comments
 (0)