Compare commits

...

3 Commits

Author SHA1 Message Date
Paul Reichert
bb0038abef poke 2026-01-28 15:16:58 +01:00
Paul Reichert
93966ae688 more changes 2026-01-28 12:06:06 +01:00
Paul Reichert
57c613d28b rename length to count 2026-01-28 11:53:58 +01:00
19 changed files with 256 additions and 217 deletions

View File

@@ -638,9 +638,15 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, expose]
def Iter.count {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
def Iter.length {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
(it : Iter (α := α) β) : Nat :=
it.toIterM.count.run.down
it.toIterM.length.run.down
@[inline, inherit_doc Iter.length, deprecated Iter.length (since := "2026-01-28"), expose]
def Iter.count := @Iter.length
@[inline, inherit_doc Iter.length, deprecated Iter.length (since := "2025-10-29"), expose]
def Iter.size := @Iter.length
/--
Steps through the whole iterator, counting the number of outputs emitted.
@@ -649,22 +655,10 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, expose, deprecated Iter.count (since := "2025-10-29")]
def Iter.size {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
(it : Iter (α := α) β) : Nat :=
it.count
/--
Steps through the whole iterator, counting the number of outputs emitted.
**Performance**:
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, expose, deprecated Iter.count (since := "2025-12-04")]
@[always_inline, inline, expose, deprecated Iter.length (since := "2025-12-04")]
def Iter.Partial.count {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
(it : Iter.Partial (α := α) β) : Nat :=
it.it.toIterM.count.run.down
it.it.toIterM.length.run.down
/--
Steps through the whole iterator, counting the number of outputs emitted.
@@ -673,9 +667,9 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, expose, deprecated Iter.count (since := "2025-10-29")]
@[always_inline, inline, expose, deprecated Iter.length (since := "2025-10-29")]
def Iter.Partial.size {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
(it : Iter.Partial (α := α) β) : Nat :=
it.it.count
it.it.length
end Std

View File

@@ -912,21 +912,15 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline]
def IterM.count {α : Type w} {m : Type w Type w'} {β : Type w} [Iterator α m β]
def IterM.length {α : Type w} {m : Type w Type w'} {β : Type w} [Iterator α m β]
[IteratorLoop α m m] [Monad m] (it : IterM (α := α) m β) : m (ULift Nat) :=
it.fold (init := .up 0) fun acc _ => .up (acc.down + 1)
/--
Steps through the whole iterator, counting the number of outputs emitted.
@[inline, inherit_doc IterM.length, deprecated IterM.length (since := "2026-01-28"), expose]
def IterM.count := @IterM.length
**Performance**:
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, deprecated IterM.count (since := "2025-10-29")]
def IterM.size {α : Type w} {m : Type w Type w'} {β : Type w} [Iterator α m β]
[IteratorLoop α m m] [Monad m] (it : IterM (α := α) m β) : m (ULift Nat) :=
it.count
@[inline, inherit_doc IterM.length, deprecated IterM.length (since := "2025-10-29"), expose]
def IterM.size := @IterM.length
/--
Steps through the whole iterator, counting the number of outputs emitted.
@@ -935,7 +929,7 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, deprecated IterM.count (since := "2025-12-04")]
@[always_inline, inline, deprecated IterM.length (since := "2025-12-04")]
def IterM.Partial.count {α : Type w} {m : Type w Type w'} {β : Type w} [Iterator α m β]
[IteratorLoop α m m] [Monad m] (it : IterM.Partial (α := α) m β) : m (ULift Nat) :=
it.it.fold (init := .up 0) fun acc _ => .up (acc.down + 1)
@@ -947,10 +941,10 @@ Steps through the whole iterator, counting the number of outputs emitted.
This function's runtime is linear in the number of steps taken by the iterator.
-/
@[always_inline, inline, deprecated IterM.Partial.count (since := "2025-10-29")]
@[always_inline, inline, deprecated IterM.length (since := "2025-10-29")]
def IterM.Partial.size {α : Type w} {m : Type w Type w'} {β : Type w} [Iterator α m β]
[IteratorLoop α m m] [Monad m] (it : IterM.Partial (α := α) m β) : m (ULift Nat) :=
it.it.count
it.it.length
end Count

View File

@@ -79,12 +79,15 @@ theorem Iter.toArray_attachWith [Iterator α Id β]
simp [Iter.toList_toArray]
@[simp]
theorem Iter.count_attachWith [Iterator α Id β]
theorem Iter.length_attachWith [Iterator α Id β]
{it : Iter (α := α) β} {hP}
[Finite α Id] [IteratorLoop α Id Id]
[LawfulIteratorLoop α Id Id] :
(it.attachWith P hP).count = it.count := by
rw [ Iter.length_toList_eq_count, toList_attachWith]
(it.attachWith P hP).length = it.length := by
rw [ Iter.length_toList_eq_length, toList_attachWith]
simp
@[deprecated Iter.length_attachWith (since := "2026-01-28")]
def Iter.count_attachWith := @Iter.length_attachWith
end Std

View File

@@ -722,11 +722,14 @@ end Fold
section Count
@[simp]
theorem Iter.count_map {α β β' : Type w} [Iterator α Id β]
theorem Iter.length_map {α β β' : Type w} [Iterator α Id β]
[IteratorLoop α Id Id] [Finite α Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} {f : β β'} :
(it.map f).count = it.count := by
simp [map_eq_toIter_map_toIterM, count_eq_count_toIterM]
(it.map f).length = it.length := by
simp [map_eq_toIter_map_toIterM, length_eq_length_toIterM]
@[deprecated Iter.length_map (since := "2026-01-28")]
def Iter.count_map := @Iter.length_map
end Count

View File

@@ -60,12 +60,15 @@ theorem IterM.map_unattach_toArray_attachWith [Iterator α m β] [Monad m] [Mona
simp [-map_unattach_toList_attachWith, -IterM.toArray_toList]
@[simp]
theorem IterM.count_attachWith [Iterator α m β] [Monad m] [Monad n]
theorem IterM.length_attachWith [Iterator α m β] [Monad m] [Monad n]
{it : IterM (α := α) m β} {hP}
[Finite α m] [IteratorLoop α m m] [LawfulMonad m] [LawfulIteratorLoop α m m] :
(it.attachWith P hP).count = it.count := by
rw [ up_length_toList_eq_count, up_length_toList_eq_count,
(it.attachWith P hP).length = it.length := by
rw [ up_length_toList_eq_length, up_length_toList_eq_length,
map_unattach_toList_attachWith (it := it) (P := P) (hP := hP)]
simp only [Functor.map_map, List.length_unattach]
@[deprecated IterM.length_attachWith (since := "2026-01-28")]
def IterM.count_attachWith := @IterM.length_attachWith
end Std

View File

@@ -1620,18 +1620,21 @@ end Fold
section Count
@[simp]
theorem IterM.count_map {α β β' : Type w} {m : Type w Type w'} [Iterator α m β] [Monad m]
theorem IterM.length_map {α β β' : Type w} {m : Type w Type w'} [Iterator α m β] [Monad m]
[IteratorLoop α m m] [Finite α m] [LawfulMonad m] [LawfulIteratorLoop α m m]
{it : IterM (α := α) m β} {f : β β'} :
(it.map f).count = it.count := by
(it.map f).length = it.length := by
induction it using IterM.inductSteps with | step it ihy ihs
rw [count_eq_match_step, count_eq_match_step, step_map, bind_assoc]
rw [length_eq_match_step, length_eq_match_step, step_map, bind_assoc]
apply bind_congr; intro step
cases step.inflate using PlausibleIterStep.casesOn
· simp [ihy _]
· simp [ihs _]
· simp
@[deprecated IterM.length_map (since := "2026-01-28")]
def IterM.count_map := @IterM.length_map
end Count
section AnyAll

View File

@@ -66,14 +66,14 @@ theorem IterM.toArray_uLift [Iterator α m β] [Monad m] [Monad n] {it : IterM (
simp
@[simp]
theorem IterM.count_uLift [Iterator α m β] [Monad m] [Monad n] {it : IterM (α := α) m β}
theorem IterM.length_uLift [Iterator α m β] [Monad m] [Monad n] {it : IterM (α := α) m β}
[MonadLiftT m (ULiftT n)] [Finite α m] [IteratorLoop α m m]
[LawfulMonad m] [LawfulMonad n] [LawfulIteratorLoop α m m]
[LawfulMonadLiftT m (ULiftT n)] :
(it.uLift n).count =
(.up ·.down.down) <$> (monadLift (n := ULiftT n) it.count).run := by
(it.uLift n).length =
(.up ·.down.down) <$> (monadLift (n := ULiftT n) it.length).run := by
induction it using IterM.inductSteps with | step it ihy ihs
rw [count_eq_match_step, count_eq_match_step, monadLift_bind, map_eq_pure_bind, step_uLift]
rw [length_eq_match_step, length_eq_match_step, monadLift_bind, map_eq_pure_bind, step_uLift]
simp only [bind_assoc, ULiftT.run_bind]
apply bind_congr; intro step
cases step.down.inflate using PlausibleIterStep.casesOn
@@ -81,4 +81,7 @@ theorem IterM.count_uLift [Iterator α m β] [Monad m] [Monad n] {it : IterM (α
· simp [ihs _]
· simp
@[deprecated IterM.length_uLift (since := "2026-01-28")]
def IterM.count_uLift := @IterM.length_uLift
end Std

View File

@@ -57,11 +57,14 @@ theorem Iter.toArray_uLift [Iterator α Id β] {it : Iter (α := α) β}
simp [-toArray_toList]
@[simp]
theorem Iter.count_uLift [Iterator α Id β] {it : Iter (α := α) β}
theorem Iter.length_uLift [Iterator α Id β] {it : Iter (α := α) β}
[Finite α Id] [IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id] :
it.uLift.count = it.count := by
simp only [monadLift, uLift_eq_toIter_uLift_toIterM, count_eq_count_toIterM, toIterM_toIter]
rw [IterM.count_uLift]
it.uLift.length = it.length := by
simp only [monadLift, uLift_eq_toIter_uLift_toIterM, length_eq_length_toIterM, toIterM_toIter]
rw [IterM.length_uLift]
simp [monadLift]
@[deprecated Iter.length_uLift (since := "2026-01-28")]
def Iter.count_uLift := @Iter.length_uLift
end Std

View File

@@ -460,69 +460,90 @@ theorem Iter.foldl_toArray {α β : Type w} {γ : Type x} [Iterator α Id β] [F
it.toArray.foldl (init := init) f = it.fold (init := init) f := by
rw [fold_eq_foldM, Array.foldl_eq_foldlM, Iter.foldlM_toArray]
theorem Iter.count_eq_count_toIterM {α β : Type w} [Iterator α Id β]
theorem Iter.length_eq_length_toIterM {α β : Type w} [Iterator α Id β]
[Finite α Id] [IteratorLoop α Id Id.{w}] {it : Iter (α := α) β} :
it.count = it.toIterM.count.run.down :=
it.length = it.toIterM.length.run.down :=
(rfl)
theorem Iter.count_eq_fold {α β : Type w} [Iterator α Id β]
@[deprecated Iter.length_eq_length_toIterM (since := "2026-01-28")]
def Iter.count_eq_count_toIterM := @Iter.length_eq_length_toIterM
theorem Iter.length_eq_fold {α β : Type w} [Iterator α Id β]
[Finite α Id] [IteratorLoop α Id Id.{w}] [LawfulIteratorLoop α Id Id.{w}]
[IteratorLoop α Id Id.{0}] [LawfulIteratorLoop α Id Id.{0}]
{it : Iter (α := α) β} :
it.count = it.fold (γ := Nat) (init := 0) (fun acc _ => acc + 1) := by
rw [count_eq_count_toIterM, IterM.count_eq_fold, fold_eq_fold_toIterM]
it.length = it.fold (γ := Nat) (init := 0) (fun acc _ => acc + 1) := by
rw [length_eq_length_toIterM, IterM.length_eq_fold, fold_eq_fold_toIterM]
rw [ fold_hom (f := ULift.down)]
simp
theorem Iter.count_eq_forIn {α β : Type w} [Iterator α Id β]
@[deprecated Iter.length_eq_fold (since := "2026-01-28")]
def Iter.count_eq_fold := @Iter.length_eq_fold
theorem Iter.length_eq_forIn {α β : Type w} [Iterator α Id β]
[Finite α Id] [IteratorLoop α Id Id.{w}] [LawfulIteratorLoop α Id Id.{w}]
[IteratorLoop α Id Id.{0}] [LawfulIteratorLoop α Id Id.{0}]
{it : Iter (α := α) β} :
it.count = (ForIn.forIn (m := Id) it 0 (fun _ acc => return .yield (acc + 1))).run := by
rw [count_eq_fold, forIn_pure_yield_eq_fold, Id.run_pure]
it.length = (ForIn.forIn (m := Id) it 0 (fun _ acc => return .yield (acc + 1))).run := by
rw [length_eq_fold, forIn_pure_yield_eq_fold, Id.run_pure]
theorem Iter.count_eq_match_step {α β : Type w} [Iterator α Id β]
@[deprecated Iter.length_eq_forIn (since := "2026-01-28")]
def Iter.count_eq_forIn := @Iter.length_eq_forIn
theorem Iter.length_eq_match_step {α β : Type w} [Iterator α Id β]
[Finite α Id] [IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} :
it.count = (match it.step.val with
| .yield it' _ => it'.count + 1
| .skip it' => it'.count
it.length = (match it.step.val with
| .yield it' _ => it'.length + 1
| .skip it' => it'.length
| .done => 0) := by
simp only [count_eq_count_toIterM]
rw [IterM.count_eq_match_step]
simp only [length_eq_length_toIterM]
rw [IterM.length_eq_match_step]
simp only [bind_pure_comp, id_map', Id.run_bind, Iter.step]
cases it.toIterM.step.run.inflate using PlausibleIterStep.casesOn <;> simp
@[simp]
theorem Iter.size_toArray_eq_count {α β : Type w} [Iterator α Id β] [Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} :
it.toArray.size = it.count := by
simp only [toArray_eq_toArray_toIterM, count_eq_count_toIterM, Id.run_map,
IterM.up_size_toArray_eq_count]
@[deprecated Iter.size_toArray_eq_count (since := "2025-10-29")]
def Iter.size_toArray_eq_size := @size_toArray_eq_count
@[deprecated Iter.length_eq_match_step (since := "2026-01-28")]
def Iter.count_eq_match_step := @Iter.length_eq_match_step
@[simp]
theorem Iter.length_toList_eq_count {α β : Type w} [Iterator α Id β] [Finite α Id]
theorem Iter.size_toArray_eq_length {α β : Type w} [Iterator α Id β] [Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} :
it.toList.length = it.count := by
rw [ toList_toArray, Array.length_toList, size_toArray_eq_count]
it.toArray.size = it.length := by
simp only [toArray_eq_toArray_toIterM, length_eq_length_toIterM, Id.run_map,
IterM.up_size_toArray_eq_length]
@[deprecated Iter.length_toList_eq_count (since := "2025-10-29")]
def Iter.length_toList_eq_size := @length_toList_eq_count
@[deprecated Iter.size_toArray_eq_length (since := "2025-10-29")]
def Iter.size_toArray_eq_size := @size_toArray_eq_length
@[deprecated Iter.size_toArray_eq_length (since := "2026-01-28")]
def Iter.size_toArray_eq_count := @size_toArray_eq_length
@[simp]
theorem Iter.length_toListRev_eq_count {α β : Type w} [Iterator α Id β] [Finite α Id]
theorem Iter.length_toList_eq_length {α β : Type w} [Iterator α Id β] [Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} :
it.toListRev.length = it.count := by
rw [toListRev_eq, List.length_reverse, length_toList_eq_count]
it.toList.length = it.length := by
rw [ toList_toArray, Array.length_toList, size_toArray_eq_length]
@[deprecated Iter.length_toListRev_eq_count (since := "2025-10-29")]
def Iter.length_toListRev_eq_size := @length_toListRev_eq_count
@[deprecated Iter.length_toList_eq_length (since := "2025-10-29")]
def Iter.length_toList_eq_size := @length_toList_eq_length
@[deprecated Iter.length_toList_eq_length (since := "2026-01-28")]
def Iter.length_toList_eq_count := @length_toList_eq_length
@[simp]
theorem Iter.length_toListRev_eq_length {α β : Type w} [Iterator α Id β] [Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{it : Iter (α := α) β} :
it.toListRev.length = it.length := by
rw [toListRev_eq, List.length_reverse, length_toList_eq_length]
@[deprecated Iter.length_toListRev_eq_length (since := "2025-10-29")]
def Iter.length_toListRev_eq_size := @length_toListRev_eq_length
@[deprecated Iter.length_toListRev_eq_length (since := "2026-01-28")]
def Iter.length_toListRev_eq_count := @length_toListRev_eq_length
theorem Iter.anyM_eq_forIn {α β : Type w} {m : Type Type w'} [Iterator α Id β]
[Finite α Id] [Monad m] [LawfulMonad m] [IteratorLoop α Id m] [LawfulIteratorLoop α Id m]

View File

@@ -467,27 +467,33 @@ theorem IterM.drain_eq_map_toArray {α β : Type w} {m : Type w → Type w'} [It
it.drain = (fun _ => .unit) <$> it.toList := by
simp [IterM.drain_eq_map_toList]
theorem IterM.count_eq_fold {α β : Type w} {m : Type w Type w'} [Iterator α m β]
theorem IterM.length_eq_fold {α β : Type w} {m : Type w Type w'} [Iterator α m β]
[Finite α m] [Monad m] [LawfulMonad m] [IteratorLoop α m m]
{it : IterM (α := α) m β} :
it.count = it.fold (init := .up 0) (fun acc _ => .up <| acc.down + 1) :=
it.length = it.fold (init := .up 0) (fun acc _ => .up <| acc.down + 1) :=
(rfl)
theorem IterM.count_eq_forIn {α β : Type w} {m : Type w Type w'} [Iterator α m β]
@[deprecated IterM.length_eq_fold (since := "2026-01-28")]
def IterM.count_eq_fold := @IterM.length_eq_fold
theorem IterM.length_eq_forIn {α β : Type w} {m : Type w Type w'} [Iterator α m β]
[Finite α m] [Monad m] [LawfulMonad m] [IteratorLoop α m m]
{it : IterM (α := α) m β} :
it.count = ForIn.forIn it (.up 0) (fun _ acc => return .yield (.up (acc.down + 1))) :=
it.length = ForIn.forIn it (.up 0) (fun _ acc => return .yield (.up (acc.down + 1))) :=
(rfl)
theorem IterM.count_eq_match_step {α β : Type w} {m : Type w Type w'} [Iterator α m β]
@[deprecated IterM.length_eq_forIn (since := "2026-01-28")]
def IterM.count_eq_forIn := @IterM.length_eq_forIn
theorem IterM.length_eq_match_step {α β : Type w} {m : Type w Type w'} [Iterator α m β]
[Finite α m] [Monad m] [LawfulMonad m] [IteratorLoop α m m] [LawfulIteratorLoop α m m]
{it : IterM (α := α) m β} :
it.count = (do
it.length = (do
match ( it.step).inflate.val with
| .yield it' _ => return .up (( it'.count).down + 1)
| .skip it' => return .up ( it'.count).down
| .yield it' _ => return .up (( it'.length).down + 1)
| .skip it' => return .up ( it'.length).down
| .done => return .up 0) := by
simp only [count_eq_fold]
simp only [length_eq_fold]
have (acc : Nat) (it' : IterM (α := α) m β) :
it'.fold (init := ULift.up acc) (fun acc _ => .up (acc.down + 1)) =
(ULift.up <| ·.down + acc) <$>
@@ -503,33 +509,45 @@ theorem IterM.count_eq_match_step {α β : Type w} {m : Type w → Type w'} [Ite
· simp
· simp
@[deprecated IterM.length_eq_match_step (since := "2026-01-28")]
def IterM.count_eq_match_step := @IterM.length_eq_match_step
@[simp]
theorem IterM.up_size_toArray_eq_count {α β : Type w} [Iterator α m β] [Finite α m]
theorem IterM.up_size_toArray_eq_length {α β : Type w} [Iterator α m β] [Finite α m]
[Monad m] [LawfulMonad m]
[IteratorLoop α m m] [LawfulIteratorLoop α m m]
{it : IterM (α := α) m β} :
(.up <| ·.size) <$> it.toArray = it.count := by
rw [toArray_eq_fold, count_eq_fold, fold_hom]
(.up <| ·.size) <$> it.toArray = it.length := by
rw [toArray_eq_fold, length_eq_fold, fold_hom]
· simp only [List.size_toArray, List.length_nil]; rfl
· simp
@[deprecated IterM.up_size_toArray_eq_length (since := "2026-01-28")]
def IterM.up_size_toArray_eq_count := @IterM.up_size_toArray_eq_length
@[simp]
theorem IterM.up_length_toList_eq_count {α β : Type w} [Iterator α m β] [Finite α m]
theorem IterM.up_length_toList_eq_length {α β : Type w} [Iterator α m β] [Finite α m]
[Monad m] [LawfulMonad m]
[IteratorLoop α m m] [LawfulIteratorLoop α m m]
{it : IterM (α := α) m β} :
(.up <| ·.length) <$> it.toList = it.count := by
rw [toList_eq_fold, count_eq_fold, fold_hom]
(.up <| ·.length) <$> it.toList = it.length := by
rw [toList_eq_fold, length_eq_fold, fold_hom]
· simp only [List.length_nil]; rfl
· simp
@[deprecated IterM.up_length_toList_eq_length (since := "2026-01-28")]
def IterM.up_length_toList_eq_count := @IterM.up_length_toList_eq_length
@[simp]
theorem IterM.up_length_toListRev_eq_count {α β : Type w} [Iterator α m β] [Finite α m]
theorem IterM.up_length_toListRev_eq_length {α β : Type w} [Iterator α m β] [Finite α m]
[Monad m] [LawfulMonad m]
[IteratorLoop α m m] [LawfulIteratorLoop α m m]
{it : IterM (α := α) m β} :
(.up <| ·.length) <$> it.toListRev = it.count := by
simp only [toListRev_eq, Functor.map_map, List.length_reverse, up_length_toList_eq_count]
(.up <| ·.length) <$> it.toListRev = it.length := by
simp only [toListRev_eq, Functor.map_map, List.length_reverse, up_length_toList_eq_length]
@[deprecated IterM.up_length_toListRev_eq_length (since := "2026-01-28")]
def IterM.up_length_toListRev_eq_count := @IterM.up_length_toListRev_eq_length
theorem IterM.anyM_eq_forIn {α β : Type w} {m : Type w Type w'} [Iterator α m β]
[Finite α m] [Monad m] [LawfulMonad m] [IteratorLoop α m m] [LawfulIteratorLoop α m m]

View File

@@ -85,9 +85,12 @@ theorem toList_eq {α : Type u} {it : Iter (α := SubarrayIterator α) α} :
· rw [dif_neg]; rotate_left; exact h
simp_all [it.internalState.xs.stop_le_array_size]
theorem count_eq {α : Type u} {it : Iter (α := SubarrayIterator α) α} :
it.count = it.internalState.xs.stop - it.internalState.xs.start := by
simp [ Iter.length_toList_eq_count, toList_eq, it.internalState.xs.stop_le_array_size]
theorem length_eq {α : Type u} {it : Iter (α := SubarrayIterator α) α} :
it.length = it.internalState.xs.stop - it.internalState.xs.start := by
simp [ Iter.length_toList_eq_length, toList_eq, it.internalState.xs.stop_le_array_size]
@[deprecated length_eq (since := "2026-01-28")]
def count_eq := @length_eq
end SubarrayIterator
@@ -105,7 +108,7 @@ theorem toList_internalIter {α : Type u} {s : Subarray α} :
public instance : LawfulSliceSize (Internal.SubarrayData α) where
lawful s := by
simp [SliceSize.size, ToIterator.iter_eq, Iter.toIter_toIterM,
Iter.length_toList_eq_count, SubarrayIterator.toList_eq,
Iter.length_toList_eq_length, SubarrayIterator.toList_eq,
s.internalRepresentation.stop_le_array_size, start, stop, array]
public theorem toArray_eq_sliceToArray {α : Type u} {s : Subarray α} :

View File

@@ -60,12 +60,15 @@ public theorem forIn_toArray {γ : Type u} {β : Type v}
ForIn.forIn s.toArray init f = ForIn.forIn s init f := by
rw [ forIn_internalIter, Iter.forIn_toArray, Slice.toArray]
theorem Internal.size_eq_count_iter [ToIterator (Slice γ) Id α β]
theorem Internal.size_eq_length_iter [ToIterator (Slice γ) Id α β]
[Iterator α Id β] [Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
{s : Slice γ} [SliceSize γ] [LawfulSliceSize γ] :
s.size = (Internal.iter s).count := by
simp only [Slice.size, iter, LawfulSliceSize.lawful, Iter.length_toList_eq_count]
s.size = (Internal.iter s).length := by
simp only [Slice.size, iter, LawfulSliceSize.lawful, Iter.length_toList_eq_length]
@[deprecated Internal.size_eq_length_iter (since := "2026-01-28")]
def Internal.size_eq_count_iter := @Internal.size_eq_length_iter
theorem Internal.toArray_eq_toArray_iter {s : Slice γ} [ToIterator (Slice γ) Id α β]
[Iterator α Id β]
@@ -91,7 +94,7 @@ theorem size_toArray_eq_size [ToIterator (Slice γ) Id α β]
{s : Slice γ} :
s.toArray.size = s.size := by
letI : IteratorLoop α Id Id := .defaultImplementation
rw [Internal.size_eq_count_iter, Internal.toArray_eq_toArray_iter, Iter.size_toArray_eq_count]
rw [Internal.size_eq_length_iter, Internal.toArray_eq_toArray_iter, Iter.size_toArray_eq_length]
@[simp]
theorem length_toList_eq_size [ToIterator (Slice γ) Id α β]
@@ -100,7 +103,7 @@ theorem length_toList_eq_size [ToIterator (Slice γ) Id α β]
[Finite α Id] :
s.toList.length = s.size := by
letI : IteratorLoop α Id Id := .defaultImplementation
rw [Internal.size_eq_count_iter, Internal.toList_eq_toList_iter, Iter.length_toList_eq_count]
rw [Internal.size_eq_length_iter, Internal.toList_eq_toList_iter, Iter.length_toList_eq_length]
@[simp]
theorem length_toListRev_eq_size [ToIterator (Slice γ) Id α β]
@@ -109,7 +112,7 @@ theorem length_toListRev_eq_size [ToIterator (Slice γ) Id α β]
[Finite α Id]
[LawfulIteratorLoop α Id Id] :
s.toListRev.length = s.size := by
rw [Internal.size_eq_count_iter, Internal.toListRev_eq_toListRev_iter,
Iter.length_toListRev_eq_count]
rw [Internal.size_eq_length_iter, Internal.toListRev_eq_toListRev_iter,
Iter.length_toListRev_eq_length]
end Std.Slice

View File

@@ -34,7 +34,7 @@ attribute [instance] ListSlice.instToIterator
universe v w
instance : SliceSize (Internal.ListSliceData α) where
size s := (Internal.iter s).count
size s := (Internal.iter s).length
@[no_expose]
instance {α : Type u} {m : Type v Type w} [Monad m] :

View File

@@ -60,7 +60,7 @@ public theorem toList_toArray {xs : ListSlice α} :
@[simp, grind =]
public theorem length_toList {xs : ListSlice α} :
xs.toList.length = xs.size := by
simp [ListSlice.toList_eq, Std.Slice.size, Std.Slice.SliceSize.size, Iter.length_toList_eq_count,
simp [ListSlice.toList_eq, Std.Slice.size, Std.Slice.SliceSize.size, Iter.length_toList_eq_length,
toList_internalIter]; rfl
@[grind =]

View File

@@ -45,7 +45,7 @@ class LawfulSliceSize (γ : Type u) [SliceSize γ] [ToIterator (Slice γ) Id α
/-- The iterator of a slice `s` of type `Slice γ` emits exactly `SliceSize.size s` elements. -/
lawful :
letI : IteratorLoop α Id Id := .defaultImplementation
s : Slice γ, SliceSize.size s = (ToIterator.iter (γ := Slice γ) s).count
s : Slice γ, SliceSize.size s = (ToIterator.iter (γ := Slice γ) s).length
/--
Returns the number of elements with distinct indices in the given slice.

View File

@@ -905,9 +905,9 @@ Examples:
def chars (s : Slice) :=
Std.Iter.map (fun pos, h => pos.get h) (positions s)
@[deprecated "There is no constant-time length function on slices. Use `s.positions.count` instead, or `isEmpty` if you only need to know whether the slice is empty." (since := "2025-11-20")]
@[deprecated "There is no constant-time length function on slices. Use `s.positions.length` instead, or `isEmpty` if you only need to know whether the slice is empty." (since := "2025-11-20")]
def length (s : Slice) : Nat :=
s.positions.count
s.positions.length
structure RevPosIterator (s : Slice) where
currPos : s.Pos

View File

@@ -39,19 +39,17 @@ theorem Rcc.toArray_iter_eq_toArray [LE α] [DecidableLE α] [UpwardEnumerable
rfl
@[simp]
theorem Rcc.count_iter [LE α] [DecidableLE α] [UpwardEnumerable α]
theorem Rcc.length_iter [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α] {r : Rcc α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Rcc.count_iter (since := "2025-11-13")]
theorem Rcc.count_iter_eq_size [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α]
{r : Rcc α} :
r.iter.count = r.size :=
count_iter
@[deprecated Rcc.length_iter (since := "2026-01-28")]
def Rcc.count_iter := @Rcc.length_iter
@[deprecated Rcc.length_iter (since := "2025-11-13")]
def Rcc.count_iter_eq_size := @Rcc.length_iter
@[simp]
theorem Rco.toList_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
@@ -78,20 +76,18 @@ theorem Rco.toArray_iter_eq_toArray [LT α] [DecidableLT α] [UpwardEnumerable
rfl
@[simp]
theorem Rco.count_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
theorem Rco.length_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Rco α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Rco.count_iter (since := "2025-11-13")]
theorem Rco.count_iter_eq_size [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Rco α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
@[deprecated Rco.length_iter (since := "2026-01-28")]
def Rco.count_iter := @Rco.length_iter
@[deprecated Rco.length_iter (since := "2025-11-13")]
def Rco.count_iter_eq_size := @Rco.length_iter
@[simp]
theorem Rci.toList_iter [UpwardEnumerable α]
@@ -118,20 +114,18 @@ theorem Rci.toArray_iter_eq_toArray [UpwardEnumerable α]
rfl
@[simp]
theorem Rci.count_iter [UpwardEnumerable α]
theorem Rci.length_iter [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Rci α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_length]
@[deprecated Rci.count_iter (since := "2025-11-13")]
theorem Rci.count_iter_eq_size [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Rci α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
@[deprecated Rci.length_iter (since := "2026-01-28")]
def Rci.count_iter := @Rci.length_iter
@[deprecated Rci.length_iter (since := "2025-11-13")]
def Rci.count_iter_eq_size := @Rci.length_iter
@[simp]
theorem Roc.toList_iter [LE α] [DecidableLE α] [UpwardEnumerable α]
@@ -158,20 +152,18 @@ theorem Roc.toArray_iter_eq_toArray [LE α] [DecidableLE α] [UpwardEnumerable
rfl
@[simp]
theorem Roc.count_iter [LE α] [DecidableLE α] [UpwardEnumerable α]
theorem Roc.length_iter [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α]
{r : Roc α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_length]
@[deprecated Roc.count_iter (since := "2025-11-13")]
theorem Roc.count_iter_eq_size [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α]
{r : Roc α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
@[deprecated Roc.length_iter (since := "2026-01-28")]
def Roc.count_iter := @Roc.length_iter
@[deprecated Roc.length_iter (since := "2025-11-13")]
def Roc.count_iter_eq_size := @Roc.length_iter
@[simp]
theorem Roo.toList_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
@@ -198,20 +190,18 @@ theorem Roo.toArray_iter_eq_toArray [LT α] [DecidableLT α] [UpwardEnumerable
rfl
@[simp]
theorem Roo.count_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
theorem Roo.length_iter [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Roo α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_length]
@[deprecated Roo.count_iter (since := "2025-11-13")]
theorem Roo.count_iter_eq_size [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Roo α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter_eq_toArray, Iter.size_toArray_eq_count]
@[deprecated Roo.length_iter (since := "2026-01-28")]
def Roo.count_iter := @Roo.length_iter
@[deprecated Roo.length_iter (since := "2025-11-13")]
def Roo.count_iter_eq_size := @Roo.length_iter
@[simp]
theorem Roi.toList_iter [UpwardEnumerable α]
@@ -238,20 +228,18 @@ theorem Roi.toArray_iter_eq_toArray [UpwardEnumerable α]
rfl
@[simp]
theorem Roi.count_iter [UpwardEnumerable α]
theorem Roi.length_iter [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Roi α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Roi.count_iter (since := "2025-11-13")]
theorem Roi.count_iter_eq_size [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Roi α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
@[deprecated Roi.length_iter (since := "2026-01-28")]
def Roi.count_iter := @Roi.length_iter
@[deprecated Roi.length_iter (since := "2025-11-13")]
def Roi.count_iter_eq_size := @Roi.length_iter
@[simp]
theorem Ric.toList_iter [Least? α] [LE α] [DecidableLE α] [UpwardEnumerable α]
@@ -278,20 +266,18 @@ theorem Ric.toArray_iter_eq_toArray [Least? α] [LE α] [DecidableLE α] [Upward
rfl
@[simp]
theorem Ric.count_iter [Least? α] [LE α] [DecidableLE α] [UpwardEnumerable α]
theorem Ric.length_iter [Least? α] [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α]
{r : Ric α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Ric.count_iter (since := "2025-11-13")]
theorem Ric.count_iter_eq_size [Least? α] [LE α] [DecidableLE α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLE α] [Rxc.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxc.HasSize α] [Rxc.LawfulHasSize α]
{r : Ric α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
@[deprecated Ric.length_iter (since := "2026-01-28")]
def Ric.count_iter := @Ric.length_iter
@[deprecated Ric.length_iter (since := "2025-11-13")]
def Ric.count_iter_eq_size := @Ric.length_iter
@[simp]
theorem Rio.toList_iter [Least? α] [LT α] [DecidableLT α] [UpwardEnumerable α]
@@ -318,20 +304,18 @@ theorem Rio.toArray_iter_eq_toArray [Least? α] [LT α] [DecidableLT α] [Upward
rfl
@[simp]
theorem Rio.count_iter [Least? α] [LT α] [DecidableLT α] [UpwardEnumerable α]
theorem Rio.length_iter [Least? α] [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Rio α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Rio.count_iter (since := "2025-11-13")]
theorem Rio.count_iter_eq_size [Least? α] [LT α] [DecidableLT α] [UpwardEnumerable α]
[LawfulUpwardEnumerableLT α] [Rxo.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxo.HasSize α] [Rxo.LawfulHasSize α]
{r : Rio α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
@[deprecated Rio.length_iter (since := "2026-01-28")]
def Rio.count_iter := @Rio.length_iter
@[deprecated Rio.length_iter (since := "2025-11-13")]
def Rio.count_iter_eq_size := @Rio.length_iter
@[simp]
theorem Rii.toList_iter [Least? α] [UpwardEnumerable α]
@@ -358,19 +342,17 @@ theorem Rii.toArray_iter_eq_toArray [Least? α] [UpwardEnumerable α]
rfl
@[simp]
theorem Rii.count_iter [Least? α] [UpwardEnumerable α]
theorem Rii.length_iter [Least? α] [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Rii α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
r.iter.length = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_length]
@[deprecated Rii.count_iter (since := "2025-11-13")]
theorem Rii.count_iter_eq_size [Least? α] [UpwardEnumerable α]
[Rxi.IsAlwaysFinite α] [LawfulUpwardEnumerable α]
[Rxi.HasSize α] [Rxi.LawfulHasSize α]
{r : Rii α} :
r.iter.count = r.size := by
rw [ size_toArray, toArray_iter, Iter.size_toArray_eq_count]
@[deprecated Rii.length_iter (since := "2026-01-28")]
def Rii.count_iter := @Rii.length_iter
@[deprecated Rii.length_iter (since := "2025-11-13")]
def Rii.count_iter_eq_size := @Rii.length_iter
end Std

View File

@@ -27,21 +27,27 @@ theorem iter_eq_toIteratorIter {γ : Type u} {s : Slice γ}
s.iter = ToIterator.iter s := by
simp [Internal.iter_eq_iter, Internal.iter_eq_toIteratorIter]
theorem size_eq_count_iter [ToIterator (Slice γ) Id α β]
theorem size_eq_length_iter [ToIterator (Slice γ) Id α β]
[Iterator α Id β] {s : Slice γ}
[Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
[SliceSize γ] [LawfulSliceSize γ] :
s.size = s.iter.count := by
simp [Internal.iter_eq_iter, Internal.size_eq_count_iter]
s.size = s.iter.length := by
simp [Internal.iter_eq_iter, Internal.size_eq_length_iter]
theorem count_iter_eq_size [ToIterator (Slice γ) Id α β]
@[deprecated size_eq_length_iter (since := "2026-01-28")]
def size_eq_count_iter := @size_eq_length_iter
theorem length_iter_eq_size [ToIterator (Slice γ) Id α β]
[Iterator α Id β] {s : Slice γ}
[Finite α Id]
[IteratorLoop α Id Id] [LawfulIteratorLoop α Id Id]
[SliceSize γ] [LawfulSliceSize γ] :
s.iter.count = s.size :=
size_eq_count_iter.symm
s.iter.length = s.size :=
size_eq_length_iter.symm
@[deprecated length_iter_eq_size (since := "2026-01-28")]
def count_iter_eq_size := @length_iter_eq_size
@[simp]
theorem toArray_iter {s : Slice γ} [ToIterator (Slice γ) Id α β]

View File

@@ -69,7 +69,7 @@ public def ofString? (t : String) : Option Time := do
match s.split '.' |>.toList with
| [s,f] =>
let time ofValid? ( h.toNat?) ( m.toNat?) ( s.toNat?)
return {time with fracExponent := f.positions.count-1, fracMantissa := f.toNat?}
return {time with fracExponent := f.positions.length-1, fracMantissa := f.toNat?}
| [s] =>
ofValid? ( h.toNat?) ( m.toNat?) ( s.toNat?)
| _ => none