@@ -898,12 +898,12 @@ sublist.cons _ _ _ (sublist.refl l)
898
898
theorem sublist_of_cons_sublist {a : α} {l₁ l₂ : list α} : a::l₁ <+ l₂ → l₁ <+ l₂ :=
899
899
sublist.trans (sublist_cons a l₁)
900
900
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₂ :=
902
902
sublist.cons2 _ _ _ s
903
903
904
904
@[simp] theorem sublist_append_left : Π (l₁ l₂ : list α), l₁ <+ l₁++l₂
905
905
| [] 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 _
907
907
908
908
@[simp] theorem sublist_append_right : Π (l₁ l₂ : list α), l₂ <+ l₁++l₂
909
909
| [] l₂ := sublist.refl _
@@ -923,7 +923,7 @@ theorem sublist_of_cons_sublist_cons {l₁ l₂ : list α} : ∀ {a : α}, a::l
923
923
| ._ (sublist.cons2 ._ ._ a s) := s
924
924
925
925
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 _⟩
927
927
928
928
@[simp] theorem append_sublist_append_left {l₁ l₂ : list α} : ∀ l, l++l₁ <+ l++l₂ ↔ l₁ <+ l₂
929
929
| [] := iff.rfl
@@ -934,7 +934,7 @@ begin
934
934
induction h with _ _ a _ ih _ _ a _ ih,
935
935
{ refl },
936
936
{ apply sublist_cons_of_sublist a ih },
937
- { apply cons_sublist_cons a ih }
937
+ { apply ih.cons_cons a }
938
938
end
939
939
940
940
theorem sublist_or_mem_of_sublist {l l₁ l₂ : list α} {a : α} (h : l <+ l₁ ++ a::l₂) :
@@ -944,7 +944,7 @@ begin
944
944
{ cases h, { left, exact ‹l <+ l₂› }, { right, apply mem_cons_self } },
945
945
{ cases h with _ _ _ h _ _ _ h,
946
946
{ 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 _) } }
948
948
end
949
949
950
950
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
975
975
| or.inr h := mem_cons_of_mem _ (sublist.subset s h)
976
976
end
977
977
978
- theorem singleton_sublist {a : α} {l} : [a] <+ l ↔ a ∈ l :=
978
+ @[simp] theorem singleton_sublist {a : α} {l} : [a] <+ l ↔ a ∈ l :=
979
979
⟨λ h, h.subset (mem_singleton_self _), λ h,
980
980
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 _ _)⟩
982
982
983
983
theorem eq_nil_of_sublist_nil {l : list α} (s : l <+ []) : l = [] :=
984
984
eq_nil_of_subset_nil $ s.subset
985
985
986
986
@[simp] theorem sublist_nil_iff_eq_nil {l : list α} : l <+ [] ↔ l = [] :=
987
987
⟨eq_nil_of_sublist_nil, λ H, H ▸ sublist.refl _⟩
988
988
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 :=
990
990
⟨λ h, by simpa only [length_repeat] using length_le_of_sublist h,
991
991
λ h, by induction h; [refl, simp only [*, repeat_succ, sublist.cons]] ⟩
992
992
@@ -1010,7 +1010,7 @@ instance decidable_sublist [decidable_eq α] : ∀ (l₁ l₂ : list α), decida
1010
1010
| (a::l₁) (b::l₂) :=
1011
1011
if h : a = b then
1012
1012
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⟩
1014
1014
else decidable_of_decidable_of_iff (decidable_sublist (a::l₁) l₂)
1015
1015
⟨sublist_cons_of_sublist _, λs, match a, l₁, s, h with
1016
1016
| a, l₁, sublist.cons ._ ._ ._ s', h := s'
@@ -3433,7 +3433,7 @@ begin
3433
3433
{ refl },
3434
3434
{ by_cases hp : p hd,
3435
3435
{ 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 },
3437
3437
{ rw filter_cons_of_neg _ hp,
3438
3438
by_cases hq : q hd,
3439
3439
{ rw filter_cons_of_pos _ hq,
@@ -3618,15 +3618,15 @@ theorem nil_suffix (l : list α) : [] <:+ l := ⟨l, append_nil _⟩
3618
3618
3619
3619
theorem prefix_concat (a : α) (l) : l <+: concat l a := by simp
3620
3620
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₂ :=
3622
3622
λ⟨t, h⟩, ⟨[], t, h⟩
3623
3623
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₂ :=
3625
3625
λ⟨t, h⟩, ⟨t, [], by simp only [h, append_nil]⟩
3626
3626
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
3628
3628
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
3630
3630
3631
3631
theorem infix_cons {L₁ L₂ : list α} {x : α} : L₁ <:+: L₂ → L₁ <:+: x :: L₂ :=
3632
3632
λ⟨LP, LS, H⟩, ⟨x :: LP, LS, H ▸ rfl⟩
@@ -3640,40 +3640,40 @@ theorem infix_cons {L₁ L₂ : list α} {x : α} : L₁ <:+: L₂ → L₁ <:+:
3640
3640
@[trans] theorem is_infix.trans : ∀ {l₁ l₂ l₃ : list α}, l₁ <:+: l₂ → l₂ <:+: l₃ → l₁ <:+: l₃
3641
3641
| l ._ ._ ⟨l₁, r₁, rfl⟩ ⟨l₂, r₂, rfl⟩ := ⟨l₂ ++ l₁, r₁ ++ r₂, by simp only [append_assoc]⟩
3642
3642
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 _ _)
3645
3645
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
3648
3648
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
3651
3651
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₂ :=
3653
3653
⟨λ ⟨r, e⟩, ⟨reverse r,
3654
3654
by rw [← reverse_reverse l₁, ← reverse_append, e, reverse_reverse]⟩,
3655
3655
λ ⟨r, e⟩, ⟨reverse r, by rw [← reverse_append, e]⟩⟩
3656
3656
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₂ :=
3658
3658
by rw ← reverse_suffix; simp only [reverse_reverse]
3659
3659
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
3662
3662
3663
3663
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
3665
3665
3666
3666
@[simp] theorem eq_nil_iff_infix_nil {l : list α} : l <:+: [] ↔ l = [] :=
3667
3667
⟨eq_nil_of_infix_nil, λ h, h ▸ infix_refl _⟩
3668
3668
3669
3669
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
3671
3671
3672
3672
@[simp] theorem eq_nil_iff_prefix_nil {l : list α} : l <+: [] ↔ l = [] :=
3673
3673
⟨eq_nil_of_prefix_nil, λ h, h ▸ prefix_refl _⟩
3674
3674
3675
3675
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
3677
3677
3678
3678
@[simp] theorem eq_nil_iff_suffix_nil {l : list α} : l <:+ [] ↔ l = [] :=
3679
3679
⟨eq_nil_of_suffix_nil, λ h, h ▸ suffix_refl _⟩
@@ -3684,18 +3684,18 @@ theorem infix_iff_prefix_suffix (l₁ l₂ : list α) : l₁ <:+: l₂ ↔ ∃ t
3684
3684
3685
3685
theorem eq_of_infix_of_length_eq {l₁ l₂ : list α} (s : l₁ <:+: l₂) :
3686
3686
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
3688
3688
3689
3689
theorem eq_of_prefix_of_length_eq {l₁ l₂ : list α} (s : l₁ <+: l₂) :
3690
3690
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
3692
3692
3693
3693
theorem eq_of_suffix_of_length_eq {l₁ l₂ : list α} (s : l₁ <:+ l₂) :
3694
3694
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
3696
3696
3697
3697
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₂
3699
3699
| [] l₂ l₃ h₁ h₂ _ := nil_prefix _
3700
3700
| (a::l₁) (b::l₂) _ ⟨r₁, rfl⟩ ⟨r₂, e⟩ ll := begin
3701
3701
injection e with _ e', subst b,
@@ -3736,7 +3736,7 @@ end
3736
3736
theorem infix_of_mem_join : ∀ {L : list (list α)} {l}, l ∈ L → l <:+: join L
3737
3737
| (_ :: L) l (or.inl rfl) := infix_append [] _ _
3738
3738
| (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
3740
3740
3741
3741
theorem prefix_append_right_inj {l₁ l₂ : list α} (l) : l ++ l₁ <+: l ++ l₂ ↔ l₁ <+: l₂ :=
3742
3742
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
3750
3750
3751
3751
theorem tail_suffix (l : list α) : tail l <:+ l := by rw ← drop_one; apply drop_suffix
3752
3752
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
3754
3754
3755
3755
theorem tail_subset (l : list α) : tail l ⊆ l := (tail_sublist l).subset
3756
3756
@@ -3787,11 +3787,11 @@ instance decidable_prefix [decidable_eq α] : ∀ (l₁ l₂ : list α), decidab
3787
3787
-- Alternatively, use mem_tails
3788
3788
instance decidable_suffix [decidable_eq α] : ∀ (l₁ l₂ : list α), decidable (l₁ <:+ l₂)
3789
3789
| [] 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
3791
3791
| l₁ l₂ := let len1 := length l₁, len2 := length l₂ in
3792
3792
if hl : len1 ≤ len2 then
3793
3793
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
3795
3795
3796
3796
lemma prefix_take_le_iff {L : list (list (option α))} {m n : ℕ} (hm : m < L.length) :
3797
3797
(take m L) <+: (take n L) ↔ m ≤ n :=
@@ -4014,6 +4014,12 @@ end
4014
4014
@[simp] theorem suffix_insert (a : α) (l : list α) : l <:+ insert a l :=
4015
4015
by by_cases a ∈ l; [simp only [insert_of_mem h], simp only [insert_of_not_mem h, suffix_cons]]
4016
4016
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
+
4017
4023
@[simp] theorem mem_insert_self (a : α) (l : list α) : a ∈ insert a l :=
4018
4024
mem_insert_iff.2 (or.inl rfl)
4019
4025
0 commit comments