@@ -5,6 +5,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
5
5
Authors: Mario Carneiro, Gabriel Ebner
6
6
-/
7
7
import Batteries.Data.List.Lemmas
8
+ import Batteries.Data.List.FinRange
8
9
import Batteries.Data.Array.Basic
9
10
import Batteries.Tactic.SeqFocus
10
11
import Batteries.Util.ProofWanted
@@ -25,14 +26,6 @@ theorem forIn_eq_forIn_toList [Monad m]
25
26
@[deprecated (since := "2024-09-09")] alias data_zipWith := toList_zipWith
26
27
@[deprecated (since := "2024-08-13")] alias zipWith_eq_zipWith_data := data_zipWith
27
28
28
- @[simp] theorem size_zipWith (as : Array α) (bs : Array β) (f : α → β → γ) :
29
- (as.zipWith bs f).size = min as.size bs.size := by
30
- rw [size_eq_length_toList, toList_zipWith, List.length_zipWith]
31
-
32
- @[simp] theorem size_zip (as : Array α) (bs : Array β) :
33
- (as.zip bs).size = min as.size bs.size :=
34
- as.size_zipWith bs Prod.mk
35
-
36
29
/-! ### filter -/
37
30
38
31
theorem size_filter_le (p : α → Bool) (l : Array α) :
@@ -71,118 +64,153 @@ where
71
64
@[simp] proof_wanted toList_erase [BEq α] {l : Array α} {a : α} :
72
65
(l.erase a).toList = l.toList.erase a
73
66
74
- @[simp] theorem eraseIdx!_eq_eraseIdx (a : Array α) (i : Nat) :
75
- a.eraseIdx! i = a.eraseIdx i := rfl
76
-
77
- @[simp] theorem size_eraseIdx (a : Array α) (i : Nat) :
78
- (a.eraseIdx i).size = if i < a.size then a.size-1 else a.size := by
79
- simp only [eraseIdx]; split; simp; rfl
67
+ @[simp] theorem size_eraseIdxIfInBounds (a : Array α) (i : Nat) :
68
+ (a.eraseIdxIfInBounds i).size = if i < a.size then a.size-1 else a.size := by
69
+ simp only [eraseIdxIfInBounds]; split; simp; rfl
80
70
81
71
/-! ### set -/
82
72
83
73
theorem size_set! (a : Array α) (i v) : (a.set! i v).size = a.size := by simp
84
74
85
75
/-! ### map -/
86
76
87
- theorem mapM_empty [Monad m] (f : α → m β) : mapM f #[] = pure #[] := by
88
- rw [mapM, mapM.map]; rfl
89
-
90
- theorem map_empty (f : α → β) : map f #[] = #[] := mapM_empty f
91
-
92
77
/-! ### mem -/
93
78
94
79
theorem mem_singleton : a ∈ #[b] ↔ a = b := by simp
95
80
96
81
/-! ### insertAt -/
97
82
98
- private theorem size_insertAt_loop (as : Array α) (i : Fin (as.size+ 1 )) (j : Fin bs .size) :
99
- (insertAt .loop as i bs j).size = bs .size := by
100
- unfold insertAt .loop
83
+ @[simp] private theorem size_insertIdx_loop (as : Array α) (i : Nat) (j : Fin as .size) :
84
+ (insertIdx .loop i as j).size = as .size := by
85
+ unfold insertIdx .loop
101
86
split
102
- · rw [size_insertAt_loop , size_swap]
87
+ · rw [size_insertIdx_loop , size_swap]
103
88
· rfl
104
89
105
- @[simp] theorem size_insertAt (as : Array α) (i : Fin (as.size+1 )) (v : α) :
106
- (as.insertAt i v).size = as.size + 1 := by
107
- rw [insertAt, size_insertAt_loop, size_push]
108
-
109
- private theorem get_insertAt_loop_lt (as : Array α) (i : Fin (as.size+1 )) (j : Fin bs.size)
110
- (k) (hk : k < (insertAt.loop as i bs j).size) (h : k < i) :
111
- (insertAt.loop as i bs j)[k] = bs[k]'(size_insertAt_loop .. ▸ hk) := by
112
- unfold insertAt.loop
113
- split
114
- · have h1 : k ≠ j - 1 := by omega
115
- have h2 : k ≠ j := by omega
116
- rw [get_insertAt_loop_lt, getElem_swap, if_neg h1, if_neg h2]
117
- exact h
90
+ @[simp] theorem size_insertIdx (as : Array α) (i : Nat) (h : i ≤ as.size) (v : α) :
91
+ (as.insertIdx i v).size = as.size + 1 := by
92
+ rw [insertIdx, size_insertIdx_loop, size_push]
93
+
94
+ @[deprecated size_insertIdx (since := "2024-11-20")] alias size_insertAt := size_insertIdx
95
+
96
+ theorem getElem_insertIdx_loop_lt {as : Array α} {i : Nat} {j : Fin as.size} {k : Nat} {h}
97
+ (w : k < i) :
98
+ (insertIdx.loop i as j)[k] = as[k]'(by simpa using h) := by
99
+ unfold insertIdx.loop
100
+ split <;> rename_i h₁
101
+ · simp only
102
+ rw [getElem_insertIdx_loop_lt w]
103
+ rw [getElem_swap]
104
+ split <;> rename_i h₂
105
+ · simp_all
106
+ omega
107
+ · split <;> rename_i h₃
108
+ · omega
109
+ · simp_all
118
110
· rfl
119
111
120
- private theorem get_insertAt_loop_gt (as : Array α) (i : Fin (as.size+1 )) (j : Fin bs.size)
121
- (k) (hk : k < (insertAt.loop as i bs j).size) (hgt : j < k) :
122
- (insertAt.loop as i bs j)[k] = bs[k]'(size_insertAt_loop .. ▸ hk) := by
123
- unfold insertAt.loop
124
- split
125
- · have h1 : k ≠ j - 1 := by omega
126
- have h2 : k ≠ j := by omega
127
- rw [get_insertAt_loop_gt, getElem_swap, if_neg h1, if_neg h2]
128
- exact Nat.lt_of_le_of_lt (Nat.pred_le _) hgt
129
- · rfl
130
-
131
- private theorem get_insertAt_loop_eq (as : Array α) (i : Fin (as.size+1 )) (j : Fin bs.size)
132
- (k) (hk : k < (insertAt.loop as i bs j).size) (heq : i = k) (h : i.val ≤ j.val) :
133
- (insertAt.loop as i bs j)[k] = bs[j] := by
134
- unfold insertAt.loop
135
- split
136
- · next h =>
137
- rw [get_insertAt_loop_eq, Fin.getElem_fin, getElem_swap, if_pos rfl]
138
- exact heq
139
- exact Nat.le_pred_of_lt h
140
- · congr; omega
141
-
142
- private theorem get_insertAt_loop_gt_le (as : Array α) (i : Fin (as.size+1 )) (j : Fin bs.size)
143
- (k) (hk : k < (insertAt.loop as i bs j).size) (hgt : i < k) (hle : k ≤ j) :
144
- (insertAt.loop as i bs j)[k] = bs[k-1 ] := by
145
- unfold insertAt.loop
146
- split
147
- · next h =>
148
- if h0 : k = j then
149
- cases h0
150
- have h1 : j.val ≠ j - 1 := by omega
151
- rw [get_insertAt_loop_gt, getElem_swap, if_neg h1, if_pos rfl]; rfl
152
- exact Nat.pred_lt_of_lt hgt
153
- else
154
- have h1 : k - 1 ≠ j - 1 := by omega
155
- have h2 : k - 1 ≠ j := by omega
156
- rw [get_insertAt_loop_gt_le, getElem_swap, if_neg h1, if_neg h2]
157
- apply Nat.le_of_lt_add_one
158
- rw [Nat.sub_one_add_one]
159
- exact Nat.lt_of_le_of_ne hle h0
160
- exact Nat.not_eq_zero_of_lt h
161
- exact hgt
162
- · next h =>
163
- absurd h
164
- exact Nat.lt_of_lt_of_le hgt hle
165
-
166
- theorem getElem_insertAt_lt (as : Array α) (i : Fin (as.size+1 )) (v : α)
167
- (k) (hlt : k < i.val) {hk : k < (as.insertAt i v).size} {hk' : k < as.size} :
168
- (as.insertAt i v)[k] = as[k] := by
169
- simp only [insertAt]
170
- rw [get_insertAt_loop_lt, getElem_push, dif_pos hk']
171
- exact hlt
172
-
173
- theorem getElem_insertAt_gt (as : Array α) (i : Fin (as.size+1 )) (v : α)
174
- (k) (hgt : k > i.val) {hk : k < (as.insertAt i v).size} {hk' : k - 1 < as.size} :
175
- (as.insertAt i v)[k] = as[k - 1 ] := by
176
- simp only [insertAt]
177
- rw [get_insertAt_loop_gt_le, getElem_push, dif_pos hk']
178
- exact hgt
179
- rw [size_insertAt] at hk
180
- exact Nat.le_of_lt_succ hk
181
-
182
- theorem getElem_insertAt_eq (as : Array α) (i : Fin (as.size+1 )) (v : α)
183
- (k) (heq : i.val = k) {hk : k < (as.insertAt i v).size} :
184
- (as.insertAt i v)[k] = v := by
185
- simp only [insertAt]
186
- rw [get_insertAt_loop_eq, Fin.getElem_fin, getElem_push_eq]
187
- exact heq
188
- exact Nat.le_of_lt_succ i.is_lt
112
+ theorem getElem_insertIdx_loop_eq {as : Array α} {i : Nat} {j : Nat} {hj : j < as.size} {h} :
113
+ (insertIdx.loop i as ⟨j, hj⟩)[i] = if i ≤ j then as[j] else as[i]'(by simpa using h) := by
114
+ unfold insertIdx.loop
115
+ split <;> rename_i h₁
116
+ · simp at h₁
117
+ have : j - 1 < j := by omega
118
+ rw [getElem_insertIdx_loop_eq]
119
+ rw [getElem_swap]
120
+ simp
121
+ split <;> rename_i h₂
122
+ · rw [if_pos (by omega)]
123
+ · omega
124
+ · simp at h₁
125
+ by_cases h' : i = j
126
+ · simp [h']
127
+ · have t : ¬ i ≤ j := by omega
128
+ simp [t]
129
+
130
+ theorem getElem_insertIdx_loop_gt {as : Array α} {i : Nat} {j : Nat} {hj : j < as.size}
131
+ {k : Nat} {h} (w : i < k) :
132
+ (insertIdx.loop i as ⟨j, hj⟩)[k] =
133
+ if k ≤ j then as[k-1 ]'(by simp at h; omega) else as[k]'(by simpa using h) := by
134
+ unfold insertIdx.loop
135
+ split <;> rename_i h₁
136
+ · simp only
137
+ simp only at h₁
138
+ have : j - 1 < j := by omega
139
+ rw [getElem_insertIdx_loop_gt w]
140
+ rw [getElem_swap]
141
+ split <;> rename_i h₂
142
+ · rw [if_neg (by omega), if_neg (by omega)]
143
+ have t : k ≤ j := by omega
144
+ simp [t]
145
+ · rw [getElem_swap]
146
+ rw [if_neg (by omega)]
147
+ split <;> rename_i h₃
148
+ · simp [h₃]
149
+ · have t : ¬ k ≤ j := by omega
150
+ simp [t]
151
+ · simp only at h₁
152
+ have t : ¬ k ≤ j := by omega
153
+ simp [t]
154
+
155
+ theorem getElem_insertIdx_loop {as : Array α} {i : Nat} {j : Nat} {hj : j < as.size} {k : Nat} {h} :
156
+ (insertIdx.loop i as ⟨j, hj⟩)[k] =
157
+ if h₁ : k < i then
158
+ as[k]'(by simpa using h)
159
+ else
160
+ if h₂ : k = i then
161
+ if i ≤ j then as[j] else as[i]'(by simpa [h₂] using h)
162
+ else
163
+ if k ≤ j then as[k-1 ]'(by simp at h; omega) else as[k]'(by simpa using h) := by
164
+ split <;> rename_i h₁
165
+ · rw [getElem_insertIdx_loop_lt h₁]
166
+ · split <;> rename_i h₂
167
+ · subst h₂
168
+ rw [getElem_insertIdx_loop_eq]
169
+ · rw [getElem_insertIdx_loop_gt (by omega)]
170
+
171
+ theorem getElem_insertIdx (as : Array α) (i : Nat) (h : i ≤ as.size) (v : α)
172
+ (k) (h' : k < (as.insertIdx i v).size) :
173
+ (as.insertIdx i v)[k] =
174
+ if h₁ : k < i then
175
+ as[k]'(by omega)
176
+ else
177
+ if h₂ : k = i then
178
+ v
179
+ else
180
+ as[k - 1 ]'(by simp at h'; omega) := by
181
+ unfold insertIdx
182
+ rw [getElem_insertIdx_loop]
183
+ simp only [size_insertIdx] at h'
184
+ replace h' : k ≤ as.size := by omega
185
+ simp only [getElem_push, h, ↓reduceIte, Nat.lt_irrefl, ↓reduceDIte, h', dite_eq_ite]
186
+ split <;> rename_i h₁
187
+ · rw [dif_pos (by omega)]
188
+ · split <;> rename_i h₂
189
+ · simp [h₂]
190
+ · split <;> rename_i h₃
191
+ · rfl
192
+ · omega
193
+
194
+ theorem getElem_insertIdx_lt (as : Array α) (i : Nat) (h : i ≤ as.size) (v : α)
195
+ (k) (h' : k < (as.insertIdx i v).size) (h : k < i) :
196
+ (as.insertIdx i v)[k] = as[k] := by
197
+ simp [getElem_insertIdx, h]
198
+
199
+ @[deprecated getElem_insertIdx_lt (since := "2024-11-20")] alias getElem_insertAt_lt :=
200
+ getElem_insertIdx_lt
201
+
202
+ theorem getElem_insertIdx_eq (as : Array α) (i : Nat) (h : i ≤ as.size) (v : α) :
203
+ (as.insertIdx i v)[i]'(by simp; omega) = v := by
204
+ simp [getElem_insertIdx, h]
205
+
206
+ @[deprecated getElem_insertIdx_eq (since := "2024-11-20")] alias getElem_insertAt_eq :=
207
+ getElem_insertIdx_eq
208
+
209
+ theorem getElem_insertIdx_gt (as : Array α) (i : Nat) (h : i ≤ as.size) (v : α)
210
+ (k) (h' : k < (as.insertIdx i v).size) (h : i < k) :
211
+ (as.insertIdx i v)[k] = as[k-1 ]'(by simp at h'; omega) := by
212
+ rw [getElem_insertIdx]
213
+ rw [dif_neg (by omega), dif_neg (by omega)]
214
+
215
+ @[deprecated getElem_insertIdx_gt (since := "2024-11-20")] alias getElem_insertAt_gt :=
216
+ getElem_insertIdx_gt
0 commit comments