Documentation

Init.Data.Nat.Fold

@[specialize #[]]
def Nat.fold {α : Type u} (n : Nat) (f : (i : Nat) → i < nαα) (init : α) :
α

Nat.fold evaluates f on the numbers up to n exclusive, in increasing order:

  • Nat.fold f 3 init = init |> f 0 |> f 1 |> f 2
Equations
  • Nat.fold 0 f x = x
  • n.succ.fold f x = f n (n.fold (fun (i : Nat) (h : i < n) => f i ) x)
Instances For
    @[inline]
    def Nat.foldTR {α : Type u} (n : Nat) (f : (i : Nat) → i < nαα) (init : α) :
    α

    Tail-recursive version of Nat.fold.

    Instances For
      @[specialize #[]]
      def Nat.foldTR.loop {α : Type u} (n : Nat) (f : (i : Nat) → i < nαα) (j : Nat) :
      j nαα
      Equations
      Instances For
        @[specialize #[]]
        def Nat.foldRev {α : Type u} (n : Nat) (f : (i : Nat) → i < nαα) (init : α) :
        α

        Nat.foldRev evaluates f on the numbers up to n exclusive, in decreasing order:

        Equations
        • Nat.foldRev 0 f x = x
        • n.succ.foldRev f x = n.foldRev (fun (i : Nat) (h : i < n) => f i ) (f n x)
        Instances For
          @[specialize #[]]
          def Nat.any (n : Nat) (f : (i : Nat) → i < nBool) :

          any f n = true iff there is i in [0, n-1] s.t. f i = true

          Equations
          Instances For
            @[inline]
            def Nat.anyTR (n : Nat) (f : (i : Nat) → i < nBool) :

            Tail-recursive version of Nat.any.

            Instances For
              @[specialize #[]]
              def Nat.anyTR.loop (n : Nat) (f : (i : Nat) → i < nBool) (i : Nat) :
              i nBool
              Equations
              Instances For
                @[specialize #[]]
                def Nat.all (n : Nat) (f : (i : Nat) → i < nBool) :

                all f n = true iff every i in [0, n-1] satisfies f i = true

                Equations
                Instances For
                  @[inline]
                  def Nat.allTR (n : Nat) (f : (i : Nat) → i < nBool) :

                  Tail-recursive version of Nat.all.

                  Instances For
                    @[specialize #[]]
                    def Nat.allTR.loop (n : Nat) (f : (i : Nat) → i < nBool) (i : Nat) :
                    i nBool
                    Equations
                    Instances For

                      csimp theorems #

                      theorem Nat.fold_congr {α : Type u} {n m : Nat} (w : n = m) (f : (i : Nat) → i < nαα) (init : α) :
                      n.fold f init = m.fold (fun (i : Nat) (h : i < m) => f i ) init
                      theorem Nat.foldTR_loop_congr {α : Type u} {n m : Nat} (w : n = m) (f : (i : Nat) → i < nαα) (j : Nat) (h : j n) (init : α) :
                      Nat.foldTR.loop n f j h init = Nat.foldTR.loop m (fun (i : Nat) (h : i < m) => f i ) j init
                      theorem Nat.fold_eq_foldTR.go (α : Type u_1) (init : α) (m n : Nat) (f : (i : Nat) → i < m + nαα) :
                      (m + n).fold f init = Nat.foldTR.loop (m + n) f m (n.fold (fun (i : Nat) (h : i < n) => f i ) init)
                      theorem Nat.any_congr {n m : Nat} (w : n = m) (f : (i : Nat) → i < nBool) :
                      n.any f = m.any fun (i : Nat) (h : i < m) => f i
                      theorem Nat.anyTR_loop_congr {n m : Nat} (w : n = m) (f : (i : Nat) → i < nBool) (j : Nat) (h : j n) :
                      Nat.anyTR.loop n f j h = Nat.anyTR.loop m (fun (i : Nat) (h : i < m) => f i ) j
                      theorem Nat.any_eq_anyTR.go (m n : Nat) (f : (i : Nat) → i < m + nBool) :
                      (m + n).any f = ((n.any fun (i : Nat) (h : i < n) => f i ) || Nat.anyTR.loop (m + n) f m )
                      theorem Nat.all_congr {n m : Nat} (w : n = m) (f : (i : Nat) → i < nBool) :
                      n.all f = m.all fun (i : Nat) (h : i < m) => f i
                      theorem Nat.allTR_loop_congr {n m : Nat} (w : n = m) (f : (i : Nat) → i < nBool) (j : Nat) (h : j n) :
                      Nat.allTR.loop n f j h = Nat.allTR.loop m (fun (i : Nat) (h : i < m) => f i ) j
                      theorem Nat.all_eq_allTR.go (m n : Nat) (f : (i : Nat) → i < m + nBool) :
                      (m + n).all f = ((n.all fun (i : Nat) (h : i < n) => f i ) && Nat.allTR.loop (m + n) f m )
                      @[simp]
                      theorem Nat.fold_zero {α : Type u} (f : (i : Nat) → i < 0αα) (init : α) :
                      Nat.fold 0 f init = init
                      @[simp]
                      theorem Nat.fold_succ {α : Type u} (n : Nat) (f : (i : Nat) → i < n + 1αα) (init : α) :
                      (n + 1).fold f init = f n (n.fold (fun (i : Nat) (h : i < n) => f i ) init)
                      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)
                      @[simp]
                      theorem Nat.foldRev_zero {α : Type u} (f : (i : Nat) → i < 0αα) (init : α) :
                      Nat.foldRev 0 f init = init
                      @[simp]
                      theorem Nat.foldRev_succ {α : Type u} (n : Nat) (f : (i : Nat) → i < n + 1αα) (init : α) :
                      (n + 1).foldRev f init = n.foldRev (fun (i : Nat) (h : i < n) => f i ) (f n init)
                      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)
                      @[simp]
                      theorem Nat.any_zero {f : (i : Nat) → i < 0Bool} :
                      @[simp]
                      theorem Nat.any_succ {n : Nat} (f : (i : Nat) → i < n + 1Bool) :
                      (n + 1).any f = ((n.any fun (i : Nat) (h : i < n) => f i ) || f n )
                      theorem Nat.any_eq_finRange_any {n : Nat} (f : (i : Nat) → i < nBool) :
                      n.any f = (List.finRange n).any fun (x : Fin n) => match x with | i, h => f i h
                      @[simp]
                      theorem Nat.all_zero {f : (i : Nat) → i < 0Bool} :
                      @[simp]
                      theorem Nat.all_succ {n : Nat} (f : (i : Nat) → i < n + 1Bool) :
                      (n + 1).all f = ((n.all fun (i : Nat) (h : i < n) => f i ) && f n )
                      theorem Nat.all_eq_finRange_all {n : Nat} (f : (i : Nat) → i < nBool) :
                      n.all f = (List.finRange n).all fun (x : Fin n) => match x with | i, h => f i h
                      @[inline]
                      def Prod.foldI {α : Type u} (i : Nat × Nat) (f : (j : Nat) → i.fst jj < 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
                      Instances For
                        @[inline]
                        def Prod.anyI (i : Nat × Nat) (f : (j : Nat) → i.fst jj < i.sndBool) :

                        (start, stop).anyI f a returns true if f is true for some natural number from start (inclusive) to stop (exclusive):

                        • (5, 8).anyI f = f 5 || f 6 || f 7
                        Equations
                        • i.anyI f = (i.snd - i.fst).any fun (j : Nat) (x : j < i.snd - i.fst) => f (i.fst + j)
                        Instances For
                          @[inline]
                          def Prod.allI (i : Nat × Nat) (f : (j : Nat) → i.fst jj < i.sndBool) :

                          (start, stop).allI f a returns true if f is true for all natural numbers from start (inclusive) to stop (exclusive):

                          • (5, 8).anyI f = f 5 && f 6 && f 7
                          Equations
                          • i.allI f = (i.snd - i.fst).all fun (j : Nat) (x : j < i.snd - i.fst) => f (i.fst + j)
                          Instances For