Documentation

Init.Data.Vector.Range

Lemmas about Vector.range', Vector.range, and Vector.zipIdx #

Ranges and enumeration #

range' #

@[simp]
theorem Vector.toArray_range' (start size step : Nat) :
(range' start size step).toArray = Array.range' start size step
theorem Vector.range'_eq_mk_range' (start size step : Nat) :
range' start size step = { toArray := Array.range' start size step, size_toArray := }
@[simp]
theorem Vector.getElem_range' (start size step i : Nat) (h : i < size) :
(range' start size step)[i] = start + step * i
@[simp]
theorem Vector.getElem?_range' (start size step i : Nat) :
(range' start size step)[i]? = if i < size then some (start + step * i) else none
theorem Vector.range'_succ (s n step : Nat) :
range' s (n + 1) step = Vector.cast ({ toArray := #[s], size_toArray := } ++ range' (s + step) n step)
theorem Vector.range'_zero {s step : Nat} :
range' s 0 step = { toArray := #[], size_toArray := }
@[simp]
theorem Vector.range'_one {s step : Nat} :
range' s 1 step = { toArray := #[s], size_toArray := }
@[simp]
theorem Vector.range'_inj {s n s' : Nat} :
range' s n = range' s' n n = 0 s = s'
theorem Vector.mem_range' {s step m n : Nat} :
m range' s n step (i : Nat), i < n m = s + step * i
theorem Vector.pop_range' {s n step : Nat} :
(range' s n step).pop = range' s (n - 1) step
theorem Vector.map_add_range' (a s n step : Nat) :
map (fun (x : Nat) => a + x) (range' s n step) = range' (a + s) n step
theorem Vector.range'_succ_left {s n step : Nat} :
range' (s + 1) n step = map (fun (x : Nat) => x + 1) (range' s n step)
theorem Vector.range'_append (s m n step : Nat) :
range' s m step ++ range' (s + step * m) n step = range' s (m + n) step
@[simp]
theorem Vector.range'_append_1 (s m n : Nat) :
range' s m ++ range' (s + m) n = range' s (m + n)
theorem Vector.range'_concat {step : Nat} (s n : Nat) :
range' s (n + 1) step = range' s n step ++ { toArray := #[s + step * n], size_toArray := }
theorem Vector.range'_1_concat (s n : Nat) :
range' s (n + 1) = range' s n ++ { toArray := #[s + n], size_toArray := }
@[simp]
theorem Vector.mem_range'_1 {s n m : Nat} :
m range' s n s m m < s + n
theorem Vector.map_sub_range' {step : Nat} (a s n : Nat) (h : a s) :
map (fun (x : Nat) => x - a) (range' s n step) = range' (s - a) n step
theorem Vector.range'_eq_append_iff {s n m : Nat} {xs : Vector Nat n} {ys : Vector Nat m} :
range' s (n + m) = xs ++ ys xs = range' s n ys = range' (s + n) m
@[simp]
theorem Vector.find?_range'_eq_some {s n i : Nat} {p : NatBool} :
find? p (range' s n) = some i p i = true i range' s n ∀ (j : Nat), s jj < i → (!p j) = true
@[simp]
theorem Vector.find?_range'_eq_none {s n : Nat} {p : NatBool} :
find? p (range' s n) = none ∀ (i : Nat), s ii < s + n → (!p i) = true

range #

theorem Vector.range_succ_eq_map (n : Nat) :
range (n + 1) = Vector.cast ({ toArray := #[0], size_toArray := } ++ map Nat.succ (range n))
theorem Vector.range'_eq_map_range (s n : Nat) :
range' s n = map (fun (x : Nat) => s + x) (range n)
theorem Vector.range_succ (n : Nat) :
range n.succ = range n ++ { toArray := #[n], size_toArray := }
theorem Vector.range_add (a b : Nat) :
range (a + b) = range a ++ map (fun (x : Nat) => a + x) (range b)
theorem Vector.reverse_range' (s n : Nat) :
(range' s n).reverse = map (fun (x : Nat) => s + n - 1 - x) (range n)
@[simp]
theorem Vector.mem_range {m n : Nat} :
m range n m < n
@[simp]
theorem Vector.take_range (m n : Nat) :
(range n).take m = range (min m n)
@[simp]
theorem Vector.find?_range_eq_some {n i : Nat} {p : NatBool} :
find? p (range n) = some i p i = true i range n ∀ (j : Nat), j < i → (!p j) = true
@[simp]
theorem Vector.find?_range_eq_none {n : Nat} {p : NatBool} :
find? p (range n) = none ∀ (i : Nat), i < n → (!p i) = true

zipIdx #

@[simp]
theorem Vector.getElem?_zipIdx {α : Type u_1} {n : Nat} (l : Vector α n) (n✝ m : Nat) :
(l.zipIdx n✝)[m]? = Option.map (fun (a : α) => (a, n✝ + m)) l[m]?
theorem Vector.map_snd_add_zipIdx_eq_zipIdx {α : Type u_1} {n : Nat} (l : Vector α n) (m k : Nat) :
map (Prod.map id fun (x : Nat) => x + m) (l.zipIdx k) = l.zipIdx (m + k)
@[simp]
theorem Vector.zipIdx_map_snd {α : Type u_1} {n : Nat} (m : Nat) (l : Vector α n) :
@[simp]
theorem Vector.zipIdx_map_fst {α : Type u_1} {n : Nat} (m : Nat) (l : Vector α n) :
theorem Vector.zipIdx_eq_zip_range' {α : Type u_1} {n m : Nat} (l : Vector α n) :
l.zipIdx m = l.zip (range' m n)
@[simp]
theorem Vector.unzip_zipIdx_eq_prod {α : Type u_1} {n : Nat} (l : Vector α n) {m : Nat} :
(l.zipIdx m).unzip = (l, range' m n)
theorem Vector.zipIdx_succ {α : Type u_1} {n : Nat} (l : Vector α n) (m : Nat) :
l.zipIdx (m + 1) = map (fun (x : α × Nat) => match x with | (a, i) => (a, i + 1)) (l.zipIdx m)

Replace zipIdx with a starting index m+1 with zipIdx starting from m, followed by a map increasing the indices by one.

theorem Vector.zipIdx_eq_map_add {α : Type u_1} {n : Nat} (l : Vector α n) (m : Nat) :
l.zipIdx m = map (fun (x : α × Nat) => match x with | (a, i) => (a, m + i)) l.zipIdx

Replace zipIdx with a starting index with zipIdx starting from 0, followed by a map increasing the indices.

@[simp]
theorem Vector.zipIdx_singleton {α : Type u_1} (x : α) (k : Nat) :
{ toArray := #[x], size_toArray := }.zipIdx k = { toArray := #[(x, k)], size_toArray := }
theorem Vector.mk_add_mem_zipIdx_iff_getElem? {α : Type u_1} {n k i : Nat} {x : α} {l : Vector α n} :
(x, k + i) l.zipIdx k l[i]? = some x
theorem Vector.le_snd_of_mem_zipIdx {α : Type u_1} {n : Nat} {x : α × Nat} {k : Nat} {l : Vector α n} (h : x l.zipIdx k) :
k x.snd
theorem Vector.snd_lt_add_of_mem_zipIdx {α : Type u_1} {n : Nat} {x : α × Nat} {l : Vector α n} {k : Nat} (h : x l.zipIdx k) :
x.snd < k + n
theorem Vector.snd_lt_of_mem_zipIdx {α : Type u_1} {n : Nat} {x : α × Nat} {l : Vector α n} {k : Nat} (h : x l.zipIdx k) :
x.snd < n + k
theorem Vector.map_zipIdx {α : Type u_1} {β : Type u_2} {n : Nat} (f : αβ) (l : Vector α n) (k : Nat) :
map (Prod.map f id) (l.zipIdx k) = (map f l).zipIdx k
theorem Vector.fst_mem_of_mem_zipIdx {α : Type u_1} {n : Nat} {x : α × Nat} {l : Vector α n} {k : Nat} (h : x l.zipIdx k) :
x.fst l
theorem Vector.fst_eq_of_mem_zipIdx {α : Type u_1} {n : Nat} {x : α × Nat} {l : Vector α n} {k : Nat} (h : x l.zipIdx k) :
x.fst = l[x.snd - k]
theorem Vector.mem_zipIdx {α : Type u_1} {n : Nat} {x : α} {i : Nat} {xs : Vector α n} {k : Nat} (h : (x, i) xs.zipIdx k) :
k i i < k + n x = xs[i - k]
theorem Vector.mem_zipIdx' {α : Type u_1} {n : Nat} {x : α} {i : Nat} {xs : Vector α n} (h : (x, i) xs.zipIdx) :
i < n x = xs[i]

Variant of mem_zipIdx specialized at k = 0.

theorem Vector.zipIdx_map {α : Type u_1} {n : Nat} {β : Type u_2} (l : Vector α n) (k : Nat) (f : αβ) :
(map f l).zipIdx k = map (Prod.map f id) (l.zipIdx k)
theorem Vector.zipIdx_append {α : Type u_1} {n m : Nat} (xs : Vector α n) (ys : Vector α m) (k : Nat) :
(xs ++ ys).zipIdx k = xs.zipIdx k ++ ys.zipIdx (k + n)
theorem Vector.zipIdx_eq_append_iff {α : Type u_1} {n m : Nat} {l₁ : Vector (α × Nat) n} {l₂ : Vector (α × Nat) m} {l : Vector α (n + m)} {k : Nat} :
l.zipIdx k = l₁ ++ l₂ (l₁' : Vector α n), (l₂' : Vector α m), l = l₁' ++ l₂' l₁ = l₁'.zipIdx k l₂ = l₂'.zipIdx (k + n)