57 lines
1.8 KiB
Text
57 lines
1.8 KiB
Text
/-
|
||
Copyright (c) 2014 Parikshit Khanna. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Parikshit Khanna, Jeremy Avigad, Leonardo de Moura, Floris van Doorn, Mario Carneiro
|
||
-/
|
||
prelude
|
||
import Init.Data.List.Pairwise
|
||
|
||
/-!
|
||
# Lemmas about `List.range` and `List.enum`
|
||
|
||
Most of the results are deferred to `Data.Init.List.Nat.Range`, where more results about
|
||
natural arithmetic are available.
|
||
-/
|
||
|
||
namespace List
|
||
|
||
open Nat
|
||
|
||
/-! ## Ranges and enumeration -/
|
||
|
||
/-! ### enumFrom -/
|
||
|
||
@[simp]
|
||
theorem enumFrom_eq_nil {n : Nat} {l : List α} : List.enumFrom n l = [] ↔ l = [] := by
|
||
cases l <;> simp
|
||
|
||
@[simp] theorem enumFrom_length : ∀ {n} {l : List α}, (enumFrom n l).length = l.length
|
||
| _, [] => rfl
|
||
| _, _ :: _ => congrArg Nat.succ enumFrom_length
|
||
|
||
@[simp]
|
||
theorem getElem?_enumFrom :
|
||
∀ n (l : List α) m, (enumFrom n l)[m]? = l[m]?.map fun a => (n + m, a)
|
||
| n, [], m => rfl
|
||
| n, a :: l, 0 => by simp
|
||
| n, a :: l, m + 1 => by
|
||
simp only [enumFrom_cons, getElem?_cons_succ]
|
||
exact (getElem?_enumFrom (n + 1) l m).trans <| by rw [Nat.add_right_comm]; rfl
|
||
|
||
@[simp]
|
||
theorem getElem_enumFrom (l : List α) (n) (i : Nat) (h : i < (l.enumFrom n).length) :
|
||
(l.enumFrom n)[i] = (n + i, l[i]'(by simpa [enumFrom_length] using h)) := by
|
||
simp only [enumFrom_length] at h
|
||
rw [getElem_eq_getElem?]
|
||
simp only [getElem?_enumFrom, getElem?_eq_getElem h]
|
||
simp
|
||
|
||
theorem map_fst_add_enumFrom_eq_enumFrom (l : List α) (n k : Nat) :
|
||
map (Prod.map (· + n) id) (enumFrom k l) = enumFrom (n + k) l :=
|
||
ext_getElem? fun i ↦ by simp [(· ∘ ·), Nat.add_comm, Nat.add_left_comm]; rfl
|
||
|
||
theorem map_fst_add_enum_eq_enumFrom (l : List α) (n : Nat) :
|
||
map (Prod.map (· + n) id) (enum l) = enumFrom n l :=
|
||
map_fst_add_enumFrom_eq_enumFrom l _ _
|
||
|
||
end List
|