Documentation

Init.Data.Array.Erase

Lemmas about Array.eraseP, Array.erase, and Array.eraseIdx. #

eraseP #

@[simp]
theorem Array.eraseP_empty {α✝ : Type u_1} {p : α✝Bool} :
theorem Array.eraseP_of_forall_mem_not {α : Type u_1} {p : αBool} {l : Array α} (h : ∀ (a : α), a l¬p a = true) :
l.eraseP p = l
theorem Array.eraseP_of_forall_getElem_not {α : Type u_1} {p : αBool} {l : Array α} (h : ∀ (i : Nat) (h : i < l.size), ¬p l[i] = true) :
l.eraseP p = l
@[simp]
theorem Array.eraseP_eq_empty_iff {α : Type u_1} {xs : Array α} {p : αBool} :
xs.eraseP p = #[] xs = #[] (x : α), p x = true xs = #[x]
theorem Array.eraseP_ne_empty_iff {α : Type u_1} {xs : Array α} {p : αBool} :
xs.eraseP p #[] xs #[] ∀ (x : α), p x = truexs #[x]
theorem Array.exists_of_eraseP {α : Type u_1} {p : αBool} {l : Array α} {a : α} (hm : a l) (hp : p a = true) :
(a : α), (l₁ : Array α), (l₂ : Array α), (∀ (b : α), b l₁¬p b = true) p a = true l = l₁.push a ++ l₂ l.eraseP p = l₁ ++ l₂
theorem Array.exists_or_eq_self_of_eraseP {α : Type u_1} (p : αBool) (l : Array α) :
l.eraseP p = l (a : α), (l₁ : Array α), (l₂ : Array α), (∀ (b : α), b l₁¬p b = true) p a = true l = l₁.push a ++ l₂ l.eraseP p = l₁ ++ l₂
@[simp]
theorem Array.size_eraseP_of_mem {α : Type u_1} {a : α} {p : αBool} {l : Array α} (al : a l) (pa : p a = true) :
(l.eraseP p).size = l.size - 1
theorem Array.size_eraseP {α : Type u_1} {p : αBool} {l : Array α} :
(l.eraseP p).size = if l.any p = true then l.size - 1 else l.size
theorem Array.size_eraseP_le {α : Type u_1} {p : αBool} (l : Array α) :
theorem Array.le_size_eraseP {α : Type u_1} {p : αBool} (l : Array α) :
l.size - 1 (l.eraseP p).size
theorem Array.mem_of_mem_eraseP {α : Type u_1} {p : αBool} {a : α} {l : Array α} :
a l.eraseP pa l
@[simp]
theorem Array.mem_eraseP_of_neg {α : Type u_1} {p : αBool} {a : α} {l : Array α} (pa : ¬p a = true) :
a l.eraseP p a l
@[simp]
theorem Array.eraseP_eq_self_iff {α : Type u_1} {p : αBool} {l : Array α} :
l.eraseP p = l ∀ (a : α), a l¬p a = true
theorem Array.eraseP_map {β : Type u_1} {α : Type u_2} {p : αBool} (f : βα) (l : Array β) :
(map f l).eraseP p = map f (l.eraseP (p f))
theorem Array.eraseP_filterMap {α : Type u_1} {β : Type u_2} {p : βBool} (f : αOption β) (l : Array α) :
(filterMap f l).eraseP p = filterMap f (l.eraseP fun (x : α) => match f x with | some y => p y | none => false)
theorem Array.eraseP_filter {α : Type u_1} {p : αBool} (f : αBool) (l : Array α) :
(filter f l).eraseP p = filter f (l.eraseP fun (x : α) => p x && f x)
theorem Array.eraseP_append_left {α : Type u_1} {p : αBool} {a : α} (pa : p a = true) {l₁ : Array α} (l₂ : Array α) (h : a l₁) :
(l₁ ++ l₂).eraseP p = l₁.eraseP p ++ l₂
theorem Array.eraseP_append_right {α : Type u_1} {p : αBool} {l₁ : Array α} (l₂ : Array α) (h : ∀ (b : α), b l₁¬p b = true) :
(l₁ ++ l₂).eraseP p = l₁ ++ l₂.eraseP p
theorem Array.eraseP_append {α : Type u_1} {p : αBool} (l₁ l₂ : Array α) :
(l₁ ++ l₂).eraseP p = if l₁.any p = true then l₁.eraseP p ++ l₂ else l₁ ++ l₂.eraseP p
theorem Array.eraseP_mkArray {α : Type u_1} (n : Nat) (a : α) (p : αBool) :
(mkArray n a).eraseP p = if p a = true then mkArray (n - 1) a else mkArray n a
@[simp]
theorem Array.eraseP_mkArray_of_pos {α : Type u_1} {p : αBool} {n : Nat} {a : α} (h : p a = true) :
(mkArray n a).eraseP p = mkArray (n - 1) a
@[simp]
theorem Array.eraseP_mkArray_of_neg {α : Type u_1} {p : αBool} {n : Nat} {a : α} (h : ¬p a = true) :
(mkArray n a).eraseP p = mkArray n a
theorem Array.eraseP_eq_iff {α : Type u_1} {l' : Array α} {p : αBool} {l : Array α} :
l.eraseP p = l' (∀ (a : α), a l¬p a = true) l = l' (a : α), (l₁ : Array α), (l₂ : Array α), (∀ (b : α), b l₁¬p b = true) p a = true l = l₁.push a ++ l₂ l' = l₁ ++ l₂
theorem Array.eraseP_comm {α : Type u_1} {p q : αBool} {l : Array α} (h : ∀ (a : α), a l¬p a = true ¬q a = true) :
(l.eraseP p).eraseP q = (l.eraseP q).eraseP p

erase #

theorem Array.erase_of_not_mem {α : Type u_1} [BEq α] [LawfulBEq α] {a : α} {l : Array α} (h : ¬a l) :
l.erase a = l
theorem Array.erase_eq_eraseP' {α : Type u_1} [BEq α] (a : α) (l : Array α) :
l.erase a = l.eraseP fun (x : α) => x == a
theorem Array.erase_eq_eraseP {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) (l : Array α) :
l.erase a = l.eraseP fun (x : α) => a == x
@[simp]
theorem Array.erase_eq_empty_iff {α : Type u_1} [BEq α] [LawfulBEq α] {xs : Array α} {a : α} :
xs.erase a = #[] xs = #[] xs = #[a]
theorem Array.erase_ne_empty_iff {α : Type u_1} [BEq α] [LawfulBEq α] {xs : Array α} {a : α} :
xs.erase a #[] xs #[] xs #[a]
theorem Array.exists_erase_eq {α : Type u_1} [BEq α] [LawfulBEq α] {a : α} {l : Array α} (h : a l) :
(l₁ : Array α), (l₂ : Array α), ¬a l₁ l = l₁.push a ++ l₂ l.erase a = l₁ ++ l₂
@[simp]
theorem Array.size_erase_of_mem {α : Type u_1} [BEq α] [LawfulBEq α] {a : α} {l : Array α} (h : a l) :
(l.erase a).size = l.size - 1
theorem Array.size_erase {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) (l : Array α) :
(l.erase a).size = if a l then l.size - 1 else l.size
theorem Array.size_erase_le {α : Type u_1} [BEq α] (a : α) (l : Array α) :
(l.erase a).size l.size
theorem Array.le_size_erase {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) (l : Array α) :
l.size - 1 (l.erase a).size
theorem Array.mem_of_mem_erase {α : Type u_1} [BEq α] {a b : α} {l : Array α} (h : a l.erase b) :
a l
@[simp]
theorem Array.mem_erase_of_ne {α : Type u_1} [BEq α] [LawfulBEq α] {a b : α} {l : Array α} (ab : a b) :
a l.erase b a l
@[simp]
theorem Array.erase_eq_self_iff {α : Type u_1} [BEq α] {a : α} [LawfulBEq α] {l : Array α} :
l.erase a = l ¬a l
theorem Array.erase_filter {α : Type u_1} [BEq α] {a : α} [LawfulBEq α] (f : αBool) (l : Array α) :
(filter f l).erase a = filter f (l.erase a)
theorem Array.erase_append_left {α : Type u_1} [BEq α] {a : α} [LawfulBEq α] {l₁ : Array α} (l₂ : Array α) (h : a l₁) :
(l₁ ++ l₂).erase a = l₁.erase a ++ l₂
theorem Array.erase_append_right {α : Type u_1} [BEq α] [LawfulBEq α] {a : α} {l₁ : Array α} (l₂ : Array α) (h : ¬a l₁) :
(l₁ ++ l₂).erase a = l₁ ++ l₂.erase a
theorem Array.erase_append {α : Type u_1} [BEq α] [LawfulBEq α] {a : α} {l₁ l₂ : Array α} :
(l₁ ++ l₂).erase a = if a l₁ then l₁.erase a ++ l₂ else l₁ ++ l₂.erase a
theorem Array.erase_mkArray {α : Type u_1} [BEq α] [LawfulBEq α] (n : Nat) (a b : α) :
(mkArray n a).erase b = if (b == a) = true then mkArray (n - 1) a else mkArray n a
theorem Array.erase_comm {α : Type u_1} [BEq α] [LawfulBEq α] (a b : α) (l : Array α) :
(l.erase a).erase b = (l.erase b).erase a
theorem Array.erase_eq_iff {α : Type u_1} [BEq α] {l' : Array α} [LawfulBEq α] {a : α} {l : Array α} :
l.erase a = l' ¬a l l = l' (l₁ : Array α), (l₂ : Array α), ¬a l₁ l = l₁.push a ++ l₂ l' = l₁ ++ l₂
@[simp]
theorem Array.erase_mkArray_self {α : Type u_1} [BEq α] {n : Nat} [LawfulBEq α] {a : α} :
(mkArray n a).erase a = mkArray (n - 1) a
@[simp]
theorem Array.erase_mkArray_ne {α : Type u_1} [BEq α] {n : Nat} [LawfulBEq α] {a b : α} (h : (!b == a) = true) :
(mkArray n a).erase b = mkArray n a

eraseIdx #

theorem Array.eraseIdx_eq_take_drop_succ {α : Type u_1} (l : Array α) (i : Nat) (h : i < l.size) :
l.eraseIdx i h = l.take i ++ l.drop (i + 1)
theorem Array.getElem?_eraseIdx {α : Type u_1} (l : Array α) (i : Nat) (h : i < l.size) (j : Nat) :
(l.eraseIdx i h)[j]? = if j < i then l[j]? else l[j + 1]?
theorem Array.getElem?_eraseIdx_of_lt {α : Type u_1} (l : Array α) (i : Nat) (h : i < l.size) (j : Nat) (h' : j < i) :
(l.eraseIdx i h)[j]? = l[j]?
theorem Array.getElem?_eraseIdx_of_ge {α : Type u_1} (l : Array α) (i : Nat) (h : i < l.size) (j : Nat) (h' : i j) :
(l.eraseIdx i h)[j]? = l[j + 1]?
theorem Array.getElem_eraseIdx {α : Type u_1} (l : Array α) (i : Nat) (h : i < l.size) (j : Nat) (h' : j < (l.eraseIdx i h).size) :
(l.eraseIdx i h)[j] = if h'' : j < i then l[j] else l[j + 1]
@[simp]
theorem Array.eraseIdx_eq_empty_iff {α : Type u_1} {l : Array α} {i : Nat} {h : i < l.size} :
l.eraseIdx i h = #[] l.size = 1 i = 0
theorem Array.eraseIdx_ne_empty_iff {α : Type u_1} {l : Array α} {i : Nat} {h : i < l.size} :
theorem Array.mem_of_mem_eraseIdx {α : Type u_1} {l : Array α} {i : Nat} {h : i < l.size} {a : α} :
a l.eraseIdx i ha l
theorem Array.eraseIdx_append_of_lt_size {α : Type u_1} {l : Array α} {k : Nat} (hk : k < l.size) (l' : Array α) (h : k < (l ++ l').size) :
(l ++ l').eraseIdx k h = l.eraseIdx k hk ++ l'
theorem Array.eraseIdx_append_of_length_le {α : Type u_1} {l : Array α} {k : Nat} (hk : l.size k) (l' : Array α) (h : k < (l ++ l').size) :
(l ++ l').eraseIdx k h = l ++ l'.eraseIdx (k - l.size)
theorem Array.eraseIdx_mkArray {α : Type u_1} {n : Nat} {a : α} {k : Nat} {h : k < (mkArray n a).size} :
(mkArray n a).eraseIdx k h = mkArray (n - 1) a
theorem Array.mem_eraseIdx_iff_getElem {α : Type u_1} {x : α} {l : Array α} {k : Nat} {h : k < l.size} :
x l.eraseIdx k h (i : Nat), (w : i < l.size), i k l[i] = x
theorem Array.mem_eraseIdx_iff_getElem? {α : Type u_1} {x : α} {l : Array α} {k : Nat} {h : k < l.size} :
x l.eraseIdx k h (i : Nat), i k l[i]? = some x
theorem Array.erase_eq_eraseIdx_of_idxOf {α : Type u_1} [BEq α] [LawfulBEq α] (l : Array α) (a : α) (i : Nat) (w : idxOf a l = i) (h : i < l.size) :
l.erase a = l.eraseIdx i h
theorem Array.getElem_eraseIdx_of_lt {α : Type u_1} (l : Array α) (i : Nat) (w : i < l.size) (j : Nat) (h : j < (l.eraseIdx i w).size) (h' : j < i) :
(l.eraseIdx i w)[j] = l[j]
theorem Array.getElem_eraseIdx_of_ge {α : Type u_1} (l : Array α) (i : Nat) (w : i < l.size) (j : Nat) (h : j < (l.eraseIdx i w).size) (h' : i j) :
(l.eraseIdx i w)[j] = l[j + 1]
theorem Array.eraseIdx_set_eq {α : Type u_1} {l : Array α} {i : Nat} {a : α} {h : i < l.size} :
(l.set i a h).eraseIdx i = l.eraseIdx i h
theorem Array.eraseIdx_set_lt {α : Type u_1} {l : Array α} {i : Nat} {w : i < l.size} {j : Nat} {a : α} (h : j < i) :
(l.set i a w).eraseIdx j = (l.eraseIdx j ).set (i - 1) a
theorem Array.eraseIdx_set_gt {α : Type u_1} {l : Array α} {i j : Nat} {a : α} (h : i < j) {w : j < l.size} :
(l.set i a ).eraseIdx j = (l.eraseIdx j w).set i a
@[simp]
theorem Array.set_getElem_succ_eraseIdx_succ {α : Type u_1} {l : Array α} {i : Nat} (h : i + 1 < l.size) :
(l.eraseIdx (i + 1) h).set i l[i + 1] = l.eraseIdx i