Module docstring
{"# insertIdx
Proves various lemmas about List.insertIdx.
"}
{"# insertIdx
Proves various lemmas about List.insertIdx.
"}
List.sublist_insertIdx
theorem
(l : List α) (n : ℕ) (a : α) : l <+ (l.insertIdx n a)
@[simp]
theorem sublist_insertIdx (l : List α) (n : ℕ) (a : α) : l <+ (l.insertIdx n a) := by
simpa only [eraseIdx_insertIdx] using eraseIdx_sublist (l.insertIdx n a) n
List.subset_insertIdx
theorem
(l : List α) (n : ℕ) (a : α) : l ⊆ l.insertIdx n a
@[simp]
theorem subset_insertIdx (l : List α) (n : ℕ) (a : α) : l ⊆ l.insertIdx n a :=
(sublist_insertIdx ..).subset
List.insertIdx_eraseIdx
theorem
{l : List α} {n : ℕ} (hn : n ≠ length l) (a : α) : (l.eraseIdx n).insertIdx n a = l.set n a
/-- Erasing `n`th element of a list, then inserting `a` at the same place
is the same as setting `n`th element to `a`.
We assume that `n ≠ length l`, because otherwise LHS equals `l ++ [a]` while RHS equals `l`. -/
@[simp]
theorem insertIdx_eraseIdx {l : List α} {n : ℕ} (hn : n ≠ length l) (a : α) :
(l.eraseIdx n).insertIdx n a = l.set n a := by
induction n generalizing l <;> cases l <;> simp_all
List.insertIdx_eraseIdx_getElem
theorem
{l : List α} {n : ℕ} (hn : n < length l) : (l.eraseIdx n).insertIdx n l[n] = l
List.insertIdx_subset_cons
theorem
(n : ℕ) (a : α) (l : List α) : l.insertIdx n a ⊆ a :: l
theorem insertIdx_subset_cons (n : ℕ) (a : α) (l : List α) : l.insertIdx n a ⊆ a :: l := by
intro b hb
simpa using eq_or_mem_of_mem_insertIdx hb
List.insertIdx_pmap
theorem
{p : α → Prop} (f : ∀ a, p a → β) {l : List α} {a : α} {n : ℕ} (hl : ∀ x ∈ l, p x) (ha : p a) :
(l.pmap f hl).insertIdx n (f a ha) =
(l.insertIdx n a).pmap f (fun _ h ↦ (eq_or_mem_of_mem_insertIdx h).elim (fun heq ↦ heq ▸ ha) (hl _))
theorem insertIdx_pmap {p : α → Prop} (f : ∀ a, p a → β) {l : List α} {a : α} {n : ℕ}
(hl : ∀ x ∈ l, p x) (ha : p a) :
(l.pmap f hl).insertIdx n (f a ha) = (l.insertIdx n a).pmap f
(fun _ h ↦ (eq_or_mem_of_mem_insertIdx h).elim (fun heq ↦ heq ▸ ha) (hl _)) := by
induction n generalizing l with
| zero => cases l <;> simp
| succ n ihn => cases l <;> simp_all
List.map_insertIdx
theorem
(f : α → β) (l : List α) (n : ℕ) (a : α) : (l.insertIdx n a).map f = (l.map f).insertIdx n (f a)
theorem map_insertIdx (f : α → β) (l : List α) (n : ℕ) (a : α) :
(l.insertIdx n a).map f = (l.map f).insertIdx n (f a) := by
simpa only [pmap_eq_map] using (insertIdx_pmap (fun a _ ↦ f a) (fun _ _ ↦ trivial) trivial).symm
List.eraseIdx_pmap
theorem
{p : α → Prop} (f : ∀ a, p a → β) {l : List α} (hl : ∀ a ∈ l, p a) (n : ℕ) :
(pmap f l hl).eraseIdx n = (l.eraseIdx n).pmap f fun a ha ↦ hl a (eraseIdx_subset ha)
theorem eraseIdx_pmap {p : α → Prop} (f : ∀ a, p a → β) {l : List α} (hl : ∀ a ∈ l, p a) (n : ℕ) :
(pmap f l hl).eraseIdx n = (l.eraseIdx n).pmap f fun a ha ↦ hl a (eraseIdx_subset ha) :=
match l, hl, n with
| [], _, _ => rfl
| a :: _, _, 0 => rfl
| a :: as, h, n + 1 => by rw [forall_mem_cons] at h; simp [eraseIdx_pmap f h.2 n]
List.eraseIdx_map
theorem
(f : α → β) (l : List α) (n : ℕ) : (map f l).eraseIdx n = (l.eraseIdx n).map f
/-- Erasing an index commutes with `List.map`. -/
theorem eraseIdx_map (f : α → β) (l : List α) (n : ℕ) :
(map f l).eraseIdx n = (l.eraseIdx n).map f := by
simpa only [pmap_eq_map] using eraseIdx_pmap (fun a _ ↦ f a) (fun _ _ ↦ trivial) n
List.insertIdx_injective
theorem
(n : ℕ) (x : α) : Function.Injective (fun l : List α => l.insertIdx n x)
theorem insertIdx_injective (n : ℕ) (x : α) :
Function.Injective (fun l : List α => l.insertIdx n x) := by
induction n with
| zero => simp
| succ n IH => rintro (_ | ⟨a, as⟩) (_ | ⟨b, bs⟩) h <;> simpa [IH.eq_iff] using h