Module docstring
{"# iterate
Proves various lemmas about List.iterate.
"}
{"# iterate
Proves various lemmas about List.iterate.
"}
List.length_iterate
theorem
(f : α → α) (a : α) (n : ℕ) : length (iterate f a n) = n
@[simp]
theorem length_iterate (f : α → α) (a : α) (n : ℕ) : length (iterate f a n) = n := by
induction n generalizing a <;> simp [*]
List.iterate_eq_nil
theorem
{f : α → α} {a : α} {n : ℕ} : iterate f a n = [] ↔ n = 0
@[simp]
theorem iterate_eq_nil {f : α → α} {a : α} {n : ℕ} : iterateiterate f a n = [] ↔ n = 0 := by
rw [← length_eq_zero_iff, length_iterate]
List.getElem?_iterate
theorem
(f : α → α) (a : α) : ∀ (n i : ℕ), i < n → (iterate f a n)[i]? = f^[i] a
theorem getElem?_iterate (f : α → α) (a : α) :
∀ (n i : ℕ), i < n → (iterate f a n)[i]? = f^[i] a
| n + 1, 0 , _ => by simp
| n + 1, i + 1, h => by simp [getElem?_iterate f (f a) n i (by simpa using h)]
List.getElem_iterate
theorem
(f : α → α) (a : α) (n : ℕ) (i : Nat) (h : i < (iterate f a n).length) : (iterate f a n)[i] = f^[i] a
@[simp]
theorem getElem_iterate (f : α → α) (a : α) (n : ℕ) (i : Nat) (h : i < (iterate f a n).length) :
(iterate f a n)[i] = f^[i] a :=
(getElem_eq_iff _).2 <| getElem?_iterate _ _ _ _ <| by rwa [length_iterate] at h
List.mem_iterate
theorem
{f : α → α} {a : α} {n : ℕ} {b : α} : b ∈ iterate f a n ↔ ∃ m < n, b = f^[m] a
@[simp]
theorem mem_iterate {f : α → α} {a : α} {n : ℕ} {b : α} :
b ∈ iterate f a nb ∈ iterate f a n ↔ ∃ m < n, b = f^[m] a := by
simp [List.mem_iff_get, Fin.exists_iff, eq_comm (b := b)]
List.range_map_iterate
theorem
(n : ℕ) (f : α → α) (a : α) : (List.range n).map (f^[·] a) = List.iterate f a n
@[simp]
theorem range_map_iterate (n : ℕ) (f : α → α) (a : α) :
(List.range n).map (f^[·] a) = List.iterate f a n := by
apply List.ext_getElem <;> simp
List.iterate_add
theorem
(f : α → α) (a : α) (m n : ℕ) : iterate f a (m + n) = iterate f a m ++ iterate f (f^[m] a) n
theorem iterate_add (f : α → α) (a : α) (m n : ℕ) :
iterate f a (m + n) = iterate f a m ++ iterate f (f^[m] a) n := by
induction m generalizing a with
| zero => simp
| succ n ih => rw [iterate, add_right_comm, iterate, ih, Nat.iterate, cons_append]
List.take_iterate
theorem
(f : α → α) (a : α) (m n : ℕ) : take m (iterate f a n) = iterate f a (min m n)
theorem take_iterate (f : α → α) (a : α) (m n : ℕ) :
take m (iterate f a n) = iterate f a (min m n) := by
rw [← range_map_iterate, ← range_map_iterate, ← map_take, take_range]