Module docstring
{}
{}
List.finRange
definition
(n : Nat) : List (Fin n)
List.length_finRange
theorem
{n : Nat} : (List.finRange n).length = n
@[simp] theorem length_finRange {n : Nat} : (List.finRange n).length = n := by
simp [List.finRange]
List.getElem_finRange
theorem
{i : Nat} (h : i < (List.finRange n).length) : (finRange n)[i] = Fin.cast length_finRange ⟨i, h⟩
@[simp] theorem getElem_finRange {i : Nat} (h : i < (List.finRange n).length) :
(finRange n)[i] = Fin.cast length_finRange ⟨i, h⟩ := by
simp [List.finRange]
List.finRange_zero
theorem
: finRange 0 = []
@[simp] theorem finRange_zero : finRange 0 = [] := by simp [finRange, ofFn]
List.finRange_succ
theorem
{n} : finRange (n + 1) = 0 :: (finRange n).map Fin.succ
theorem finRange_succ {n} : finRange (n+1) = 0 :: (finRange n).map Fin.succ := by
apply List.ext_getElem; simp; intro i; cases i <;> simp
List.finRange_succ_last
theorem
{n} : finRange (n + 1) = (finRange n).map Fin.castSucc ++ [Fin.last n]
theorem finRange_succ_last {n} :
finRange (n+1) = (finRange n).map Fin.castSucc ++ [Fin.last n] := by
apply List.ext_getElem
· simp
· intros
simp only [List.finRange, List.getElem_ofFn, getElem_append, length_map, length_ofFn,
getElem_map, Fin.castSucc_mk, getElem_singleton]
split
· rfl
· next h => exact Fin.eq_last_of_not_lt h
List.finRange_reverse
theorem
{n} : (finRange n).reverse = (finRange n).map Fin.rev
theorem finRange_reverse {n} : (finRange n).reverse = (finRange n).map Fin.rev := by
induction n with
| zero => simp
| succ n ih =>
conv => lhs; rw [finRange_succ_last]
conv => rhs; rw [finRange_succ]
rw [reverse_append, reverse_cons, reverse_nil, nil_append, singleton_append, ← map_reverse,
map_cons, ih, map_map, map_map]
congr; funext
simp [Fin.rev_succ]