lean4-htt/src/Init/Data/Vector/Erase.lean
Kim Morrison 5bd75695f4
feat: align List/Array/Vector eraseP/erase/eraseIdx lemmas (#6868)
This PR completes the alignment across `List/Array/Vector` of lemmas
about the `eraseP/erase/eraseIdx` operations.
2025-01-30 12:29:55 +00:00

113 lines
4.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
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