This PR completes the alignment across `List/Array/Vector` of lemmas about the `eraseP/erase/eraseIdx` operations.
113 lines
4.1 KiB
Text
113 lines
4.1 KiB
Text
/-
|
||
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Kim Morrison
|
||
-/
|
||
prelude
|
||
import Init.Data.Vector.Lemmas
|
||
import Init.Data.Array.Erase
|
||
|
||
/-!
|
||
# Lemmas about `Vector.eraseIdx`.
|
||
-/
|
||
|
||
namespace Vector
|
||
|
||
open Nat
|
||
|
||
/-! ### eraseIdx -/
|
||
|
||
theorem eraseIdx_eq_take_drop_succ (l : Vector α n) (i : Nat) (h) :
|
||
l.eraseIdx i = (l.take i ++ l.drop (i + 1)).cast (by omega) := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.eraseIdx_eq_take_drop_succ, *]
|
||
|
||
theorem getElem?_eraseIdx (l : Vector α n) (i : Nat) (h : i < n) (j : Nat) :
|
||
(l.eraseIdx i)[j]? = if j < i then l[j]? else l[j + 1]? := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.getElem?_eraseIdx]
|
||
|
||
theorem getElem?_eraseIdx_of_lt (l : Vector α n) (i : Nat) (h : i < n) (j : Nat) (h' : j < i) :
|
||
(l.eraseIdx i)[j]? = l[j]? := by
|
||
rw [getElem?_eraseIdx]
|
||
simp [h']
|
||
|
||
theorem getElem?_eraseIdx_of_ge (l : Vector α n) (i : Nat) (h : i < n) (j : Nat) (h' : i ≤ j) :
|
||
(l.eraseIdx i)[j]? = l[j + 1]? := by
|
||
rw [getElem?_eraseIdx]
|
||
simp only [dite_eq_ite, ite_eq_right_iff]
|
||
intro h'
|
||
omega
|
||
|
||
theorem getElem_eraseIdx (l : Vector α n) (i : Nat) (h : i < n) (j : Nat) (h' : j < n - 1) :
|
||
(l.eraseIdx i)[j] = if h'' : j < i then l[j] else l[j + 1] := by
|
||
apply Option.some.inj
|
||
rw [← getElem?_eq_getElem, getElem?_eraseIdx]
|
||
split <;> simp
|
||
|
||
theorem mem_of_mem_eraseIdx {l : Vector α n} {i : Nat} {h} {a : α} (h : a ∈ l.eraseIdx i) : a ∈ l := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simpa using Array.mem_of_mem_eraseIdx (by simpa using h)
|
||
|
||
theorem eraseIdx_append_of_lt_size {l : Vector α n} {k : Nat} (hk : k < n) (l' : Vector α n) (h) :
|
||
eraseIdx (l ++ l') k = (eraseIdx l k ++ l').cast (by omega) := by
|
||
rcases l with ⟨l⟩
|
||
rcases l' with ⟨l'⟩
|
||
simp [Array.eraseIdx_append_of_lt_size, *]
|
||
|
||
theorem eraseIdx_append_of_length_le {l : Vector α n} {k : Nat} (hk : n ≤ k) (l' : Vector α n) (h) :
|
||
eraseIdx (l ++ l') k = (l ++ eraseIdx l' (k - n)).cast (by omega) := by
|
||
rcases l with ⟨l⟩
|
||
rcases l' with ⟨l'⟩
|
||
simp [Array.eraseIdx_append_of_length_le, *]
|
||
|
||
theorem eraseIdx_cast {l : Vector α n} {k : Nat} (h : k < m) :
|
||
eraseIdx (l.cast w) k h = (eraseIdx l k).cast (by omega) := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp
|
||
|
||
theorem eraseIdx_mkVector {n : Nat} {a : α} {k : Nat} {h} :
|
||
(mkVector n a).eraseIdx k = mkVector (n - 1) a := by
|
||
rw [mkVector_eq_mk_mkArray, eraseIdx_mk]
|
||
simp [Array.eraseIdx_mkArray, *]
|
||
|
||
theorem mem_eraseIdx_iff_getElem {x : α} {l : Vector α n} {k} {h} : x ∈ eraseIdx l k h ↔ ∃ i w, i ≠ k ∧ l[i]'w = x := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.mem_eraseIdx_iff_getElem, *]
|
||
|
||
theorem mem_eraseIdx_iff_getElem? {x : α} {l : Vector α n} {k} {h} : x ∈ eraseIdx l k h ↔ ∃ i ≠ k, l[i]? = some x := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.mem_eraseIdx_iff_getElem?, *]
|
||
|
||
theorem getElem_eraseIdx_of_lt (l : Vector α n) (i : Nat) (w : i < n) (j : Nat) (h : j < n - 1) (h' : j < i) :
|
||
(l.eraseIdx i)[j] = l[j] := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.getElem_eraseIdx_of_lt, *]
|
||
|
||
theorem getElem_eraseIdx_of_ge (l : Vector α n) (i : Nat) (w : i < n) (j : Nat) (h : j < n - 1) (h' : i ≤ j) :
|
||
(l.eraseIdx i)[j] = l[j + 1] := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.getElem_eraseIdx_of_ge, *]
|
||
|
||
theorem eraseIdx_set_eq {l : Vector α n} {i : Nat} {a : α} {h : i < n} :
|
||
(l.set i a).eraseIdx i = l.eraseIdx i := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.eraseIdx_set_eq, *]
|
||
|
||
theorem eraseIdx_set_lt {l : Vector α n} {i : Nat} {w : i < n} {j : Nat} {a : α} (h : j < i) :
|
||
(l.set i a).eraseIdx j = (l.eraseIdx j).set (i - 1) a := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.eraseIdx_set_lt, *]
|
||
|
||
theorem eraseIdx_set_gt {l : Vector α n} {i : Nat} {j : Nat} {a : α} (h : i < j) {w : j < n} :
|
||
(l.set i a).eraseIdx j = (l.eraseIdx j).set i a := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [Array.eraseIdx_set_gt, *]
|
||
|
||
@[simp] theorem set_getElem_succ_eraseIdx_succ
|
||
{l : Vector α n} {i : Nat} (h : i + 1 < n) :
|
||
(l.eraseIdx (i + 1)).set i l[i + 1] = l.eraseIdx i := by
|
||
rcases l with ⟨l, rfl⟩
|
||
simp [List.set_getElem_succ_eraseIdx_succ, *]
|
||
|
||
end Vector
|