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

Commit 47adfab

Browse files
committed
chore(*): sync list.replicate with Mathlib 4 (#18181)
Sync arguments order and golfs with leanprover-community/mathlib4#1579
1 parent b13c1a0 commit 47adfab

12 files changed

Lines changed: 62 additions & 61 deletions

File tree

src/algebra/big_operators/basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ begin
11261126
end
11271127

11281128
@[simp, to_additive] lemma prod_const (b : β) : (∏ x in s, b) = b ^ s.card :=
1129-
(congr_arg _ $ s.val.map_const b).trans $ multiset.prod_replicate b s.card
1129+
(congr_arg _ $ s.val.map_const b).trans $ multiset.prod_replicate s.card b
11301130

11311131
@[to_additive]
11321132
lemma pow_eq_prod_const (b : β) : ∀ n, b ^ n = ∏ k in range n, b := by simp

src/algebra/big_operators/multiset/basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ lemma prod_nsmul (m : multiset α) : ∀ (n : ℕ), (n • m).prod = m.prod ^ n
8686
| (n + 1) :=
8787
by rw [add_nsmul, one_nsmul, pow_add, pow_one, prod_add, prod_nsmul n]
8888

89-
@[simp, to_additive] lemma prod_replicate (a : α) (n : ) : (replicate n a).prod = a ^ n :=
89+
@[simp, to_additive] lemma prod_replicate (n : ) (a : α) : (replicate n a).prod = a ^ n :=
9090
by simp [replicate, list.prod_replicate]
9191

9292
@[to_additive]

src/algebra/polynomial/big_operators.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ begin
192192
nontriviality R,
193193
apply nat_degree_multiset_prod',
194194
suffices : (t.map (λ f, leading_coeff f)).prod = 1, { rw this, simp },
195-
convert prod_replicate (1 : R) t.card,
195+
convert prod_replicate t.card (1 : R),
196196
{ simp only [eq_replicate, multiset.card_map, eq_self_iff_true, true_and],
197197
rintros i hi,
198198
obtain ⟨i, hi, rfl⟩ := multiset.mem_map.mp hi,

src/data/list/basic.lean

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -450,13 +450,13 @@ append_inj_right h rfl
450450
theorem append_right_cancel {s₁ s₂ t : list α} (h : s₁ ++ t = s₂ ++ t) : s₁ = s₂ :=
451451
append_inj_left' h rfl
452452

453-
theorem append_right_injective (s : list α) : function.injective (λ t, s ++ t) :=
453+
theorem append_right_injective (s : list α) : injective (λ t, s ++ t) :=
454454
λ t₁ t₂, append_left_cancel
455455

456456
theorem append_right_inj {t₁ t₂ : list α} (s) : s ++ t₁ = s ++ t₂ ↔ t₁ = t₂ :=
457457
(append_right_injective s).eq_iff
458458

459-
theorem append_left_injective (t : list α) : function.injective (λ s, s ++ t) :=
459+
theorem append_left_injective (t : list α) : injective (λ s, s ++ t) :=
460460
λ s₁ s₂, append_right_cancel
461461

462462
theorem append_left_inj {s₁ s₂ : list α} (t) : s₁ ++ t = s₂ ++ t ↔ s₁ = s₂ :=
@@ -475,7 +475,9 @@ end
475475

476476
/-! ### replicate -/
477477

478+
@[simp] theorem replicate_zero (a : α) : replicate 0 a = [] := rfl
478479
@[simp] theorem replicate_succ (a : α) (n) : replicate (n + 1) a = a :: replicate n a := rfl
480+
theorem replicate_one (a : α) : replicate 1 a = [a] := rfl
479481

480482
@[simp] theorem length_replicate : ∀ n (a : α), length (replicate n a) = n
481483
| 0 a := rfl
@@ -498,16 +500,19 @@ theorem eq_replicate {a : α} {n} {l : list α} : l = replicate n a ↔ length l
498500
⟨λ h, h.symm ▸ ⟨length_replicate _ _, λ b, eq_of_mem_replicate⟩,
499501
λ ⟨e, al⟩, e ▸ eq_replicate_of_mem al⟩
500502

501-
theorem replicate_add (a : α) (m n) : replicate (m + n) a = replicate m a ++ replicate n a :=
503+
theorem replicate_add (m n) (a : α) : replicate (m + n) a = replicate m a ++ replicate n a :=
502504
by induction m; simp only [*, zero_add, succ_add, replicate]; refl
503505

504-
theorem replicate_subset_singleton (a : α) (n) : replicate n a ⊆ [a] :=
506+
theorem replicate_succ' (n) (a : α) : replicate (n + 1) a = replicate n a ++ [a] :=
507+
replicate_add n 1 a
508+
509+
theorem replicate_subset_singleton (n) (a : α) : replicate n a ⊆ [a] :=
505510
λ b h, mem_singleton.2 (eq_of_mem_replicate h)
506511

507512
lemma subset_singleton_iff {a : α} {L : list α} : L ⊆ [a] ↔ ∃ n, L = replicate n a :=
508513
by simp only [eq_replicate, subset_def, mem_singleton, exists_eq_left']
509514

510-
@[simp] theorem map_replicate (f : α → β) (a : α) (n) : map f (replicate n a) = replicate n (f a) :=
515+
@[simp] theorem map_replicate (f : α → β) (n a) : map f (replicate n a) = replicate n (f a) :=
511516
by induction n; [refl, simp only [*, replicate, map]]; split; refl
512517

513518
@[simp] theorem tail_replicate (n) (a : α) : tail (replicate n a) = replicate (n - 1) a :=
@@ -516,8 +521,7 @@ by cases n; refl
516521
@[simp] theorem join_replicate_nil (n : ℕ) : join (replicate n []) = @nil α :=
517522
by induction n; [refl, simp only [*, replicate, join, append_nil]]
518523

519-
lemma replicate_right_injective {n : ℕ} (hn : n ≠ 0) :
520-
function.injective (replicate n : α → list α) :=
524+
lemma replicate_right_injective {n : ℕ} (hn : n ≠ 0) : injective (replicate n : α → list α) :=
521525
λ _ _ h, (eq_replicate.1 h).2 _ $ mem_replicate.2 ⟨hn, rfl⟩
522526

523527
lemma replicate_right_inj {a b : α} {n : ℕ} (hn : n ≠ 0) :
@@ -529,8 +533,8 @@ lemma replicate_right_inj {a b : α} {n : ℕ} (hn : n ≠ 0) :
529533
| 0 := by simp
530534
| (n + 1) := (replicate_right_inj n.succ_ne_zero).trans $ by simp only [n.succ_ne_zero, false_or]
531535

532-
lemma replicate_left_injective (a : α) : function.injective (λ n, replicate n a) :=
533-
function.left_inverse.injective (λ n, length_replicate n a)
536+
lemma replicate_left_injective (a : α) : injective (λ n, replicate n a) :=
537+
left_inverse.injective (λ n, length_replicate n a)
534538

535539
@[simp] lemma replicate_left_inj {a : α} {n m : ℕ} :
536540
replicate n a = replicate m a ↔ n = m :=
@@ -660,8 +664,8 @@ by simp only [reverse_core_eq, map_append, map_reverse]
660664
by induction l; [refl, simp only [*, reverse_cons, mem_append, mem_singleton, mem_cons_iff,
661665
not_mem_nil, false_or, or_false, or_comm]]
662666

663-
@[simp] theorem reverse_replicate (a : α) (n) : reverse (replicate n a) = replicate n a :=
664-
eq_replicate.2by simp only [length_reverse, length_replicate],
667+
@[simp] theorem reverse_replicate (n) (a : α) : reverse (replicate n a) = replicate n a :=
668+
eq_replicate.2by rw [length_reverse, length_replicate],
665669
λ b h, eq_of_mem_replicate (mem_reverse.1 h)⟩
666670

667671
/-! ### empty -/
@@ -729,12 +733,11 @@ theorem last_mem : ∀ {l : list α} (h : l ≠ []), last l h ∈ l
729733
| [a] h := or.inl rfl
730734
| (a::b::l) h := or.inr $ by { rw [last_cons_cons], exact last_mem (cons_ne_nil b l) }
731735

732-
lemma last_replicate_succ (a m : ℕ) :
736+
lemma last_replicate_succ (m : ℕ) (a : α) :
733737
(replicate (m + 1) a).last (ne_nil_of_length_eq_succ (length_replicate (m + 1) a)) = a :=
734738
begin
735-
induction m with k IH,
736-
{ simp },
737-
{ simpa only [replicate_succ, last] }
739+
simp only [replicate_succ'],
740+
exact last_append_singleton _
738741
end
739742

740743
/-! ### last' -/
@@ -1796,12 +1799,13 @@ lemma map_eq_replicate_iff {l : list α} {f : α → β} {b : β} :
17961799
l.map f = replicate l.length b ↔ (∀ x ∈ l, f x = b) :=
17971800
by simp [eq_replicate]
17981801

1799-
@[simp]
1800-
theorem map_const (l : list α) (b : β) : map (function.const α b) l = replicate l.length b :=
1802+
@[simp] theorem map_const (l : list α) (b : β) : map (const α b) l = replicate l.length b :=
18011803
map_eq_replicate_iff.mpr (λ x _, rfl)
18021804

1803-
theorem eq_of_mem_map_const {b₁ b₂ : β} {l : list α} (h : b₁ ∈ map (function.const α b₂) l) :
1804-
b₁ = b₂ :=
1805+
-- Not a `simp` lemma because `function.const` is reducible in Lean 3
1806+
theorem map_const' (l : list α) (b : β) : map (λ _, b) l = replicate l.length b := map_const l b
1807+
1808+
theorem eq_of_mem_map_const {b₁ b₂ : β} {l : list α} (h : b₁ ∈ map (const α b₂) l) : b₁ = b₂ :=
18051809
by rw map_const at h; exact eq_of_mem_replicate h
18061810

18071811
/-! ### map₂ -/

src/data/list/big_operators/basic.lean

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ lemma prod_eq_foldr : l.prod = foldr (*) 1 l :=
5151
list.rec_on l rfl $ λ a l ihl, by rw [prod_cons, foldr_cons, ihl]
5252

5353
@[simp, priority 500, to_additive]
54-
theorem prod_replicate (a : M) (n : ) : (replicate n a).prod = a ^ n :=
54+
theorem prod_replicate (n : ) (a : M) : (replicate n a).prod = a ^ n :=
5555
begin
5656
induction n with n ih,
5757
{ rw pow_zero, refl },
@@ -94,13 +94,8 @@ l.prod_hom₂ (*) mul_mul_mul_comm (mul_one _) _ _
9494
@[simp]
9595
lemma prod_map_neg {α} [comm_monoid α] [has_distrib_neg α] (l : list α) :
9696
(l.map has_neg.neg).prod = (-1) ^ l.length * l.prod :=
97-
begin
98-
convert @prod_map_mul α α _ l (λ _, -1) id,
99-
{ ext, rw neg_one_mul, refl },
100-
{ rw [← prod_replicate, map_eq_replicate_iff.2],
101-
exact λ _ _, rfl },
102-
{ rw l.map_id },
103-
end
97+
by simpa only [id, neg_mul, one_mul, map_const', prod_replicate, map_id]
98+
using @prod_map_mul α α _ l (λ _, -1) id
10499

105100
@[to_additive]
106101
lemma prod_map_hom (L : list ι) (f : ι → M) {G : Type*} [monoid_hom_class G M N] (g : G) :
@@ -478,7 +473,7 @@ lemma prod_map_erase [decidable_eq ι] [comm_monoid M] (f : ι → M) {a} :
478473
mul_left_comm (f a) (f b)], }
479474
end
480475

481-
@[simp] lemma sum_const_nat (m n : ℕ) : sum (replicate m n) = m * n :=
476+
lemma sum_const_nat (m n : ℕ) : sum (replicate m n) = m * n :=
482477
by rw [sum_replicate, smul_eq_mul]
483478

484479
/-- The product of a list of positive natural numbers is positive,

src/data/list/count.lean

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,15 @@ begin
174174
exacts [h ▸ count_replicate_self _ _, count_eq_zero_of_not_mem $ mt eq_of_mem_replicate h]
175175
end
176176

177+
theorem filter_eq (l : list α) (a : α) : l.filter (eq a) = replicate (count a l) a :=
178+
by simp [eq_replicate, count, countp_eq_length_filter, @eq_comm _ _ a]
179+
180+
theorem filter_eq' (l : list α) (a : α) : l.filter (λ x, x = a) = replicate (count a l) a :=
181+
by simp only [filter_eq, @eq_comm _ _ a]
182+
177183
lemma le_count_iff_replicate_sublist {a : α} {l : list α} {n : ℕ} :
178184
n ≤ count a l ↔ replicate n a <+ l :=
179-
⟨λ h, ((replicate_sublist_replicate a).2 h).trans $
180-
have filter (eq a) l = replicate (count a l) a, from eq_replicate.2
181-
by simp only [count, countp_eq_length_filter], λ b m, (of_mem_filter m).symm⟩,
182-
by rw ← this; apply filter_sublist,
185+
⟨λ h, ((replicate_sublist_replicate a).2 h).trans $ filter_eq l a ▸ filter_sublist _,
183186
λ h, by simpa only [count_replicate_self] using h.count_le a⟩
184187

185188
lemma replicate_count_eq_of_count_eq_length {a : α} {l : list α} (h : count a l = length l) :

src/data/list/perm.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,21 +150,21 @@ theorem perm_cons_append_cons {l l₁ l₂ : list α} (a : α) (p : l ~ l₁++l
150150
a::l ~ l₁++(a::l₂) :=
151151
(p.cons a).trans perm_middle.symm
152152

153-
@[simp] theorem perm_replicate {a : α} {n : } {l : list α} :
153+
@[simp] theorem perm_replicate {n : } {a : α} {l : list α} :
154154
l ~ replicate n a ↔ l = replicate n a :=
155155
⟨λ p, eq_replicate.2
156156
⟨p.length_eq.trans $ length_replicate _ _, λ b m, eq_of_mem_replicate $ p.subset m⟩,
157157
λ h, h ▸ perm.refl _⟩
158158

159-
@[simp] theorem replicate_perm {a : α} {n : } {l : list α} :
159+
@[simp] theorem replicate_perm {n : } {a : α} {l : list α} :
160160
replicate n a ~ l ↔ replicate n a = l :=
161161
(perm_comm.trans perm_replicate).trans eq_comm
162162

163163
@[simp] theorem perm_singleton {a : α} {l : list α} : l ~ [a] ↔ l = [a] :=
164-
@perm_replicate α a 1 l
164+
@perm_replicate α 1 a l
165165

166166
@[simp] theorem singleton_perm {a : α} {l : list α} : [a] ~ l ↔ [a] = l :=
167-
@replicate_perm α a 1 l
167+
@replicate_perm α 1 a l
168168

169169
alias perm_singleton ↔ perm.eq_singleton _
170170
alias singleton_perm ↔ perm.singleton_eq _

src/data/multiset/basic.lean

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -623,20 +623,21 @@ instance is_well_founded_lt : _root_.well_founded_lt (multiset α) := ⟨well_fo
623623
/-- `replicate n a` is the multiset containing only `a` with multiplicity `n`. -/
624624
def replicate (n : ℕ) (a : α) : multiset α := replicate n a
625625

626-
lemma coe_replicate (a : α) (n : ) : (list.replicate n a : multiset α) = replicate n a := rfl
626+
lemma coe_replicate (n : ) (a : α) : (list.replicate n a : multiset α) = replicate n a := rfl
627627

628628
@[simp] lemma replicate_zero (a : α) : replicate 0 a = 0 := rfl
629+
@[simp] lemma replicate_succ (a : α) (n) : replicate (n + 1) a = a ::ₘ replicate n a := rfl
629630

630-
@[simp] lemma replicate_succ (a : α) (n) : replicate (n+1) a = a ::ₘ replicate n a := rfl
631-
632-
lemma replicate_add (a : α) (m n : ℕ) : replicate (m + n) a = replicate m a + replicate n a :=
631+
lemma replicate_add (m n : ℕ) (a : α) : replicate (m + n) a = replicate m a + replicate n a :=
633632
congr_arg _ $ list.replicate_add _ _ _
634633

635634
/-- `multiset.replicate` as an `add_monoid_hom`. -/
636635
@[simps] def replicate_add_monoid_hom (a : α) : ℕ →+ multiset α :=
637-
{ to_fun := λ n, replicate n a, map_zero' := replicate_zero a, map_add' := replicate_add a }
636+
{ to_fun := λ n, replicate n a,
637+
map_zero' := replicate_zero a,
638+
map_add' := λ _ _, replicate_add _ _ a }
638639

639-
@[simp] lemma replicate_one (a : α) : replicate 1 a = {a} := rfl
640+
lemma replicate_one (a : α) : replicate 1 a = {a} := rfl
640641

641642
@[simp] lemma card_replicate : ∀ n (a : α), card (replicate n a) = n := length_replicate
642643

@@ -645,7 +646,7 @@ lemma mem_replicate {a b : α} {n : ℕ} : b ∈ replicate n a ↔ n ≠ 0 ∧ b
645646
theorem eq_of_mem_replicate {a b : α} {n} : b ∈ replicate n a → b = a := eq_of_mem_replicate
646647

647648
theorem eq_replicate_card {a : α} {s : multiset α} : s = replicate s.card a ↔ ∀ b ∈ s, b = a :=
648-
quot.induction_on s $ λ l, coe_eq_coe.trans $ perm_replicate.trans $ eq_replicate_length
649+
quot.induction_on s $ λ l, coe_eq_coe.trans $ perm_replicate.trans eq_replicate_length
649650

650651
alias eq_replicate_card ↔ _ eq_replicate_of_mem
651652

@@ -665,7 +666,7 @@ lemma replicate_right_injective {n : ℕ} (hn : n ≠ 0) :
665666
theorem replicate_left_injective (a : α) : function.injective (λ n, replicate n a) :=
666667
λ m n h, by rw [← (eq_replicate.1 h).1, card_replicate]
667668

668-
theorem replicate_subset_singleton : ∀ (a : α) n, replicate n a ⊆ {a} := replicate_subset_singleton
669+
theorem replicate_subset_singleton : ∀ n (a : α), replicate n a ⊆ {a} := replicate_subset_singleton
669670

670671
theorem replicate_le_coe {a : α} {n} {l : list α} :
671672
replicate n a ≤ l ↔ list.replicate n a <+ l :=
@@ -940,6 +941,9 @@ quot.induction_on s $ λ l, congr_arg coe $ map_id _
940941
map (function.const α b) s = replicate s.card b :=
941942
quot.induction_on s $ λ l, congr_arg coe $ map_const _ _
942943

944+
-- Not a `simp` lemma because `function.const` is reducibel in Lean 3
945+
theorem map_const' (s : multiset α) (b : β) : map (λ _, b) s = replicate s.card b := map_const s b
946+
943947
theorem eq_of_mem_map_const {b₁ b₂ : β} {l : list α} (h : b₁ ∈ map (function.const α b₂) l) :
944948
b₁ = b₂ :=
945949
eq_of_mem_replicate $ by rwa map_const at h
@@ -1902,16 +1906,12 @@ calc m.attach.count a
19021906
... = m.count (a : α) : congr_arg _ m.attach_map_coe
19031907

19041908
lemma filter_eq' (s : multiset α) (b : α) : s.filter (= b) = replicate (count b s) b :=
1905-
begin
1906-
ext a,
1907-
rw [count_replicate, count_filter],
1908-
exact if_ctx_congr iff.rfl (λ h, congr_arg _ h) (λ h, rfl),
1909-
end
1909+
quotient.induction_on s $ λ l, congr_arg coe $ filter_eq' l b
19101910

19111911
lemma filter_eq (s : multiset α) (b : α) : s.filter (eq b) = replicate (count b s) b :=
19121912
by simp_rw [←filter_eq', eq_comm]
19131913

1914-
@[simp] lemma replicate_inter (x : α) (n : ) (s : multiset α) :
1914+
@[simp] lemma replicate_inter (n : ) (x : α) (s : multiset α) :
19151915
replicate n x ∩ s = replicate (min n (s.count x)) x :=
19161916
begin
19171917
ext y,

src/data/nat/digits.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,7 @@ begin
347347
{ cases hm rfl },
348348
{ simp } },
349349
{ cases m, { cases hm rfl },
350-
simp_rw [digits_one, list.last_replicate_succ 1 m],
351-
norm_num },
350+
simpa only [digits_one, list.last_replicate_succ m 1] using one_ne_zero },
352351
revert hm,
353352
apply nat.strong_induction_on m,
354353
intros n IH hn,

src/data/nat/factors.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ lemma prime.factors_pow {p : ℕ} (hp : p.prime) (n : ℕ) :
158158
begin
159159
symmetry,
160160
rw ← list.replicate_perm,
161-
apply nat.factors_unique (list.prod_replicate p n),
161+
apply nat.factors_unique (list.prod_replicate n p),
162162
intros q hq,
163163
rwa eq_of_mem_replicate hq,
164164
end
@@ -168,7 +168,7 @@ lemma eq_prime_pow_of_unique_prime_dvd {n p : ℕ} (hpos : n ≠ 0)
168168
n = p ^ n.factors.length :=
169169
begin
170170
set k := n.factors.length,
171-
rw [←prod_factors hpos, ←prod_replicate p k,
171+
rw [← prod_factors hpos, ← prod_replicate k p,
172172
eq_replicate_of_mem (λ d hd, h (prime_of_mem_factors hd) (dvd_of_mem_factors hd))],
173173
end
174174

0 commit comments

Comments
 (0)