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

Commit d6dd451

Browse files
committed
chore(data/list/basic): use dot notation here and there (#10056)
### Renamed lemmas - `list.cons_sublist_cons` → `list.sublist.cons_cons`; - `list.infix_of_prefix` → `list.is_prefix.is_infix`; - `list.infix_of_suffix` → `list.is_suffix.is_infix`; - `list.sublist_of_infix` → `list.is_infix.sublist`; - `list.sublist_of_prefix` → `list.is_prefix.sublist`; - `list.sublist_of_suffix` → `list.is_suffix.sublist`; - `list.length_le_of_infix` → `list.is_infix.length_le`. ### New `simp` attrs `list.singleton_sublist`, `list.repeat_sublist_repeat`, `list.reverse_suffix`, `list.reverse_prefix`. ### New lemmas `list.infix_insert`, `list.sublist_insert`, `list.subset_insert`.
1 parent 76f13b3 commit d6dd451

File tree

7 files changed

+49
-44
lines changed

7 files changed

+49
-44
lines changed

src/data/list/basic.lean

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -898,12 +898,12 @@ sublist.cons _ _ _ (sublist.refl l)
898898
theorem sublist_of_cons_sublist {a : α} {l₁ l₂ : list α} : a::l₁ <+ l₂ → l₁ <+ l₂ :=
899899
sublist.trans (sublist_cons a l₁)
900900

901-
theorem cons_sublist_cons {l₁ l₂ : list α} (a : α) (s : l₁ <+ l₂) : a::l₁ <+ a::l₂ :=
901+
theorem sublist.cons_cons {l₁ l₂ : list α} (a : α) (s : l₁ <+ l₂) : a::l₁ <+ a::l₂ :=
902902
sublist.cons2 _ _ _ s
903903

904904
@[simp] theorem sublist_append_left : Π (l₁ l₂ : list α), l₁ <+ l₁++l₂
905905
| [] l₂ := nil_sublist _
906-
| (a::l₁) l₂ := cons_sublist_cons _ (sublist_append_left l₁ l₂)
906+
| (a::l₁) l₂ := (sublist_append_left l₁ l₂).cons_cons _
907907

908908
@[simp] theorem sublist_append_right : Π (l₁ l₂ : list α), l₂ <+ l₁++l₂
909909
| [] l₂ := sublist.refl _
@@ -923,7 +923,7 @@ theorem sublist_of_cons_sublist_cons {l₁ l₂ : list α} : ∀ {a : α}, a::l
923923
| ._ (sublist.cons2 ._ ._ a s) := s
924924

925925
theorem cons_sublist_cons_iff {l₁ l₂ : list α} {a : α} : a::l₁ <+ a::l₂ ↔ l₁ <+ l₂ :=
926-
⟨sublist_of_cons_sublist_cons, cons_sublist_cons _⟩
926+
⟨sublist_of_cons_sublist_cons, sublist.cons_cons _⟩
927927

928928
@[simp] theorem append_sublist_append_left {l₁ l₂ : list α} : ∀ l, l++l₁ <+ l++l₂ ↔ l₁ <+ l₂
929929
| [] := iff.rfl
@@ -934,7 +934,7 @@ begin
934934
induction h with _ _ a _ ih _ _ a _ ih,
935935
{ refl },
936936
{ apply sublist_cons_of_sublist a ih },
937-
{ apply cons_sublist_cons a ih }
937+
{ apply ih.cons_cons a }
938938
end
939939

940940
theorem sublist_or_mem_of_sublist {l l₁ l₂ : list α} {a : α} (h : l <+ l₁ ++ a::l₂) :
@@ -944,7 +944,7 @@ begin
944944
{ cases h, { left, exact ‹l <+ l₂› }, { right, apply mem_cons_self } },
945945
{ cases h with _ _ _ h _ _ _ h,
946946
{ exact or.imp_left (sublist_cons_of_sublist _) (IH h) },
947-
{ exact (IH h).imp (cons_sublist_cons _) (mem_cons_of_mem _) } }
947+
{ exact (IH h).imp (sublist.cons_cons _) (mem_cons_of_mem _) } }
948948
end
949949

950950
theorem sublist.reverse {l₁ l₂ : list α} (h : l₁ <+ l₂) : l₁.reverse <+ l₂.reverse :=
@@ -975,18 +975,18 @@ theorem sublist.subset : Π {l₁ l₂ : list α}, l₁ <+ l₂ → l₁ ⊆ l
975975
| or.inr h := mem_cons_of_mem _ (sublist.subset s h)
976976
end
977977

978-
theorem singleton_sublist {a : α} {l} : [a] <+ l ↔ a ∈ l :=
978+
@[simp] theorem singleton_sublist {a : α} {l} : [a] <+ l ↔ a ∈ l :=
979979
⟨λ h, h.subset (mem_singleton_self _), λ h,
980980
let ⟨s, t, e⟩ := mem_split h in e.symm ▸
981-
(cons_sublist_cons _ (nil_sublist _)).trans (sublist_append_right _ _)⟩
981+
((nil_sublist _).cons_cons _ ).trans (sublist_append_right _ _)⟩
982982

983983
theorem eq_nil_of_sublist_nil {l : list α} (s : l <+ []) : l = [] :=
984984
eq_nil_of_subset_nil $ s.subset
985985

986986
@[simp] theorem sublist_nil_iff_eq_nil {l : list α} : l <+ [] ↔ l = [] :=
987987
⟨eq_nil_of_sublist_nil, λ H, H ▸ sublist.refl _⟩
988988

989-
theorem repeat_sublist_repeat (a : α) {m n} : repeat a m <+ repeat a n ↔ m ≤ n :=
989+
@[simp] theorem repeat_sublist_repeat (a : α) {m n} : repeat a m <+ repeat a n ↔ m ≤ n :=
990990
⟨λ h, by simpa only [length_repeat] using length_le_of_sublist h,
991991
λ h, by induction h; [refl, simp only [*, repeat_succ, sublist.cons]] ⟩
992992

@@ -1010,7 +1010,7 @@ instance decidable_sublist [decidable_eq α] : ∀ (l₁ l₂ : list α), decida
10101010
| (a::l₁) (b::l₂) :=
10111011
if h : a = b then
10121012
decidable_of_decidable_of_iff (decidable_sublist l₁ l₂) $
1013-
by rw [← h]; exact ⟨cons_sublist_cons _, sublist_of_cons_sublist_cons⟩
1013+
by rw [← h]; exact ⟨sublist.cons_cons _, sublist_of_cons_sublist_cons⟩
10141014
else decidable_of_decidable_of_iff (decidable_sublist (a::l₁) l₂)
10151015
⟨sublist_cons_of_sublist _, λs, match a, l₁, s, h with
10161016
| a, l₁, sublist.cons ._ ._ ._ s', h := s'
@@ -3433,7 +3433,7 @@ begin
34333433
{ refl },
34343434
{ by_cases hp : p hd,
34353435
{ rw [filter_cons_of_pos _ hp, filter_cons_of_pos _ (h _ hp)],
3436-
exact cons_sublist_cons hd IH },
3436+
exact IH.cons_cons hd },
34373437
{ rw filter_cons_of_neg _ hp,
34383438
by_cases hq : q hd,
34393439
{ rw filter_cons_of_pos _ hq,
@@ -3618,15 +3618,15 @@ theorem nil_suffix (l : list α) : [] <:+ l := ⟨l, append_nil _⟩
36183618

36193619
theorem prefix_concat (a : α) (l) : l <+: concat l a := by simp
36203620

3621-
theorem infix_of_prefix {l₁ l₂ : list α} : l₁ <+: l₂ → l₁ <:+: l₂ :=
3621+
theorem is_prefix.is_infix {l₁ l₂ : list α} : l₁ <+: l₂ → l₁ <:+: l₂ :=
36223622
λ⟨t, h⟩, ⟨[], t, h⟩
36233623

3624-
theorem infix_of_suffix {l₁ l₂ : list α} : l₁ <:+ l₂ → l₁ <:+: l₂ :=
3624+
theorem is_suffix.is_infix {l₁ l₂ : list α} : l₁ <:+ l₂ → l₁ <:+: l₂ :=
36253625
λ⟨t, h⟩, ⟨t, [], by simp only [h, append_nil]⟩
36263626

3627-
@[refl] theorem infix_refl (l : list α) : l <:+: l := infix_of_prefix $ prefix_refl l
3627+
@[refl] theorem infix_refl (l : list α) : l <:+: l := (prefix_refl l).is_infix
36283628

3629-
theorem nil_infix (l : list α) : [] <:+: l := infix_of_prefix $ nil_prefix l
3629+
theorem nil_infix (l : list α) : [] <:+: l := (nil_prefix l).is_infix
36303630

36313631
theorem infix_cons {L₁ L₂ : list α} {x : α} : L₁ <:+: L₂ → L₁ <:+: x :: L₂ :=
36323632
λ⟨LP, LS, H⟩, ⟨x :: LP, LS, H ▸ rfl⟩
@@ -3640,40 +3640,40 @@ theorem infix_cons {L₁ L₂ : list α} {x : α} : L₁ <:+: L₂ → L₁ <:+:
36403640
@[trans] theorem is_infix.trans : ∀ {l₁ l₂ l₃ : list α}, l₁ <:+: l₂ → l₂ <:+: l₃ → l₁ <:+: l₃
36413641
| l ._ ._ ⟨l₁, r₁, rfl⟩ ⟨l₂, r₂, rfl⟩ := ⟨l₂ ++ l₁, r₁ ++ r₂, by simp only [append_assoc]⟩
36423642

3643-
theorem sublist_of_infix {l₁ l₂ : list α} : l₁ <:+: l₂ → l₁ <+ l₂ :=
3644-
λ⟨s, t, h⟩, by rw [← h]; exact (sublist_append_right _ _).trans (sublist_append_left _ _)
3643+
protected theorem is_infix.sublist {l₁ l₂ : list α} : l₁ <:+: l₂ → l₁ <+ l₂ :=
3644+
λ ⟨s, t, h⟩, by rw [← h]; exact (sublist_append_right _ _).trans (sublist_append_left _ _)
36453645

3646-
theorem sublist_of_prefix {l₁ l₂ : list α} : l₁ <+: l₂ l₁ <+ l₂ :=
3647-
sublist_of_infix ∘ infix_of_prefix
3646+
protected theorem is_prefix.sublist {l₁ l₂ : list α} (h : l₁ <+: l₂) : l₁ <+ l₂ :=
3647+
h.is_infix.sublist
36483648

3649-
theorem sublist_of_suffix {l₁ l₂ : list α} : l₁ <:+ l₂ l₁ <+ l₂ :=
3650-
sublist_of_infix ∘ infix_of_suffix
3649+
protected theorem is_suffix.sublist {l₁ l₂ : list α} (h : l₁ <:+ l₂) : l₁ <+ l₂ :=
3650+
h.is_infix.sublist
36513651

3652-
theorem reverse_suffix {l₁ l₂ : list α} : reverse l₁ <:+ reverse l₂ ↔ l₁ <+: l₂ :=
3652+
@[simp] theorem reverse_suffix {l₁ l₂ : list α} : reverse l₁ <:+ reverse l₂ ↔ l₁ <+: l₂ :=
36533653
⟨λ ⟨r, e⟩, ⟨reverse r,
36543654
by rw [← reverse_reverse l₁, ← reverse_append, e, reverse_reverse]⟩,
36553655
λ ⟨r, e⟩, ⟨reverse r, by rw [← reverse_append, e]⟩⟩
36563656

3657-
theorem reverse_prefix {l₁ l₂ : list α} : reverse l₁ <+: reverse l₂ ↔ l₁ <:+ l₂ :=
3657+
@[simp] theorem reverse_prefix {l₁ l₂ : list α} : reverse l₁ <+: reverse l₂ ↔ l₁ <:+ l₂ :=
36583658
by rw ← reverse_suffix; simp only [reverse_reverse]
36593659

3660-
theorem length_le_of_infix {l₁ l₂ : list α} (s : l₁ <:+: l₂) : length l₁ ≤ length l₂ :=
3661-
length_le_of_sublist $ sublist_of_infix s
3660+
theorem infix.length_le {l₁ l₂ : list α} (s : l₁ <:+: l₂) : length l₁ ≤ length l₂ :=
3661+
length_le_of_sublist s.sublist
36623662

36633663
theorem eq_nil_of_infix_nil {l : list α} (s : l <:+: []) : l = [] :=
3664-
eq_nil_of_sublist_nil $ sublist_of_infix s
3664+
eq_nil_of_sublist_nil s.sublist
36653665

36663666
@[simp] theorem eq_nil_iff_infix_nil {l : list α} : l <:+: [] ↔ l = [] :=
36673667
⟨eq_nil_of_infix_nil, λ h, h ▸ infix_refl _⟩
36683668

36693669
theorem eq_nil_of_prefix_nil {l : list α} (s : l <+: []) : l = [] :=
3670-
eq_nil_of_infix_nil $ infix_of_prefix s
3670+
eq_nil_of_infix_nil s.is_infix
36713671

36723672
@[simp] theorem eq_nil_iff_prefix_nil {l : list α} : l <+: [] ↔ l = [] :=
36733673
⟨eq_nil_of_prefix_nil, λ h, h ▸ prefix_refl _⟩
36743674

36753675
theorem eq_nil_of_suffix_nil {l : list α} (s : l <:+ []) : l = [] :=
3676-
eq_nil_of_infix_nil $ infix_of_suffix s
3676+
eq_nil_of_infix_nil s.is_infix
36773677

36783678
@[simp] theorem eq_nil_iff_suffix_nil {l : list α} : l <:+ [] ↔ l = [] :=
36793679
⟨eq_nil_of_suffix_nil, λ h, h ▸ suffix_refl _⟩
@@ -3684,18 +3684,18 @@ theorem infix_iff_prefix_suffix (l₁ l₂ : list α) : l₁ <:+: l₂ ↔ ∃ t
36843684

36853685
theorem eq_of_infix_of_length_eq {l₁ l₂ : list α} (s : l₁ <:+: l₂) :
36863686
length l₁ = length l₂ → l₁ = l₂ :=
3687-
eq_of_sublist_of_length_eq $ sublist_of_infix s
3687+
eq_of_sublist_of_length_eq s.sublist
36883688

36893689
theorem eq_of_prefix_of_length_eq {l₁ l₂ : list α} (s : l₁ <+: l₂) :
36903690
length l₁ = length l₂ → l₁ = l₂ :=
3691-
eq_of_sublist_of_length_eq $ sublist_of_prefix s
3691+
eq_of_sublist_of_length_eq s.sublist
36923692

36933693
theorem eq_of_suffix_of_length_eq {l₁ l₂ : list α} (s : l₁ <:+ l₂) :
36943694
length l₁ = length l₂ → l₁ = l₂ :=
3695-
eq_of_sublist_of_length_eq $ sublist_of_suffix s
3695+
eq_of_sublist_of_length_eq s.sublist
36963696

36973697
theorem prefix_of_prefix_length_le : ∀ {l₁ l₂ l₃ : list α},
3698-
l₁ <+: l₃ → l₂ <+: l₃ → length l₁ ≤ length l₂ → l₁ <+: l₂
3698+
l₁ <+: l₃ → l₂ <+: l₃ → length l₁ ≤ length l₂ → l₁ <+: l₂
36993699
| [] l₂ l₃ h₁ h₂ _ := nil_prefix _
37003700
| (a::l₁) (b::l₂) _ ⟨r₁, rfl⟩ ⟨r₂, e⟩ ll := begin
37013701
injection e with _ e', subst b,
@@ -3736,7 +3736,7 @@ end
37363736
theorem infix_of_mem_join : ∀ {L : list (list α)} {l}, l ∈ L → l <:+: join L
37373737
| (_ :: L) l (or.inl rfl) := infix_append [] _ _
37383738
| (l' :: L) l (or.inr h) :=
3739-
is_infix.trans (infix_of_mem_join h) $ infix_of_suffix $ suffix_append _ _
3739+
is_infix.trans (infix_of_mem_join h) $ (suffix_append _ _).is_infix
37403740

37413741
theorem prefix_append_right_inj {l₁ l₂ : list α} (l) : l ++ l₁ <+: l ++ l₂ ↔ l₁ <+: l₂ :=
37423742
exists_congr $ λ r, by rw [append_assoc, append_right_inj]
@@ -3750,7 +3750,7 @@ theorem drop_suffix (n) (l : list α) : drop n l <:+ l := ⟨_, take_append_drop
37503750

37513751
theorem tail_suffix (l : list α) : tail l <:+ l := by rw ← drop_one; apply drop_suffix
37523752

3753-
lemma tail_sublist (l : list α) : l.tail <+ l := sublist_of_suffix (tail_suffix l)
3753+
lemma tail_sublist (l : list α) : l.tail <+ l := (tail_suffix l).sublist
37543754

37553755
theorem tail_subset (l : list α) : tail l ⊆ l := (tail_sublist l).subset
37563756

@@ -3787,11 +3787,11 @@ instance decidable_prefix [decidable_eq α] : ∀ (l₁ l₂ : list α), decidab
37873787
-- Alternatively, use mem_tails
37883788
instance decidable_suffix [decidable_eq α] : ∀ (l₁ l₂ : list α), decidable (l₁ <:+ l₂)
37893789
| [] l₂ := is_true ⟨l₂, append_nil _⟩
3790-
| (a::l₁) [] := is_false $ mt (length_le_of_sublist ∘ sublist_of_suffix) dec_trivial
3790+
| (a::l₁) [] := is_false $ mt (length_le_of_sublist ∘ is_suffix.sublist) dec_trivial
37913791
| l₁ l₂ := let len1 := length l₁, len2 := length l₂ in
37923792
if hl : len1 ≤ len2 then
37933793
decidable_of_iff' (l₁ = drop (len2-len1) l₂) suffix_iff_eq_drop
3794-
else is_false $ λ h, hl $ length_le_of_sublist $ sublist_of_suffix h
3794+
else is_false $ λ h, hl $ length_le_of_sublist $ h.sublist
37953795

37963796
lemma prefix_take_le_iff {L : list (list (option α))} {m n : ℕ} (hm : m < L.length) :
37973797
(take m L) <+: (take n L) ↔ m ≤ n :=
@@ -4014,6 +4014,12 @@ end
40144014
@[simp] theorem suffix_insert (a : α) (l : list α) : l <:+ insert a l :=
40154015
by by_cases a ∈ l; [simp only [insert_of_mem h], simp only [insert_of_not_mem h, suffix_cons]]
40164016

4017+
theorem infix_insert (a : α) (l : list α) : l <:+: insert a l := (suffix_insert a l).is_infix
4018+
4019+
theorem sublist_insert (a : α) (l : list α) : l <+ insert a l := (suffix_insert a l).sublist
4020+
4021+
theorem subset_insert (a : α) (l : list α) : l ⊆ insert a l := (sublist_insert a l).subset
4022+
40174023
@[simp] theorem mem_insert_self (a : α) (l : list α) : a ∈ insert a l :=
40184024
mem_insert_iff.2 (or.inl rfl)
40194025

src/data/list/forall2.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ begin
249249
{ induction h with _ a b l1 l2 rab rll ih b l1 l2 hl ih,
250250
{ exact ⟨nil, forall₂.nil, nil_sublist _⟩ },
251251
{ obtain ⟨l, hl1, hl2⟩ := ih,
252-
refine ⟨b :: l, forall₂.cons rab hl1, cons_sublist_cons b hl2⟩ },
252+
refine ⟨b :: l, forall₂.cons rab hl1, hl2.cons_cons b⟩ },
253253
{ obtain ⟨l, hl1, hl2⟩ := ih,
254254
exact ⟨l, hl1, hl2.trans (sublist.cons _ _ _ (sublist.refl _))⟩ } },
255255
{ obtain ⟨l, hl1, hl2⟩ := h,

src/data/list/lattice.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ lemma sublist_suffix_of_union : ∀ l₁ l₂ : list α, ∃ t, t <+ l₁ ∧ t
130130
| (a :: l₁) l₂ := let ⟨t, s, e⟩ := sublist_suffix_of_union l₁ l₂ in
131131
if h : a ∈ l₁ ∪ l₂
132132
then ⟨t, sublist_cons_of_sublist _ s, by simp only [e, cons_union, insert_of_mem h]⟩
133-
else ⟨a::t, cons_sublist_cons _ s, by simp only [cons_append, cons_union, e, insert_of_not_mem h];
133+
else ⟨a::t, s.cons_cons _, by simp only [cons_append, cons_union, e, insert_of_not_mem h];
134134
split; refl⟩
135135

136136
lemma suffix_union_right (l₁ l₂ : list α) : l₂ <:+ l₁ ∪ l₂ :=
@@ -262,7 +262,7 @@ lemma bag_inter_sublist_left : ∀ l₁ l₂ : list α, l₁.bag_inter l₂ <+ l
262262
| [] l₂ := by simp [nil_sublist]
263263
| (b :: l₁) l₂ := begin
264264
by_cases b ∈ l₂; simp [h],
265-
{ apply cons_sublist_cons, apply bag_inter_sublist_left },
265+
{ exact (bag_inter_sublist_left _ _).cons_cons _ },
266266
{ apply sublist_cons_of_sublist, apply bag_inter_sublist_left }
267267
end
268268

src/data/list/nodup.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ theorem nodup_iff_sublist {l : list α} : nodup l ↔ ∀ a, ¬ [a, a] <+ l :=
6565
⟨λ d a h, not_nodup_pair a (nodup_of_sublist h d), begin
6666
induction l with a l IH; intro h, {exact nodup_nil},
6767
exact nodup_cons_of_nodup
68-
(λ al, h a $ cons_sublist_cons _ $ singleton_sublist.2 al)
68+
(λ al, h a $ (singleton_sublist.2 al).cons_cons _)
6969
(IH $ λ a s, h a $ sublist_cons_of_sublist _ s)
7070
end
7171

src/data/list/pairwise.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ theorem pw_filter_sublist : ∀ (l : list α), pw_filter R l <+ l
360360
| (x :: l) := begin
361361
by_cases (∀ y ∈ pw_filter R l, R x y),
362362
{ rw [pw_filter_cons_of_pos h],
363-
exact cons_sublist_cons _ (pw_filter_sublist l) },
363+
exact (pw_filter_sublist l).cons_cons _ },
364364
{ rw [pw_filter_cons_of_neg h],
365365
exact sublist_cons_of_sublist _ (pw_filter_sublist l) },
366366
end

src/data/list/sublists.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ begin
4949
simp only [sublists'_cons, mem_append, IH, mem_map],
5050
split; intro h, rcases h with h | ⟨s, h, rfl⟩,
5151
{ exact sublist_cons_of_sublist _ h },
52-
{ exact cons_sublist_cons _ h },
52+
{ exact h.cons_cons _ },
5353
{ cases h with _ _ _ h s _ _ h,
5454
{ exact or.inl h },
5555
{ exact or.inr ⟨s, h, rfl⟩ } }

src/data/multiset/finset_ops.lean

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ quot.induction_on s $ λ l h, congr_arg coe $ insert_of_not_mem h
4141
quot.induction_on s $ λ l, mem_insert_iff
4242

4343
@[simp] theorem le_ndinsert_self (a : α) (s : multiset α) : s ≤ ndinsert a s :=
44-
quot.induction_on s $ λ l, (sublist_of_suffix $ suffix_insert _ _).subperm
44+
quot.induction_on s $ λ l, (sublist_insert _ _).subperm
4545

4646
@[simp] theorem mem_ndinsert_self (a : α) (s : multiset α) : a ∈ ndinsert a s :=
4747
mem_ndinsert.2 (or.inl rfl)
@@ -123,8 +123,7 @@ quotient.induction_on₂ s t $ λ l₁ l₂, rfl
123123
quotient.induction_on₂ s t $ λ l₁ l₂, list.mem_union
124124

125125
theorem le_ndunion_right (s t : multiset α) : t ≤ ndunion s t :=
126-
quotient.induction_on₂ s t $ λ l₁ l₂,
127-
(sublist_of_suffix $ suffix_union_right _ _).subperm
126+
quotient.induction_on₂ s t $ λ l₁ l₂, (suffix_union_right _ _).sublist.subperm
128127

129128
theorem subset_ndunion_right (s t : multiset α) : t ⊆ ndunion s t :=
130129
subset_of_le (le_ndunion_right s t)

0 commit comments

Comments
 (0)