Documentation

Batteries.Data.List.Scan

List scan #

Prove basic results about List.scanl and List.scanr.

List.scanl #

@[simp]
theorem List.length_scanl {β : Type u_1} {α : Type u_2} {f : βαβ} (b : β) (l : List α) :
(scanl f b l).length = l.length + 1
@[simp]
theorem List.scanl_nil {β : Type u_1} {α : Type u_2} {f : βαβ} (b : β) :
scanl f b [] = [b]
@[simp]
theorem List.scanl_cons {β : Type u_1} {α : Type u_2} {b : β} {a : α} {l : List α} {f : βαβ} :
scanl f b (a :: l) = b :: scanl f (f b a) l
theorem List.scanl_singleton {β : Type u_1} {α : Type u_2} {b : β} {a : α} {f : βαβ} :
scanl f b [a] = [b, f b a]
@[simp]
theorem List.scanl_ne_nil {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} :
scanl f b l []
@[simp]
theorem List.scanl_iff_nil {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} (c : β) :
scanl f b l = [c] c = b l = []
@[simp]
theorem List.getElem_scanl {α : Type u_1} {β : Type u_2} {i : Nat} {a : α} {l : List β} {f : αβα} (h : i < (scanl f a l).length) :
(scanl f a l)[i] = foldl f a (take i l)
theorem List.getElem?_scanl {α : Type u_1} {β : Type u_2} {a : α} {l : List β} {i : Nat} {f : αβα} :
(scanl f a l)[i]? = if i l.length then some (foldl f a (take i l)) else none
theorem List.take_scanl {α : Type u_1} {β : Type u_2} {f : αβα} (a : α) (l : List β) (i : Nat) :
take (i + 1) (scanl f a l) = scanl f a (take i l)
theorem List.getElem?_scanl_zero {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} :
(scanl f b l)[0]? = some b
theorem List.getElem_scanl_zero {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} :
(scanl f b l)[0] = b
@[simp]
theorem List.head_scanl {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} (h : scanl f b l []) :
(scanl f b l).head h = b
theorem List.getLast_scanl {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} (h : scanl f b l []) :
(scanl f b l).getLast h = foldl f b l
theorem List.getLast?_scanl {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {f : βαβ} :
(scanl f b l).getLast? = some (foldl f b l)
theorem List.getElem?_succ_scanl {β : Type u_1} {α : Type u_2} {b : β} {l : List α} {i : Nat} {f : βαβ} :
(scanl f b l)[i + 1]? = (scanl f b l)[i]?.bind fun (x : β) => Option.map (fun (y : α) => f x y) l[i]?
theorem List.getElem_succ_scanl {β : Type u_1} {α : Type u_2} {i : Nat} {b : β} {l : List α} {f : βαβ} (h : i + 1 < (scanl f b l).length) :
(scanl f b l)[i + 1] = f (scanl f b l)[i] l[i]
theorem List.scanl_append {β : Type u_1} {α : Type u_2} {b : β} {f : βαβ} (l₁ l₂ : List α) :
scanl f b (l₁ ++ l₂) = scanl f b l₁ ++ (scanl f (foldl f b l₁) l₂).tail
theorem List.scanl_map {β : Type u_1} {γ : Type u_2} {α : Type u_3} {f : βγβ} {g : αγ} (b : β) (l : List α) :
scanl f b (map g l) = scanl (fun (acc : β) (x : α) => f acc (g x)) b l

List.scanr #

@[simp]
theorem List.scanr_nil {α : Type u_1} {β : Type u_2} {f : αββ} (b : β) :
scanr f b [] = [b]
@[simp]
theorem List.scanr_ne_nil {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} :
scanr f b l []
@[simp]
theorem List.scanr_cons {α : Type u_1} {β : Type u_2} {b : β} {a : α} {l : List α} {f : αββ} :
scanr f b (a :: l) = foldr f b (a :: l) :: scanr f b l
theorem List.scanr_singleton {α : Type u_1} {β : Type u_2} {b : β} {a : α} {f : αββ} :
scanr f b [a] = [f a b, b]
@[simp]
theorem List.scanr_iff_nil {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} (c : β) :
scanr f b l = [c] c = b l = []
@[simp]
theorem List.length_scanr {α : Type u_1} {β : Type u_2} {f : αββ} (b : β) (l : List α) :
(scanr f b l).length = l.length + 1
theorem List.scanr_append {α : Type u_1} {β : Type u_2} {b : β} {f : αββ} (l₁ l₂ : List α) :
scanr f b (l₁ ++ l₂) = scanr f (foldr f b l₂) l₁ ++ (scanr f b l₂).tail
@[simp]
theorem List.head_scanr {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} (h : scanr f b l []) :
(scanr f b l).head h = foldr f b l
theorem List.getLast_scanr {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} (h : scanr f b l []) :
(scanr f b l).getLast h = b
theorem List.getLast?_scanr {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} :
(scanr f b l).getLast? = some b
theorem List.tail_scanr {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} (h : 0 < l.length) :
(scanr f b l).tail = scanr f b l.tail
theorem List.drop_scanr {α : Type u_1} {β : Type u_2} {i : Nat} {b : β} {l : List α} {f : αββ} (h : i l.length) :
drop i (scanr f b l) = scanr f b (drop i l)
@[simp]
theorem List.getElem_scanr {α : Type u_1} {β : Type u_2} {i : Nat} {b : β} {l : List α} {f : αββ} (h : i < (scanr f b l).length) :
(scanr f b l)[i] = foldr f b (drop i l)
theorem List.getElem?_scanr {α : Type u_1} {β : Type u_2} {i : Nat} {b : β} {l : List α} {f : αββ} (h : i < l.length + 1) :
(scanr f b l)[i]? = if i < l.length + 1 then some (foldr f b (drop i l)) else none
theorem List.getElem_scanr_zero {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} :
(scanr f b l)[0] = foldr f b l
theorem List.getElem?_scanr_zero {α : Type u_1} {β : Type u_2} {b : β} {l : List α} {f : αββ} :
(scanr f b l)[0]? = some (foldr f b l)
theorem List.getElem?_scanr_of_lt {α : Type u_1} {β : Type u_2} {i : Nat} {b : β} {l : List α} {f : αββ} (h : i < l.length + 1) :
(scanr f b l)[i]? = some (foldr f b (drop i l))
theorem List.scanr_map {α : Type u_1} {β : Type u_2} {γ : Type u_3} {f : αββ} {g : γα} (b : β) (l : List γ) :
scanr f b (map g l) = scanr (fun (x : γ) (acc : β) => f (g x) acc) b l
@[simp]
theorem List.scanl_reverse {β : Type u_1} {α : Type u_2} {f : βαβ} (b : β) (l : List α) :
scanl f b l.reverse = (scanr (flip f) b l).reverse
@[simp]
theorem List.scanr_reverse {α : Type u_1} {β : Type u_2} {f : αββ} (b : β) (l : List α) :
scanr f b l.reverse = (scanl (flip f) b l).reverse