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

Commit 14a7c39

Browse files
committed
chore(data/finset/basic): use has_coe_t for coercion of finset to set (#4917)
1 parent 26e4f15 commit 14a7c39

File tree

2 files changed

+55
-58
lines changed

2 files changed

+55
-58
lines changed

src/data/finset/basic.lean

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,20 @@ multiset.decidable_mem _ _
6464
/-! ### set coercion -/
6565

6666
/-- Convert a finset to a set in the natural way. -/
67-
instance : has_lift (finset α) (set α) := ⟨λ s, {x | x ∈ s}⟩
67+
instance : has_coe_t (finset α) (set α) := ⟨λ s, {x | x ∈ s}⟩
6868

69-
@[simp, norm_cast] lemma mem_coe {a : α} {s : finset α} : a ∈ (s : set α) ↔ a ∈ s := iff.rfl
69+
@[simp, norm_cast] lemma mem_coe {a : α} {s : finset α} : a ∈ (s : set α) ↔ a ∈ s := iff.rfl
7070

71-
@[simp] lemma set_of_mem {α} {s : finset α} : {a | a ∈ s} = s := rfl
71+
@[simp] lemma set_of_mem {α} {s : finset α} : {a | a ∈ s} = s := rfl
7272

73-
@[simp] lemma coe_mem {s : finset α} (x : (s : set α)) : ↑x ∈ s := x.2
73+
@[simp] lemma coe_mem {s : finset α} (x : (s : set α)) : ↑x ∈ s := x.2
7474

75-
@[simp] lemma mk_coe {s : finset α} (x : (s : set α)) {h} :
76-
(⟨x, h⟩ : (s : set α)) = x :=
77-
by { apply subtype.eq, refl, }
75+
@[simp] lemma mk_coe {s : finset α} (x : (s : set α)) {h} :
76+
(⟨x, h⟩ : (s : set α)) = x :=
77+
subtype.coe_eta _ _
7878

7979
instance decidable_mem' [decidable_eq α] (a : α) (s : finset α) :
80-
decidable (a ∈ (s : set α)) := s.decidable_mem _
80+
decidable (a ∈ (s : set α)) := s.decidable_mem _
8181

8282
/-! ### extensionality -/
8383
theorem ext_iff {s₁ s₂ : finset α} : s₁ = s₂ ↔ ∀ a, a ∈ s₁ ↔ a ∈ s₂ :=
@@ -87,7 +87,7 @@ val_inj.symm.trans $ nodup_ext s₁.2 s₂.2
8787
theorem ext {s₁ s₂ : finset α} : (∀ a, a ∈ s₁ ↔ a ∈ s₂) → s₁ = s₂ :=
8888
ext_iff.2
8989

90-
@[simp, norm_cast] theorem coe_inj {s₁ s₂ : finset α} : (s₁ : set α) = s₂ ↔ s₁ = s₂ :=
90+
@[simp, norm_cast] theorem coe_inj {s₁ s₂ : finset α} : (s₁ : set α) = s₂ ↔ s₁ = s₂ :=
9191
set.ext_iff.trans ext_iff.symm
9292

9393
lemma coe_injective {α} : function.injective (coe : finset α → set α) :=
@@ -119,7 +119,7 @@ ext $ λ a, ⟨@H₁ a, @H₂ a⟩
119119
theorem subset_iff {s₁ s₂ : finset α} : s₁ ⊆ s₂ ↔ ∀ ⦃x⦄, x ∈ s₁ → x ∈ s₂ := iff.rfl
120120

121121
@[simp, norm_cast] theorem coe_subset {s₁ s₂ : finset α} :
122-
(s₁ : set α) ⊆ s₂ ↔ s₁ ⊆ s₂ := iff.rfl
122+
(s₁ : set α) ⊆ s₂ ↔ s₁ ⊆ s₂ := iff.rfl
123123

124124
@[simp] theorem val_le_iff {s₁ s₂ : finset α} : s₁.1 ≤ s₂.1 ↔ s₁ ⊆ s₂ := le_iff_subset s₁.2
125125

@@ -138,8 +138,8 @@ le_antisymm_iff
138138
@[simp] theorem le_iff_subset {s₁ s₂ : finset α} : s₁ ≤ s₂ ↔ s₁ ⊆ s₂ := iff.rfl
139139
@[simp] theorem lt_iff_ssubset {s₁ s₂ : finset α} : s₁ < s₂ ↔ s₁ ⊂ s₂ := iff.rfl
140140

141-
@[simp, norm_cast] lemma coe_ssubset {s₁ s₂ : finset α} : (s₁ : set α) ⊂ s₂ ↔ s₁ ⊂ s₂ :=
142-
show (s₁ : set α) ⊂ s₂ ↔ s₁ ⊆ s₂ ∧ ¬s₂ ⊆ s₁,
141+
@[simp, norm_cast] lemma coe_ssubset {s₁ s₂ : finset α} : (s₁ : set α) ⊂ s₂ ↔ s₁ ⊂ s₂ :=
142+
show (s₁ : set α) ⊂ s₂ ↔ s₁ ⊆ s₂ ∧ ¬s₂ ⊆ s₁,
143143
by simp only [set.ssubset_def, finset.coe_subset]
144144

145145
@[simp] theorem val_lt_iff {s₁ s₂ : finset α} : s₁.1 < s₂.1 ↔ s₁ ⊂ s₂ :=
@@ -155,7 +155,7 @@ in theorem assumptions instead of `∃ x, x ∈ s` or `s ≠ ∅` as it gives ac
155155
to the dot notation. -/
156156
protected def nonempty (s : finset α) : Prop := ∃ x:α, x ∈ s
157157

158-
@[simp, norm_cast] lemma coe_nonempty {s : finset α} : (s:set α).nonempty ↔ s.nonempty := iff.rfl
158+
@[simp, norm_cast] lemma coe_nonempty {s : finset α} : (s:set α).nonempty ↔ s.nonempty := iff.rfl
159159

160160
lemma nonempty.bex {s : finset α} (h : s.nonempty) : ∃ x:α, x ∈ s := h
161161

@@ -207,7 +207,7 @@ theorem nonempty_iff_ne_empty {s : finset α} : s.nonempty ↔ s ≠ ∅ :=
207207
theorem eq_empty_or_nonempty (s : finset α) : s = ∅ ∨ s.nonempty :=
208208
classical.by_cases or.inl (λ h, or.inr (nonempty_of_ne_empty h))
209209

210-
@[simp] lemma coe_empty : ↑(∅ : finset α) = (∅ : set α) := rfl
210+
@[simp] lemma coe_empty : ((∅ : finset α) : set α) = ∅ := rfl
211211

212212
/-- A `finset` for an empty type is empty. -/
213213
lemma eq_empty_of_not_nonempty (h : ¬ nonempty α) (s : finset α) : s = ∅ :=
@@ -236,7 +236,8 @@ theorem singleton_nonempty (a : α) : ({a} : finset α).nonempty := ⟨a, mem_si
236236

237237
@[simp] theorem singleton_ne_empty (a : α) : ({a} : finset α) ≠ ∅ := (singleton_nonempty a).ne_empty
238238

239-
@[simp] lemma coe_singleton (a : α) : ↑({a} : finset α) = ({a} : set α) := by { ext, simp }
239+
@[simp, norm_cast] lemma coe_singleton (a : α) : (({a} : finset α) : set α) = {a} :=
240+
by { ext, simp }
240241

241242
lemma eq_singleton_iff_unique_mem {s : finset α} {a : α} :
242243
s = {a} ↔ a ∈ s ∧ ∀ x ∈ s, x = a :=
@@ -324,7 +325,7 @@ theorem mem_of_mem_insert_of_ne {a b : α} {s : finset α} (h : b ∈ insert a s
324325
ext $ λ a, by simp
325326

326327
@[simp, norm_cast] lemma coe_insert (a : α) (s : finset α) :
327-
↑(insert a s) = (insert a s : set α) :=
328+
↑(insert a s) = (insert a s : set α) :=
328329
set.ext $ λ x, by simp only [mem_coe, mem_insert, set.mem_insert_iff]
329330

330331
instance : is_lawful_singleton α (finset α) := ⟨λ a, by { ext, simp }⟩
@@ -364,7 +365,7 @@ theorem insert_subset_insert (a : α) {s t : finset α} (h : s ⊆ t) : insert a
364365
insert_subset.2 ⟨mem_insert_self _ _, subset.trans h (subset_insert _ _)⟩
365366

366367
lemma ssubset_iff {s t : finset α} : s ⊂ t ↔ (∃a ∉ s, insert a s ⊆ t) :=
367-
by exact_mod_cast @set.ssubset_iff_insert α ↑s ↑t
368+
by exact_mod_cast @set.ssubset_iff_insert α s t
368369

369370
lemma ssubset_insert {s : finset α} {a : α} (h : a ∉ s) : s ⊂ insert a s :=
370371
ssubset_iff.mpr ⟨a, h, subset.refl _⟩
@@ -432,7 +433,7 @@ theorem not_mem_union {a : α} {s₁ s₂ : finset α} : a ∉ s₁ ∪ s₂ ↔
432433
by rw [mem_union, not_or_distrib]
433434

434435
@[simp, norm_cast]
435-
lemma coe_union (s₁ s₂ : finset α) : ↑(s₁ ∪ s₂) = (s₁ ∪ s₂ : set α) := set.ext $ λ x, mem_union
436+
lemma coe_union (s₁ s₂ : finset α) : ↑(s₁ ∪ s₂) = (s₁ ∪ s₂ : set α) := set.ext $ λ x, mem_union
436437

437438
theorem union_subset {s₁ s₂ s₃ : finset α} (h₁ : s₁ ⊆ s₃) (h₂ : s₂ ⊆ s₃) : s₁ ∪ s₂ ⊆ s₃ :=
438439
val_le_iff.1 (ndunion_le.2 ⟨h₁, val_le_iff.2 h₂⟩)
@@ -538,7 +539,7 @@ theorem subset_inter {s₁ s₂ s₃ : finset α} : s₁ ⊆ s₂ → s₁ ⊆ s
538539
by simp only [subset_iff, mem_inter] {contextual:=tt}; intros; split; trivial
539540

540541
@[simp, norm_cast]
541-
lemma coe_inter (s₁ s₂ : finset α) : ↑(s₁ ∩ s₂) = (s₁ ∩ s₂ : set α) := set.ext $ λ _, mem_inter
542+
lemma coe_inter (s₁ s₂ : finset α) : ↑(s₁ ∩ s₂) = (s₁ ∩ s₂ : set α) := set.ext $ λ _, mem_inter
542543

543544
@[simp] theorem union_inter_cancel_left {s t : finset α} : (s ∪ t) ∩ s = s :=
544545
by rw [← coe_inj, coe_inter, coe_union, set.union_inter_cancel_left]
@@ -697,7 +698,7 @@ val_le_iff.1 $ erase_le_erase _ $ val_le_iff.2 h
697698

698699
theorem erase_subset (a : α) (s : finset α) : erase s a ⊆ s := erase_subset _ _
699700

700-
@[simp, norm_cast] lemma coe_erase (a : α) (s : finset α) : ↑(erase s a) = (s \ {a} : set α) :=
701+
@[simp, norm_cast] lemma coe_erase (a : α) (s : finset α) : ↑(erase s a) = (s \ {a} : set α) :=
701702
set.ext $ λ _, mem_erase.trans $ by rw [and_comm, set.mem_diff, set.mem_singleton_iff]; refl
702703

703704
lemma erase_ssubset {a : α} {s : finset α} (h : a ∈ s) : s.erase a ⊂ s :=
@@ -776,7 +777,7 @@ theorem sdiff_subset_self {s₁ s₂ : finset α} : s₁ \ s₂ ⊆ s₁ :=
776777
suffices s₁ \ s₂ ⊆ s₁ \ ∅, by simpa [sdiff_empty] using this,
777778
sdiff_subset_sdiff (subset.refl _) (empty_subset _)
778779

779-
@[simp, norm_cast] lemma coe_sdiff (s₁ s₂ : finset α) : ↑(s₁ \ s₂) = (s₁ \ s₂ : set α) :=
780+
@[simp, norm_cast] lemma coe_sdiff (s₁ s₂ : finset α) : ↑(s₁ \ s₂) = (s₁ \ s₂ : set α) :=
780781
set.ext $ λ _, mem_sdiff
781782

782783
@[simp] theorem union_sdiff_self_eq_union {s t : finset α} : s ∪ (t \ s) = s ∪ t :=
@@ -805,14 +806,14 @@ lemma insert_sdiff_of_not_mem (s : finset α) {t : finset α} {x : α} (h : x
805806
(insert x s) \ t = insert x (s \ t) :=
806807
begin
807808
rw [← coe_inj, coe_insert, coe_sdiff, coe_sdiff, coe_insert],
808-
exact set.insert_diff_of_not_mem s h
809+
exact set.insert_diff_of_not_mem s h
809810
end
810811

811812
lemma insert_sdiff_of_mem (s : finset α) {t : finset α} {x : α} (h : x ∈ t) :
812813
(insert x s) \ t = s \ t :=
813814
begin
814815
rw [← coe_inj, coe_sdiff, coe_sdiff, coe_insert],
815-
exact set.insert_diff_of_mem s h
816+
exact set.insert_diff_of_mem s h
816817
end
817818

818819
@[simp] lemma insert_sdiff_insert (s t : finset α) (x : α) :
@@ -887,8 +888,8 @@ by { ext i, simp [piecewise] }
887888

888889
variable [∀j, decidable (j ∈ s)]
889890

890-
@[norm_cast] lemma piecewise_coe [∀j, decidable (j ∈ (s : set α))] :
891-
(s : set α).piecewise f g = s.piecewise f g :=
891+
@[norm_cast] lemma piecewise_coe [∀j, decidable (j ∈ (s : set α))] :
892+
(s : set α).piecewise f g = s.piecewise f g :=
892893
by { ext, congr }
893894

894895
@[simp, priority 980]

src/data/polynomial/monic.lean

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ lemma coeff_nat_degree {p : polynomial R} (hp : p.monic) : p.coeff (p.nat_degree
143143

144144
@[simp]
145145
lemma degree_eq_zero_iff_eq_one {p : polynomial R} (hp : p.monic) :
146-
p.nat_degree = 0 ↔ p = 1 :=
146+
p.nat_degree = 0 ↔ p = 1 :=
147147
begin
148148
split; intro h,
149149
swap, { rw h, exact nat_degree_one },
@@ -158,41 +158,37 @@ lemma nat_degree_mul [nontrivial R] {p q : polynomial R} (hp : p.monic) (hq : q.
158158
by { apply nat_degree_mul', rw [hp.leading_coeff, hq.leading_coeff], simp }
159159

160160
lemma next_coeff_mul {p q : polynomial R} (hp : monic p) (hq : monic q) :
161-
next_coeff (p * q) = next_coeff p + next_coeff q :=
161+
next_coeff (p * q) = next_coeff p + next_coeff q :=
162162
begin
163-
nontriviality,
164-
dsimp only [next_coeff],
165-
simp only [monic.nat_degree_mul hp hq, add_eq_zero_iff, degree_eq_zero_iff_eq_one, hp, hq],
166-
by_cases hp0 : p = 1; by_cases hq0 : q = 1;
167-
simp only [hp0, hq0, true_and, and_true, false_and, one_mul, mul_one, if_true, if_false,
168-
add_zero, zero_add, nat.zero_sub, nat_degree_one, coeff_one_zero, eq_self_iff_true],
169-
simp only [← degree_eq_zero_iff_eq_one, hp, hq] at hp0 hq0,
170-
-- we've reduced to the case where the degrees of p and q are nonzero
163+
classical,
164+
nontriviality R,
165+
simp only [next_coeff, monic.nat_degree_mul hp hq],
166+
simp only [hp, hq, degree_eq_zero_iff_eq_one, add_eq_zero_iff],
171167
set dp := p.nat_degree, set dq := q.nat_degree,
168+
suffices : p ≠ 1 → q ≠ 1 → (p * q).coeff (dp + dq - 1) = p.coeff (dp - 1) + q.coeff (dq - 1),
169+
{ by_cases hp0 : p = 1; by_cases hq0 : q = 1; simp [dp, dq, hp0, hq0, this] },
170+
intros hp0 hq0,
171+
replace hp0 : dp ≠ 0 := mt hp.degree_eq_zero_iff_eq_one.1 hp0,
172+
replace hq0 : dq ≠ 0 := mt hq.degree_eq_zero_iff_eq_one.1 hq0,
172173
rw coeff_mul,
173-
have : {(dp, dq - 1), (dp - 1, dq)} ⊆ nat.antidiagonal (dp + dq - 1),
174-
{ simp only [insert_subset, singleton_subset_iff, nat.mem_antidiagonal],
175-
split,
176-
{ rw nat.add_sub_assoc, exact nat.pos_of_ne_zero hq0 },
177-
{ apply nat.sub_add_eq_add_sub, exact nat.pos_of_ne_zero hp0 } },
178-
rw ← sum_subset this; clear this,
179-
{ rw [sum_insert, sum_singleton],
180-
{ rw [coeff_nat_degree hp, coeff_nat_degree hq, mul_one, one_mul, add_comm] },
181-
{ simp only [not_and, prod.mk.inj_iff, mem_singleton], revert hp0, omega manual } },
182-
simp only [prod.forall, mem_insert, prod.mk.inj_iff, nat.mem_antidiagonal, mem_singleton],
183-
push_neg, rintros i j h1 ⟨h2, h3⟩,
184-
suffices : p.coeff i = 0 ∨ q.coeff j = 0,
185-
{ exact mul_eq_zero_of_ne_zero_imp_eq_zero this.resolve_left },
186-
suffices : dp < i ∨ dq < j, { apply this.imp _ _; exact coeff_eq_zero_of_nat_degree_lt },
187-
rw or_iff_not_imp_left, push_neg, intro h,
188-
have aux1 : i ≠ dp,
189-
{ intro hi, subst i,
190-
rw nat.add_sub_assoc (nat.pos_of_ne_zero hq0) at h1,
191-
exact h2 rfl (nat.add_left_cancel h1) },
192-
rw nat.sub_add_comm (nat.pos_of_ne_zero hp0) at h1,
193-
have aux2 : i ≠ dp - 1, { rintro rfl, exact h3 rfl (nat.add_left_cancel h1) },
194-
have aux3 : i < dp - 1, { revert h aux1 aux2, omega manual },
195-
revert aux3 h1, omega manual
174+
have : {(dp - 1, dq), (dp, dq - 1)} ⊆ nat.antidiagonal (dp + dq - 1),
175+
{ suffices : dp - 1 + dq = dp + dq - 1 ∧ dp + (dq - 1) = dp + dq - 1,
176+
by simpa [insert_subset, singleton_subset_iff],
177+
omega },
178+
rw [← sum_subset this, sum_pair],
179+
{ simp [hp, hq] },
180+
{ suffices : dp - 1 ≠ dp, from mt (congr_arg prod.fst) this,
181+
omega },
182+
{ rintros ⟨x, y⟩ hx hx1,
183+
simp only [nat.mem_antidiagonal] at hx,
184+
simp only [mem_insert, mem_singleton] at hx1,
185+
contrapose! hx1,
186+
have hxp : x ≤ dp, from le_nat_degree_of_ne_zero (left_ne_zero_of_mul hx1),
187+
have hyq : y ≤ dq, from le_nat_degree_of_ne_zero (right_ne_zero_of_mul hx1),
188+
have : dq - 1 ≤ y, omega,
189+
by_cases hy : y = dq,
190+
{ subst y, left, congr, omega },
191+
{ have : y = dq - 1, by omega, subst y, right, congr, omega } }
196192
end
197193

198194
lemma next_coeff_prod

0 commit comments

Comments
 (0)