@[inline]
Tail-recursive version of Nat.fold
.
Equations
- n.foldTR f init = Nat.foldTR.loop n f n ⋯ init
Instances For
@[specialize #[]]
Equations
- Nat.foldTR.loop n f 0 h x = x
- Nat.foldTR.loop n f m.succ h x = Nat.foldTR.loop n f m ⋯ (f (n - m.succ) ⋯ x)
Instances For
@[specialize #[]]
Nat.foldRev
evaluates f
on the numbers up to n
exclusive, in decreasing order:
Nat.foldRev f 3 init = f 0 <| f 1 <| f 2 <| init
Equations
Instances For
@[specialize #[]]
Equations
- Nat.anyTR.loop n f 0 h = false
- Nat.anyTR.loop n f m.succ h = (f (n - m.succ) ⋯ || Nat.anyTR.loop n f m ⋯)
Instances For
@[specialize #[]]
Equations
- Nat.allTR.loop n f 0 h = true
- Nat.allTR.loop n f m.succ h = (f (n - m.succ) ⋯ && Nat.allTR.loop n f m ⋯)
Instances For
csimp theorems #
theorem
Nat.fold_eq_finRange_foldl
{α : Type u}
(n : Nat)
(f : (i : Nat) → i < n → α → α)
(init : α)
:
n.fold f init = List.foldl
(fun (acc : α) (x : Fin n) =>
match x with
| ⟨i, h⟩ => f i h acc)
init (List.finRange n)
theorem
Nat.foldRev_eq_finRange_foldr
{α : Type u}
(n : Nat)
(f : (i : Nat) → i < n → α → α)
(init : α)
:
n.foldRev f init = List.foldr
(fun (x : Fin n) (acc : α) =>
match x with
| ⟨i, h⟩ => f i h acc)
init (List.finRange n)
@[inline]
def
Prod.foldI
{α : Type u}
(i : Nat × Nat)
(f : (j : Nat) → i.fst ≤ j → j < i.snd → α → α)
(a : α)
:
α
(start, stop).foldI f a
evaluates f
on all the numbers
from start
(inclusive) to stop
(exclusive) in increasing order:
(5, 8).foldI f init = init |> f 5 |> f 6 |> f 7