Documentation

Init.Data.Range.Polymorphic.Lemmas

Lemmas about ranges #

This file provides lemmas about Std.PRange.

theorem Std.Rcc.forIn'_congr {α : Type u} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Rcc α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Rco.forIn'_congr {α : Type u} [LE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Rco α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Rci.forIn'_congr {α : Type u} [LE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Rci α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Roc.forIn'_congr {α : Type u} [LE α] [LT α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Roc α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Roo.forIn'_congr {α : Type u} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Roo α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Roi.forIn'_congr {α : Type u} [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Roi α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Ric.forIn'_congr {α : Type u} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Ric α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Rio.forIn'_congr {α : Type u} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Rio α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Rii.forIn'_congr {α : Type u} [PRange.UpwardEnumerable α] [PRange.Least? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] [PRange.LawfulUpwardEnumerableLeast? α] {m : Type u → Type w} [Monad m] {γ : Type u} {init init' : γ} {r r' : Rii α} {f : (a : α) → a rγm (ForInStep γ)} {f' : (a : α) → a r'γm (ForInStep γ)} (hr : r = r') (hi : init = init') (h : ∀ (a : α) (m_1 : a r') (b : γ), f a b = f' a m_1 b) :
forIn' r init f = forIn' r' init' f'
theorem Std.Rxi.Iterator.toList_eq_match {α : Type u} [PRange.UpwardEnumerable α] [IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {it : Iter α} :
it.toList = match it.internalState.next with | none => [] | some a => a :: { internalState := { next := PRange.succ? a } }.toList
theorem Std.Rxi.Iterator.toArray_eq_match {α : Type u} [PRange.UpwardEnumerable α] [IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {it : Iter α} :
it.toArray = match it.internalState.next with | none => #[] | some a => #[a] ++ { internalState := { next := PRange.succ? a } }.toArray
theorem Std.Rcc.forIn'_eq_forIn'_toList {α : Type u} {r : Rcc α} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rcc.forIn'_eq_forIn'_toArray {α : Type u} {r : Rcc α} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rcc.forIn'_toList_eq_forIn' {α : Type u} {r : Rcc α} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rcc.forIn'_toArray_eq_forIn' {α : Type u} {r : Rcc α} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rcc.forIn'_eq_if {α : Type u} {r : Rcc α} [LE α] [DecidableLE α] [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = if hu : r.lower r.upper then have hle := ; do let __do_liftf r.lower init match __do_lift with | ForInStep.yield c => forIn' (r.lower<...=r.upper) c fun (a : α) (ha : a r.lower<...=r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Rco.forIn'_eq_forIn'_toList {α : Type u} {r : Rco α} [LE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rco.forIn'_eq_forIn'_toArray {α : Type u} {r : Rco α} [LE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rco.forIn'_toList_eq_forIn' {α : Type u} {r : Rco α} [LE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rco.forIn'_toArray_eq_forIn' {α : Type u} {r : Rco α} [LE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rco.forIn'_eq_if {α : Type u} {r : Rco α} [LE α] [DecidableLE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLE α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = if hu : r.lower < r.upper then have hle := ; do let __do_liftf r.lower init match __do_lift with | ForInStep.yield c => forIn' (r.lower<...r.upper) c fun (a : α) (ha : a r.lower<...r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Rci.forIn'_eq_forIn'_toList {α : Type u} {r : Rci α} [LE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rci.forIn'_eq_forIn'_toArray {α : Type u} {r : Rci α} [LE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rci.forIn'_toList_eq_forIn' {α : Type u} {r : Rci α} [LE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rci.forIn'_toArray_eq_forIn' {α : Type u} {r : Rci α} [LE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rci.forIn'_eq_match {α : Type u} {r : Rci α} [LE α] [DecidableLE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLE α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = have hle := ; do let __do_liftf r.lower hle init match __do_lift with | ForInStep.yield c => forIn' r.lower<...* c fun (a : α) (ha : a r.lower<...*) (acc : γ) => f a acc | ForInStep.done c => pure c
theorem Std.Roc.forIn'_eq_forIn'_toList {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roc.forIn'_eq_forIn'_toArray {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roc.forIn'_toList_eq_forIn' {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roc.forIn'_toArray_eq_forIn' {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roc.mem_of_mem_of_le {α : Type u} [LE α] [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] {lo lo' hi a : α} (h : lo lo') (hmem : a lo'<...=hi) :
a lo<...=hi
theorem Std.Roc.forIn'_eq_match {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match hs : PRange.succ? r.lower with | none => pure init | some next => if hu : next r.upper then have hlt := ; do let __do_liftf next init match __do_lift with | ForInStep.yield c => forIn' (next<...=r.upper) c fun (a : α) (ha : a next<...=r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Roo.forIn'_eq_forIn'_toList {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roo.forIn'_eq_forIn'_toArray {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roo.forIn'_toList_eq_forIn' {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roo.forIn'_toArray_eq_forIn' {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roo.forIn'_eq_match {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match hs : PRange.succ? r.lower with | none => pure init | some next => if hu : next < r.upper then have hlt := ; have hle := ; do let __do_liftf next init match __do_lift with | ForInStep.yield c => forIn' (next<...r.upper) c fun (a : α) (ha : a next<...r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Roi.forIn'_eq_forIn'_toList {α : Type u} {r : Roi α} [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roi.forIn'_eq_forIn'_toArray {α : Type u} {r : Roi α} [LT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roi.forIn'_toList_eq_forIn' {α : Type u} {r : Roi α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roi.forIn'_toArray_eq_forIn' {α : Type u} {r : Roi α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Roi.forIn'_eq_match {α : Type u} {r : Roi α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match hs : PRange.succ? r.lower with | none => pure init | some next => have hlt := ; have hle := ; do let __do_liftf next hlt init match __do_lift with | ForInStep.yield c => forIn' next<...* c fun (a : α) (ha : a next<...*) (acc : γ) => f a acc | ForInStep.done c => pure c
theorem Std.Ric.forIn'_eq_forIn'_toList {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Ric.forIn'_eq_forIn'_toArray {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Ric.forIn'_toList_eq_forIn' {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Ric.forIn'_toArray_eq_forIn' {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Ric.mem_of_mem_Rcc {α : Type u} [LE α] {lo hi a : α} (hmem : a lo...=hi) :
a *...=hi
theorem Std.Ric.mem_of_mem_Roc {α : Type u} [LE α] [LT α] {lo hi a : α} (hmem : a lo<...=hi) :
a *...=hi
theorem Std.Ric.forIn'_eq_forIn'_Rcc {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = forIn' (PRange.UpwardEnumerable.least...=r.upper) init fun (a : α) (ha : a PRange.UpwardEnumerable.least...=r.upper) (acc : γ) => f a acc
theorem Std.Ric.forIn'_eq_if {α : Type u} {r : Ric α} [LE α] [DecidableLE α] [LT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxc.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = if hu : PRange.UpwardEnumerable.least r.upper then do let __do_liftf PRange.UpwardEnumerable.least hu init match __do_lift with | ForInStep.yield c => forIn' (PRange.UpwardEnumerable.least<...=r.upper) c fun (a : α) (ha : a PRange.UpwardEnumerable.least<...=r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Rio.forIn'_eq_forIn'_toList {α : Type u} {r : Rio α} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rio.forIn'_eq_forIn'_toArray {α : Type u} {r : Rio α} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rio.forIn'_toList_eq_forIn' {α : Type u} {r : Rio α} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rio.forIn'_toArray_eq_forIn' {α : Type u} {r : Rio α} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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.Rio.mem_of_mem_Rco {α : Type u} [LE α] [LT α] {lo hi a : α} (hmem : a lo...hi) :
a *...hi
theorem Std.Rio.mem_of_mem_Roo {α : Type u} [LT α] {lo hi a : α} (hmem : a lo<...hi) :
a *...hi
theorem Std.Rio.forIn'_eq_if {α : Type u} {r : Rio α} [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = if hu : PRange.UpwardEnumerable.least < r.upper then do let __do_liftf PRange.UpwardEnumerable.least hu init match __do_lift with | ForInStep.yield c => forIn' (PRange.UpwardEnumerable.least<...r.upper) c fun (a : α) (ha : a PRange.UpwardEnumerable.least<...r.upper) (acc : γ) => f a acc | ForInStep.done c => pure c else pure init
theorem Std.Rio.forIn'_eq_forIn'_Rco {α : Type u} {r : Rio α} [LE α] [LT α] [DecidableLT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxo.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = forIn' (PRange.UpwardEnumerable.least...r.upper) init fun (a : α) (ha : a PRange.UpwardEnumerable.least...r.upper) (acc : γ) => f a acc
theorem Std.Rii.forIn'_eq_forIn'_toList {α : Type u} {r : Rii α} [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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 : α) (x : a r.toList) (acc : γ) => f a acc
theorem Std.Rii.forIn'_eq_forIn'_toArray {α : Type u} {r : Rii α} [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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 : α) (x : a r.toArray) (acc : γ) => f a acc
theorem Std.Rii.forIn'_toList_eq_forIn' {α : Type u} {r : Rii α} [LT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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 : α) (x : a r) (acc : γ) => f a acc
theorem Std.Rii.forIn'_toArray_eq_forIn' {α : Type u} {r : Rii α} [LT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {γ : 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 : α) (x : a r) (acc : γ) => f a acc
theorem Std.Rii.forIn'_eq_match_forIn'_Rci {α : Type u} {r : Rii α} [LE α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match PRange.least? with | none => pure init | some next => forIn' next...* init fun (a : α) (x : a next...*) (acc : γ) => f a acc
theorem Std.Rii.forIn'_eq_match_forIn'_Roi {α : Type u} {r : Rii α} {hu : True} [LT α] [PRange.Least? α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [PRange.LawfulUpwardEnumerableLeast? α] [Rxi.IsAlwaysFinite α] [PRange.LawfulUpwardEnumerable α] {m : Type u → Type w} [Monad m] [LawfulMonad m] {γ : Type u} {init : γ} {f : (a : α) → a rγm (ForInStep γ)} :
forIn' r init f = match PRange.least? with | none => pure init | some next => do let __do_liftf next hu init match __do_lift with | ForInStep.yield c => forIn' next<...* c fun (a : α) (x : a next<...*) (acc : γ) => f a acc | ForInStep.done c => pure c
theorem Std.Roc.eq_succMany?_of_toList_eq_append_cons {α : Type u} {r : Roc α} [LE α] [DecidableLE α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerable α] [PRange.LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] {pref suff : List α} {cur : α} (h : r.toList = pref ++ cur :: suff) :
cur = (PRange.succMany? (pref.length + 1) r.lower).get
theorem Std.Roo.eq_succMany?_of_toList_eq_append_cons {α : Type u} {r : Roo α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] {pref suff : List α} {cur : α} (h : r.toList = pref ++ cur :: suff) :
cur = (PRange.succMany? (pref.length + 1) r.lower).get
theorem Std.Roi.eq_succMany?_of_toList_eq_append_cons {α : Type u} {r : Roi α} [LT α] [DecidableLT α] [PRange.UpwardEnumerable α] [PRange.LawfulUpwardEnumerable α] [PRange.LawfulUpwardEnumerableLT α] [Rxi.IsAlwaysFinite α] {pref suff : List α} {cur : α} (h : r.toList = pref ++ cur :: suff) :
cur = (PRange.succMany? (pref.length + 1) r.lower).get