Documentation

Init.Data.Range.Polymorphic.Lemmas

Lemmas about ranges #

This file provides lemmas about Std.PRange.

@[simp]
theorem Std.PRange.toList_toArray {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [BoundedUpwardEnumerable sl α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {r : PRange { lower := sl, upper := su } α} :
@[simp]
theorem Std.PRange.toArray_toList {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [BoundedUpwardEnumerable sl α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {r : PRange { lower := sl, upper := su } α} :
theorem Std.PRange.toList_eq_match {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [BoundedUpwardEnumerable sl α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {r : PRange { lower := sl, upper := su } α} :
r.toList = match init? r.lower with | none => [] | some a => if SupportsUpperBound.IsSatisfied r.upper a then a :: { lower := a, upper := r.upper }.toList else []
theorem Std.PRange.toArray_eq_match {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [BoundedUpwardEnumerable sl α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {r : PRange { lower := sl, upper := su } α} :
r.toArray = match init? r.lower with | none => #[] | some a => if SupportsUpperBound.IsSatisfied r.upper a then #[a] ++ { lower := a, upper := r.upper }.toArray else #[]
theorem Std.PRange.toList_Rox_eq_toList_Rcx_of_isSome_succ? {α : Type u} {su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {lo : Bound BoundShape.open α} {hi : Bound { lower := BoundShape.open, upper := su }.upper α} (h : (succ? lo).isSome = true) :
{ lower := lo, upper := hi }.toList = { lower := (succ? lo).get h, upper := hi }.toList
@[deprecated Std.PRange.toList_Rox_eq_toList_Rcx_of_isSome_succ? (since := "2025-08-22")]
theorem Std.PRange.toList_open_eq_toList_closed_of_isSome_succ? {α : Type u} {su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {lo : Bound BoundShape.open α} {hi : Bound { lower := BoundShape.open, upper := su }.upper α} (h : (succ? lo).isSome = true) :
{ lower := lo, upper := hi }.toList = { lower := (succ? lo).get h, upper := hi }.toList
theorem Std.PRange.toArray_Rox_eq_toList_Rcx_of_isSome_succ? {α : Type u} {su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerable α] {lo : Bound BoundShape.open α} {hi : Bound { lower := BoundShape.open, upper := su }.upper α} (h : (succ? lo).isSome = true) :
{ lower := lo, upper := hi }.toArray = { lower := (succ? lo).get h, upper := hi }.toArray
@[deprecated Std.PRange.BoundedUpwardEnumerable.init?_succ?_closed (since := "2025-08-22")]
theorem Std.PRange.forIn'_eq_forIn'_toList {α : Type u} {su sl : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [SupportsLowerBound sl α] [HasFiniteRanges su α] [BoundedUpwardEnumerable sl α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLowerBound sl α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := sl, upper := su } α} {γ : Type u} {init : γ} {m : Type u → Type w} [Monad m] [LawfulMonad m] {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = forIn' r.toList init fun (a : α) (ha : a r.toList) (acc : γ) => f a acc
theorem Std.PRange.forIn'_eq_forIn'_toArray {α : Type u} {su sl : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [SupportsLowerBound sl α] [HasFiniteRanges su α] [BoundedUpwardEnumerable sl α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLowerBound sl α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := sl, upper := su } α} {γ : Type u} {init : γ} {m : Type u → Type w} [Monad m] [LawfulMonad m] {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = forIn' r.toArray init fun (a : α) (ha : a r.toArray) (acc : γ) => f a acc
theorem Std.PRange.forIn'_toList_eq_forIn' {α : Type u} {su sl : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [SupportsLowerBound sl α] [HasFiniteRanges su α] [BoundedUpwardEnumerable sl α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLowerBound sl α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := sl, upper := su } α} {γ : Type u} {init : γ} {m : Type u → Type w} [Monad m] [LawfulMonad m] {f : (a : α) → a r.toListγm (ForInStep γ)} :
forIn' r.toList init f = forIn' r init fun (a : α) (ha : a r) (acc : γ) => f a acc
theorem Std.PRange.forIn'_toArray_eq_forIn' {α : Type u} {su sl : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [SupportsLowerBound sl α] [HasFiniteRanges su α] [BoundedUpwardEnumerable sl α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLowerBound sl α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := sl, upper := su } α} {γ : Type u} {init : γ} {m : Type u → Type w} [Monad m] [LawfulMonad m] {f : (a : α) → a r.toArrayγm (ForInStep γ)} :
forIn' r.toArray init f = forIn' r init fun (a : α) (ha : a r) (acc : γ) => f a acc
theorem Std.PRange.forIn'_eq_match {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [SupportsLowerBound sl α] [HasFiniteRanges su α] [BoundedUpwardEnumerable sl α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLowerBound sl α] [LawfulUpwardEnumerableUpperBound su α] [SupportsLowerBound BoundShape.open α] [LawfulUpwardEnumerableLowerBound BoundShape.open α] {r : PRange { lower := sl, upper := su } α} {γ : Type u} {init : γ} {m : Type u → Type w} [Monad m] [LawfulMonad m] {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match hi : init? r.lower with | none => pure init | some a => if hu : SupportsUpperBound.IsSatisfied r.upper a then do let __do_liftf a init match __do_lift with | ForInStep.yield c => forIn' { lower := a, upper := r.upper } c fun (a_1 : α) (ha : a_1 { lower := a, upper := r.upper }) (acc : γ) => f a_1 acc | ForInStep.done c => pure c else pure init
theorem Std.PRange.length_toList {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [RangeSize su α] [LawfulUpwardEnumerable α] [BoundedUpwardEnumerable sl α] [HasFiniteRanges su α] [LawfulRangeSize su α] {r : PRange { lower := sl, upper := su } α} :
theorem Std.PRange.size_toArray {α : Type u} {sl su : BoundShape} [UpwardEnumerable α] [SupportsUpperBound su α] [RangeSize su α] [LawfulUpwardEnumerable α] [BoundedUpwardEnumerable sl α] [HasFiniteRanges su α] [LawfulRangeSize su α] {r : PRange { lower := sl, upper := su } α} :
theorem Std.PRange.Std.PRange.eq_succMany?_of_toList_Rcx_eq_append_cons {α : Type u} {su : BoundShape} [LE α] [UpwardEnumerable α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLE α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := BoundShape.closed, upper := su } α} {pref suff : List α} {cur : α} (h : r.toList = pref ++ cur :: suff) :
cur = (succMany? pref.length r.lower).get
theorem Std.PRange.Std.PRange.eq_succMany?_of_toArray_Rcx_eq_append_append {α : Type u} {su : BoundShape} [LE α] [UpwardEnumerable α] [LawfulUpwardEnumerable α] [LawfulUpwardEnumerableLE α] [SupportsUpperBound su α] [HasFiniteRanges su α] [LawfulUpwardEnumerableUpperBound su α] {r : PRange { lower := BoundShape.closed, upper := su } α} {pref suff : Array α} {cur : α} (h : r.toArray = pref ++ #[cur] ++ suff) :
cur = (succMany? pref.size r.lower).get