Skip to content

Commit e88e9e2

Browse files
Trigger CI for leanprover/lean4#6190
2 parents 2d87143 + aab9422 commit e88e9e2

File tree

21 files changed

+576
-575
lines changed

21 files changed

+576
-575
lines changed

.github/workflows/labels-from-status.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ jobs:
3434
if: github.event.pull_request.state == 'closed'
3535
uses: actions-ecosystem/action-remove-labels@v1
3636
with:
37+
github_token: ${{ secrets.GITHUB_TOKEN }}
3738
labels: |
3839
WIP
3940
awaiting-author
@@ -48,6 +49,7 @@ jobs:
4849
! contains(github.event.pull_request.labels.*.name, 'WIP')
4950
uses: actions-ecosystem/action-add-labels@v1
5051
with:
52+
github_token: ${{ secrets.GITHUB_TOKEN }}
5153
labels: WIP
5254

5355
- name: Label unlabeled other PR as awaiting-review
@@ -59,4 +61,5 @@ jobs:
5961
! contains(github.event.pull_request.labels.*.name, 'WIP')
6062
uses: actions-ecosystem/action-add-labels@v1
6163
with:
64+
github_token: ${{ secrets.GITHUB_TOKEN }}
6265
labels: awaiting-review

Batteries/Data/Array/Basic.lean

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -137,43 +137,11 @@ This will perform the update destructively provided that `a` has a reference cou
137137
abbrev setN (a : Array α) (i : Nat) (x : α) (h : i < a.size := by get_elem_tactic) : Array α :=
138138
a.set i x
139139

140-
/--
141-
`swapN a i j hi hj` swaps two `Nat` indexed entries in an `Array α`.
142-
Uses `get_elem_tactic` to supply a proof that the indices are in range.
143-
`hi` and `hj` are both given a default argument `by get_elem_tactic`.
144-
This will perform the update destructively provided that `a` has a reference count of 1 when called.
145-
-/
146-
abbrev swapN (a : Array α) (i j : Nat)
147-
(hi : i < a.size := by get_elem_tactic) (hj : j < a.size := by get_elem_tactic) : Array α :=
148-
Array.swap a ⟨i,hi⟩ ⟨j, hj⟩
140+
@[deprecated (since := "2024-11-24")] alias swapN := swap
149141

150-
/--
151-
`swapAtN a i h x` swaps the entry with index `i : Nat` in the vector for a new entry `x`.
152-
The old entry is returned alongwith the modified vector.
153-
Automatically generates proof of `i < a.size` with `get_elem_tactic` where feasible.
154-
-/
155-
abbrev swapAtN (a : Array α) (i : Nat) (x : α) (h : i < a.size := by get_elem_tactic) :
156-
α × Array α := swapAt a ⟨i,h⟩ x
142+
@[deprecated (since := "2024-11-24")] alias swapAtN := swapAt
157143

158-
/--
159-
`eraseIdxN a i h` Removes the element at position `i` from a vector of length `n`.
160-
`h : i < a.size` has a default argument `by get_elem_tactic` which tries to supply a proof
161-
that the index is valid.
162-
This function takes worst case O(n) time because it has to backshift all elements at positions
163-
greater than i.
164-
-/
165-
abbrev eraseIdxN (a : Array α) (i : Nat) (h : i < a.size := by get_elem_tactic) : Array α :=
166-
a.feraseIdx ⟨i, h⟩
167-
168-
/--
169-
Remove the element at a given index from an array, panics if index is out of bounds.
170-
-/
171-
def eraseIdx! (a : Array α) (i : Nat) : Array α :=
172-
if h : i < a.size then
173-
a.feraseIdx ⟨i, h⟩
174-
else
175-
have : Inhabited (Array α) := ⟨a⟩
176-
panic! s!"index {i} out of bounds"
144+
@[deprecated (since := "2024-11-20")] alias eraseIdxN := eraseIdx
177145

178146
end Array
179147

Batteries/Data/Array/Lemmas.lean

Lines changed: 133 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
55
Authors: Mario Carneiro, Gabriel Ebner
66
-/
77
import Batteries.Data.List.Lemmas
8+
import Batteries.Data.List.FinRange
89
import Batteries.Data.Array.Basic
910
import Batteries.Tactic.SeqFocus
1011
import Batteries.Util.ProofWanted
@@ -25,14 +26,6 @@ theorem forIn_eq_forIn_toList [Monad m]
2526
@[deprecated (since := "2024-09-09")] alias data_zipWith := toList_zipWith
2627
@[deprecated (since := "2024-08-13")] alias zipWith_eq_zipWith_data := data_zipWith
2728

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-
3629
/-! ### filter -/
3730

3831
theorem size_filter_le (p : α → Bool) (l : Array α) :
@@ -71,118 +64,153 @@ where
7164
@[simp] proof_wanted toList_erase [BEq α] {l : Array α} {a : α} :
7265
(l.erase a).toList = l.toList.erase a
7366

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
8070

8171
/-! ### set -/
8272

8373
theorem size_set! (a : Array α) (i v) : (a.set! i v).size = a.size := by simp
8474

8575
/-! ### map -/
8676

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-
9277
/-! ### mem -/
9378

9479
theorem mem_singleton : a ∈ #[b] ↔ a = b := by simp
9580

9681
/-! ### insertAt -/
9782

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
10186
split
102-
· rw [size_insertAt_loop, size_swap]
87+
· rw [size_insertIdx_loop, size_swap]
10388
· rfl
10489

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
118110
· rfl
119111

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

Batteries/Data/BinaryHeap.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ def heapifyUp (lt : α → α → Bool) (a : Vector α sz) (i : Fin sz) :
6767
match i with
6868
| ⟨0, _⟩ => a
6969
| ⟨i'+1, hi⟩ =>
70-
let j := i'/2, by get_elem_tactic⟩
70+
let j := i'/2
7171
if lt a[j] a[i] then
72-
heapifyUp lt (a.swap i j) j
72+
heapifyUp lt (a.swap i j) ⟨j, by get_elem_tactic⟩
7373
else a
7474

7575
/-- `O(1)`. Build a new empty heap. -/
@@ -107,7 +107,7 @@ def popMax (self : BinaryHeap α lt) : BinaryHeap α lt :=
107107
if h0 : self.size = 0 then self else
108108
have hs : self.size - 1 < self.size := Nat.pred_lt h0
109109
have h0 : 0 < self.size := Nat.zero_lt_of_ne_zero h0
110-
let v := self.vector.swap ⟨_, h0⟩ ⟨_, hs⟩ |>.pop
110+
let v := self.vector.swap _ _ h0 hs |>.pop
111111
if h : 0 < self.size - 1 then
112112
⟨heapifyDown lt v ⟨0, h⟩ |>.toArray⟩
113113
else
@@ -136,7 +136,7 @@ def insertExtractMax (self : BinaryHeap α lt) (x : α) : α × BinaryHeap α lt
136136
| none => (x, self)
137137
| some m =>
138138
if lt x m then
139-
let v := self.vector.set 0, size_pos_of_max e⟩ x
139+
let v := self.vector.set 0 x (size_pos_of_max e)
140140
(m, ⟨heapifyDown lt v ⟨0, size_pos_of_max e⟩ |>.toArray⟩)
141141
else (x, self)
142142

@@ -145,7 +145,7 @@ def replaceMax (self : BinaryHeap α lt) (x : α) : Option α × BinaryHeap α l
145145
match e : self.max with
146146
| none => (none, ⟨self.vector.push x |>.toArray⟩)
147147
| some m =>
148-
let v := self.vector.set 0, size_pos_of_max e⟩ x
148+
let v := self.vector.set 0 x (size_pos_of_max e)
149149
(some m, ⟨heapifyDown lt v ⟨0, size_pos_of_max e⟩ |>.toArray⟩)
150150

151151
/-- `O(log n)`. Replace the value at index `i` by `x`. Assumes that `x ≤ self.get i`. -/

Batteries/Data/Fin.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
import Batteries.Data.Fin.Basic
2+
import Batteries.Data.Fin.Fold
23
import Batteries.Data.Fin.Lemmas

0 commit comments

Comments
 (0)