Documentation

Init.Data.Range.Polymorphic.Lemmas

Lemmas about ranges #

This file provides lemmas about Std.PRange.

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 } α} :
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 : (UpwardEnumerable.succ? lo).isSome = true) :
{ lower := lo, upper := hi }.toList = { lower := (UpwardEnumerable.succ? lo).get h, upper := hi }.toList
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'_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'_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 : BoundedUpwardEnumerable.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