copy across some Find API to Array
diff --git a/src/Init/Data/Array/Find.lean b/src/Init/Data/Array/Find.lean index d5b896e..36c0812 100644 --- a/src/Init/Data/Array/Find.lean +++ b/src/Init/Data/Array/Find.lean
@@ -299,24 +299,6 @@ rcases xs with ⟨xs⟩ simp [List.find?_eq_some_iff_getElem] -/-! ### findFinIdx? -/ - -@[simp] theorem findFinIdx?_empty {p : α → Bool} : findFinIdx? p #[] = none := rfl - --- We can't mark this as a `@[congr]` lemma since the head of the RHS is not `findFinIdx?`. -theorem findFinIdx?_congr {p : α → Bool} {xs ys : Array α} (w : xs = ys) : - findFinIdx? p xs = (findFinIdx? p ys).map (fun i => i.cast (by simp [w])) := by - subst w - simp - -@[simp] theorem findFinIdx?_subtype {p : α → Prop} {xs : Array { x // p x }} - {f : { x // p x } → Bool} {g : α → Bool} (hf : ∀ x h, f ⟨x, h⟩ = g x) : - xs.findFinIdx? f = (xs.unattach.findFinIdx? g).map (fun i => i.cast (by simp)) := by - cases xs - simp only [List.findFinIdx?_toArray, hf, List.findFinIdx?_subtype] - rw [findFinIdx?_congr List.unattach_toArray] - simp [Function.comp_def] - /-! ### findIdx -/ theorem findIdx_of_getElem?_eq_some {xs : Array α} (w : xs[xs.findIdx p]? = some y) : p y := by @@ -542,6 +524,47 @@ cases xs simp +/-! ### findFinIdx? -/ + +@[simp] theorem findFinIdx?_empty {p : α → Bool} : findFinIdx? p #[] = none := rfl + +-- We can't mark this as a `@[congr]` lemma since the head of the RHS is not `findFinIdx?`. +theorem findFinIdx?_congr {p : α → Bool} {xs ys : Array α} (w : xs = ys) : + findFinIdx? p xs = (findFinIdx? p ys).map (fun i => i.cast (by simp [w])) := by + subst w + simp + +theorem findFinIdx?_eq_pmap_findIdx? {xs : Array α} {p : α → Bool} : + xs.findFinIdx? p = + (xs.findIdx? p).pmap + (fun i m => by simp [findIdx?_eq_some_iff_getElem] at m; exact ⟨i, m.choose⟩) + (fun i h => h) := by + simp [findIdx?_eq_map_findFinIdx?_val, Option.pmap_map] + +@[simp] theorem findFinIdx?_eq_none_iff {xs : Array α} {p : α → Bool} : + xs.findFinIdx? p = none ↔ ∀ x, x ∈ xs → ¬ p x := by + simp [findFinIdx?_eq_pmap_findIdx?] + +@[simp] +theorem findFinIdx?_eq_some_iff {xs : Array α} {p : α → Bool} {i : Fin xs.size} : + xs.findFinIdx? p = some i ↔ + p xs[i] ∧ ∀ j (hji : j < i), ¬p (xs[j]'(Nat.lt_trans hji i.2)) := by + simp only [findFinIdx?_eq_pmap_findIdx?, Option.pmap_eq_some_iff, findIdx?_eq_some_iff_getElem, + Bool.not_eq_true, Option.mem_def, exists_and_left, and_exists_self, Fin.getElem_fin] + constructor + · rintro ⟨a, ⟨h, w₁, w₂⟩, rfl⟩ + exact ⟨w₁, fun j hji => by simpa using w₂ j hji⟩ + · rintro ⟨h, w⟩ + exact ⟨i, ⟨i.2, h, fun j hji => w ⟨j, by omega⟩ hji⟩, rfl⟩ + +@[simp] theorem findFinIdx?_subtype {p : α → Prop} {xs : Array { x // p x }} + {f : { x // p x } → Bool} {g : α → Bool} (hf : ∀ x h, f ⟨x, h⟩ = g x) : + xs.findFinIdx? f = (xs.unattach.findFinIdx? g).map (fun i => i.cast (by simp)) := by + cases xs + simp only [List.findFinIdx?_toArray, hf, List.findFinIdx?_subtype] + rw [findFinIdx?_congr List.unattach_toArray] + simp [Function.comp_def] + /-! ### idxOf The verification API for `idxOf` is still incomplete. @@ -579,10 +602,26 @@ rcases xs with ⟨xs⟩ simp [List.idxOf?_eq_none_iff] -/-! ### finIdxOf? -/ +/-! ### finIdxOf? + +The verification API for `finIdxOf?` is still incomplete. +The lemmas below should be made consistent with those for `findFinIdx?` (and proved using them). +-/ theorem idxOf?_eq_map_finIdxOf?_val [BEq α] {xs : Array α} {a : α} : xs.idxOf? a = (xs.finIdxOf? a).map (·.val) := by simp [idxOf?, finIdxOf?, findIdx?_eq_map_findFinIdx?_val] +@[simp] theorem finIdxOf?_empty [BEq α] : (#[] : Array α).finIdxOf? a = none := rfl + +@[simp] theorem finIdxOf?_eq_none_iff [BEq α] [LawfulBEq α] {xs : Array α} {a : α} : + xs.finIdxOf? a = none ↔ a ∉ xs := by + rcases xs with ⟨xs⟩ + simp [List.finIdxOf?_eq_none_iff] + +@[simp] theorem finIdxOf?_eq_some_iff [BEq α] [LawfulBEq α] {xs : Array α} {a : α} {i : Fin xs.size} : + xs.finIdxOf? a = some i ↔ xs[i] = a ∧ ∀ j (_ : j < i), ¬xs[j] = a := by + rcases xs with ⟨xs⟩ + simp [List.finIdxOf?_eq_some_iff] + end Array