Documentation

Init.Data.Array.Basic

Array literal syntax #

Equations
  • One or more equations did not get rendered due to their size.
@[reducible, inline, deprecated Array.toList (since := "2024-10-13")]
abbrev Array.data {α : Type u_1} (self : Array α) :
List α
Equations

Preliminary theorems #

@[simp]
theorem Array.size_set {α : Type u} (a : Array α) (i : Nat) (v : α) (h : i < a.size) :
(a.set i v h).size = a.size
@[simp]
theorem Array.size_push {α : Type u} (a : Array α) (v : α) :
(a.push v).size = a.size + 1
theorem Array.ext {α : Type u} (a b : Array α) (h₁ : a.size = b.size) (h₂ : ∀ (i : Nat) (hi₁ : i < a.size) (hi₂ : i < b.size), a[i] = b[i]) :
a = b
theorem Array.ext.extAux {α : Type u} (a b : List α) (h₁ : a.length = b.length) (h₂ : ∀ (i : Nat) (hi₁ : i < a.length) (hi₂ : i < b.length), a.get i, hi₁ = b.get i, hi₂) :
a = b
theorem Array.ext' {α : Type u} {as bs : Array α} (h : as.toList = bs.toList) :
as = bs
@[simp]
theorem Array.toArrayAux_eq {α : Type u} (as : List α) (acc : Array α) :
(as.toArrayAux acc).toList = acc.toList ++ as
theorem Array.toList_toArray {α : Type u} (as : List α) :
as.toArray.toList = as
@[simp]
theorem Array.size_toArray {α : Type u} (as : List α) :
as.toArray.size = as.length
@[simp]
theorem Array.getElem_toList {α : Type u} {a : Array α} {i : Nat} (h : i < a.size) :
a.toList[i] = a[i]
@[simp]
theorem Array.getElem?_toList {α : Type u} {a : Array α} {i : Nat} :
a.toList[i]? = a[i]?
structure Array.Mem {α : Type u} (as : Array α) (a : α) :

a ∈ as is a predicate which asserts that a is in the array as.

  • val : a as.toList
instance Array.instMembership {α : Type u} :
Equations
theorem Array.mem_def {α : Type u} {a : α} {as : Array α} :
a as a as.toList
@[simp]
theorem Array.mem_toArray {α : Type u} {a : α} {l : List α} :
a l.toArray a l
@[simp]
theorem Array.getElem_mem {α : Type u} {l : Array α} {i : Nat} (h : i < l.size) :
l[i] l
@[simp]
theorem List.toArray_toList {α : Type u} (a : Array α) :
a.toList.toArray = a
@[simp]
theorem List.getElem_toArray {α : Type u} {a : List α} {i : Nat} (h : i < a.toArray.size) :
a.toArray[i] = a[i]
@[simp]
theorem List.getElem?_toArray {α : Type u} {a : List α} {i : Nat} :
a.toArray[i]? = a[i]?
@[simp]
theorem List.getElem!_toArray {α : Type u} [Inhabited α] {a : List α} {i : Nat} :
a.toArray[i]! = a[i]!
@[reducible, inline, deprecated Array.toList_toArray (since := "2024-09-09")]
abbrev Array.data_toArray {α : Type u_1} (as : List α) :
as.toArray.toList = as
Equations
@[reducible, inline, deprecated Array.toList (since := "2024-09-10")]
abbrev Array.Array.data {α : Type u_1} (self : Array α) :
List α
Equations

Externs #

@[extern lean_array_size]
def Array.usize {α : Type u} (a : Array α) :

Low-level version of size that directly queries the C array object cached size. While this is not provable, usize always returns the exact size of the array since the implementation only supports arrays of size less than USize.size.

Equations
  • a.usize = a.size.toUSize
@[extern lean_array_uget]
def Array.uget {α : Type u} (a : Array α) (i : USize) (h : i.toNat < a.size) :
α

Low-level version of fget which is as fast as a C array read. Fin values are represented as tag pointers in the Lean runtime. Thus, fget may be slightly slower than uget.

Equations
  • a.uget i h = a[i.toNat]
@[extern lean_array_uset]
def Array.uset {α : Type u} (a : Array α) (i : USize) (v : α) (h : i.toNat < a.size) :

Low-level version of fset which is as fast as a C array fset. Fin values are represented as tag pointers in the Lean runtime. Thus, fset may be slightly slower than uset.

Equations
  • a.uset i v h = a.set i.toNat v h
@[extern lean_array_pop]
def Array.pop {α : Type u} (a : Array α) :
Equations
  • a.pop = { toList := a.toList.dropLast }
@[simp]
theorem Array.size_pop {α : Type u} (a : Array α) :
a.pop.size = a.size - 1
@[extern lean_mk_array]
def Array.mkArray {α : Type u} (n : Nat) (v : α) :
Equations
@[extern lean_array_fswap]
def Array.swap {α : Type u} (a : Array α) (i j : Nat) (hi : i < a.size := by get_elem_tactic) (hj : j < a.size := by get_elem_tactic) :

Swaps two entries in an array.

This will perform the update destructively provided that a has a reference count of 1 when called.

Equations
  • a.swap i j hi hj = (a.set i a[j] hi).set j a[i]
@[simp]
theorem Array.size_swap {α : Type u} (a : Array α) (i j : Nat) {hi : i < a.size} {hj : j < a.size} :
(a.swap i j hi hj).size = a.size
@[extern lean_array_swap]
def Array.swapIfInBounds {α : Type u} (a : Array α) (i j : Nat) :

Swaps two entries in an array, or returns the array unchanged if either index is out of bounds.

This will perform the update destructively provided that a has a reference count of 1 when called.

Equations
  • a.swapIfInBounds i j = if h₁ : i < a.size then if h₂ : j < a.size then a.swap i j h₁ h₂ else a else a
@[reducible, inline, deprecated Array.swapIfInBounds (since := "2024-11-24")]
abbrev Array.swap! {α : Type u_1} (a : Array α) (i j : Nat) :
Equations

GetElem instance for USize, backed by uget #

instance Array.instGetElemUSizeLtNatToNatSize {α : Type u} :
GetElem (Array α) USize α fun (xs : Array α) (i : USize) => i.toNat < xs.size
Equations

Definitions #

Equations
instance Array.instInhabited {α : Type u} :
Equations
def Array.isEmpty {α : Type u} (a : Array α) :
Equations
@[specialize #[]]
def Array.isEqvAux {α : Type u} (a b : Array α) (hsz : a.size = b.size) (p : ααBool) (i : Nat) :
i a.sizeBool
Equations
  • a.isEqvAux b hsz p 0 x_2 = true
  • a.isEqvAux b hsz p i.succ h = (p a[i] b[i] && a.isEqvAux b hsz p i )
@[inline]
def Array.isEqv {α : Type u} (a b : Array α) (p : ααBool) :
Equations
  • a.isEqv b p = if h : a.size = b.size then a.isEqvAux b h p a.size else false
instance Array.instBEq {α : Type u} [BEq α] :
BEq (Array α)
Equations
def Array.ofFn {α : Type u} {n : Nat} (f : Fin nα) :

ofFn f with f : Fin n → α returns the list whose ith element is f i.

ofFn f = #[f 0, f 1, ... , f(n - 1)]
Equations
def Array.ofFn.go {α : Type u} {n : Nat} (f : Fin nα) (i : Nat) (acc : Array α) :

Auxiliary for ofFn. ofFn.go f i acc = acc ++ #[f i, ..., f(n - 1)]

Equations

The array #[0, 1, ..., n - 1].

Equations
def Array.singleton {α : Type u} (v : α) :
Equations
def Array.back! {α : Type u} [Inhabited α] (a : Array α) :
α
Equations
  • a.back! = a[a.size - 1]!
@[reducible, inline, deprecated Array.back! (since := "2024-10-31")]
abbrev Array.back {α : Type u_1} [Inhabited α] (a : Array α) :
α
Equations
def Array.get? {α : Type u} (a : Array α) (i : Nat) :
Equations
  • a.get? i = if h : i < a.size then some a[i] else none
def Array.back? {α : Type u} (a : Array α) :
Equations
  • a.back? = a[a.size - 1]?
@[inline]
def Array.swapAt {α : Type u} (a : Array α) (i : Nat) (v : α) (hi : i < a.size := by get_elem_tactic) :
α × Array α
Equations
  • a.swapAt i v hi = (a[i], a.set i v hi)
@[inline]
def Array.swapAt! {α : Type u} (a : Array α) (i : Nat) (v : α) :
α × Array α
Equations
  • One or more equations did not get rendered due to their size.
def Array.take {α : Type u} (a : Array α) (n : Nat) :

take a n returns the first n elements of a.

Equations
def Array.take.loop {α : Type u} :
NatArray αArray α
Equations
@[reducible, inline, deprecated Array.take (since := "2024-10-22")]
abbrev Array.shrink {α : Type u_1} (a : Array α) (n : Nat) :
Equations
@[inline]
unsafe def Array.modifyMUnsafe {α : Type u} {m : Type u → Type u_1} [Monad m] (a : Array α) (i : Nat) (f : αm α) :
m (Array α)
Equations
  • a.modifyMUnsafe i f = if h : i < a.size then let v := a[i]; let a' := a.set i (unsafeCast ()) h; do let vf v pure (a'.set i v ) else pure a
@[implemented_by Array.modifyMUnsafe]
def Array.modifyM {α : Type u} {m : Type u → Type u_1} [Monad m] (a : Array α) (i : Nat) (f : αm α) :
m (Array α)
Equations
  • a.modifyM i f = if h : i < a.size then let v := a[i]; do let vf v pure (a.set i v h) else pure a
@[inline]
def Array.modify {α : Type u} (a : Array α) (i : Nat) (f : αα) :
Equations
  • a.modify i f = (a.modifyM i f).run
@[inline]
def Array.modifyOp {α : Type u} (self : Array α) (idx : Nat) (f : αα) :
Equations
  • self.modifyOp idx f = self.modify idx f
@[inline]
unsafe def Array.forIn'Unsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (b : β) (f : (a : α) → a asβm (ForInStep β)) :
m β

We claim this unsafe implementation is correct because an array cannot have more than usizeSz elements in our runtime.

This kind of low level trick can be removed with a little bit of compiler support. For example, if the compiler simplifies as.size < usizeSz to true.

Equations
@[specialize #[]]
unsafe def Array.forIn'Unsafe.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : (a : α) → a asβm (ForInStep β)) (sz i : USize) (b : β) :
m β
Equations
  • One or more equations did not get rendered due to their size.
@[implemented_by Array.forIn'Unsafe]
def Array.forIn' {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (b : β) (f : (a : α) → a asβm (ForInStep β)) :
m β

Reference implementation for forIn'

Equations
def Array.forIn'.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : (a : α) → a asβm (ForInStep β)) (i : Nat) (h : i as.size) (b : β) :
m β
Equations
instance Array.instForIn'InferInstanceMembership {α : Type u} {m : Type u_1 → Type u_2} :
Equations
@[inline]
unsafe def Array.foldlMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (init : β) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
m β

See comment at forIn'Unsafe

Equations
@[specialize #[]]
unsafe def Array.foldlMUnsafe.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (as : Array α) (i stop : USize) (b : β) :
m β
Equations
@[implemented_by Array.foldlMUnsafe]
def Array.foldlM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (init : β) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
m β

Reference implementation for foldlM

Equations
  • One or more equations did not get rendered due to their size.
def Array.foldlM.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (as : Array α) (stop : Nat) (h : stop as.size) (i j : Nat) (b : β) :
m β
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
unsafe def Array.foldrMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (init : β) (as : Array α) (start : Nat := as.size) (stop : Nat := 0) :
m β

See comment at forIn'Unsafe

Equations
  • One or more equations did not get rendered due to their size.
@[specialize #[]]
unsafe def Array.foldrMUnsafe.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (as : Array α) (i stop : USize) (b : β) :
m β
Equations
@[implemented_by Array.foldrMUnsafe]
def Array.foldrM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (init : β) (as : Array α) (start : Nat := as.size) (stop : Nat := 0) :
m β

Reference implementation for foldrM

Equations
  • One or more equations did not get rendered due to their size.
def Array.foldrM.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (as : Array α) (stop : Nat := 0) (i : Nat) (h : i as.size) (b : β) :
m β
Equations
@[inline]
unsafe def Array.mapMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) :
m (Array β)

See comment at forIn'Unsafe

Equations
@[specialize #[]]
unsafe def Array.mapMUnsafe.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (sz i : USize) (r : Array NonScalar) :
Equations
  • One or more equations did not get rendered due to their size.
@[implemented_by Array.mapMUnsafe]
def Array.mapM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) :
m (Array β)

Reference implementation for mapM

Equations
def Array.mapM.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) (i : Nat) (r : Array β) :
m (Array β)
Equations
@[reducible, inline, deprecated Array.mapM (since := "2024-11-11")]
abbrev Array.sequenceMap {α : Type u_1} {β : Type u_2} {m : Type u_2 → Type u_3} [Monad m] (f : αm β) (as : Array α) :
m (Array β)
Equations
@[inline]
def Array.mapFinIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : Fin as.sizeαm β) :
m (Array β)

Variant of mapIdxM which receives the index as a Fin as.size.

Equations
@[specialize #[]]
def Array.mapFinIdxM.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : Fin as.sizeαm β) (i j : Nat) (inv : i + j = as.size) (bs : Array β) :
m (Array β)
Equations
@[inline]
def Array.mapIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : Natαm β) (as : Array α) :
m (Array β)
Equations
@[inline]
def Array.findSomeM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm (Option β)) (as : Array α) :
m (Option β)
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.findM? {α : Type} {m : TypeType} [Monad m] (p : αm Bool) (as : Array α) :
m (Option α)

Note that the universe level is contrained to Type here, to avoid having to have the predicate live in p : α → m (ULift Bool).

Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.findIdxM? {α : Type u} {m : TypeType u_1} [Monad m] (p : αm Bool) (as : Array α) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
unsafe def Array.anyMUnsafe {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
  • One or more equations did not get rendered due to their size.
@[specialize #[]]
unsafe def Array.anyMUnsafe.any {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (i stop : USize) :
Equations
  • One or more equations did not get rendered due to their size.
@[implemented_by Array.anyMUnsafe]
def Array.anyM {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
  • One or more equations did not get rendered due to their size.
def Array.anyM.loop {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (stop : Nat) (h : stop as.size) (j : Nat) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.allM {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
@[inline]
def Array.findSomeRevM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm (Option β)) (as : Array α) :
m (Option β)
Equations
@[specialize #[]]
def Array.findSomeRevM?.find {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm (Option β)) (as : Array α) (i : Nat) :
i as.sizem (Option β)
Equations
@[inline]
def Array.findRevM? {α : Type} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) :
m (Option α)
Equations
@[inline]
def Array.forM {α : Type u} {m : Type v → Type w} [Monad m] (f : αm PUnit) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
@[inline]
def Array.forRevM {α : Type u} {m : Type v → Type w} [Monad m] (f : αm PUnit) (as : Array α) (start : Nat := as.size) (stop : Nat := 0) :
Equations
@[inline]
def Array.foldl {α : Type u} {β : Type v} (f : βαβ) (init : β) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
β
Equations
@[inline]
def Array.foldr {α : Type u} {β : Type v} (f : αββ) (init : β) (as : Array α) (start : Nat := as.size) (stop : Nat := 0) :
β
Equations
@[inline]
def Array.map {α : Type u} {β : Type v} (f : αβ) (as : Array α) :
Equations
@[inline]
def Array.mapFinIdx {α : Type u} {β : Type v} (as : Array α) (f : Fin as.sizeαβ) :

Variant of mapIdx which receives the index as a Fin as.size.

Equations
  • as.mapFinIdx f = (as.mapFinIdxM f).run
@[inline]
def Array.mapIdx {α : Type u} {β : Type v} (f : Natαβ) (as : Array α) :
Equations
def Array.zipWithIndex {α : Type u} (arr : Array α) :
Array (α × Nat)

Turns #[a, b] into #[(a, 0), (b, 1)].

Equations
@[inline]
def Array.find? {α : Type u} (p : αBool) (as : Array α) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.findSome? {α : Type u} {β : Type v} (f : αOption β) (as : Array α) :
Equations
@[inline]
def Array.findSome! {α : Type u} {β : Type v} [Inhabited β] (f : αOption β) (a : Array α) :
β
Equations
@[inline]
def Array.findSomeRev? {α : Type u} {β : Type v} (f : αOption β) (as : Array α) :
Equations
@[inline]
def Array.findRev? {α : Type} (p : αBool) (as : Array α) :
Equations
@[inline]
def Array.findIdx? {α : Type u} (p : αBool) (as : Array α) :
Equations
def Array.findIdx?.loop {α : Type u} (p : αBool) (as : Array α) (j : Nat) :
Equations
@[inline]
def Array.findFinIdx? {α : Type u} (p : αBool) (as : Array α) :
Option (Fin as.size)
Equations
def Array.findFinIdx?.loop {α : Type u} (p : αBool) (as : Array α) (j : Nat) :
Option (Fin as.size)
Equations
def Array.indexOfAux {α : Type u} [BEq α] (a : Array α) (v : α) (i : Nat) :
Option (Fin a.size)
Equations
  • a.indexOfAux v i = if h : i < a.size then if (a[i] == v) = true then some i, h else a.indexOfAux v (i + 1) else none
def Array.indexOf? {α : Type u} [BEq α] (a : Array α) (v : α) :
Option (Fin a.size)
Equations
  • a.indexOf? v = a.indexOfAux v 0
@[deprecated Array.indexOf? (since := "2024-11-20")]
def Array.getIdx? {α : Type u} [BEq α] (a : Array α) (v : α) :
Equations
@[inline]
def Array.any {α : Type u} (as : Array α) (p : αBool) (start : Nat := 0) (stop : Nat := as.size) :
Equations
@[inline]
def Array.all {α : Type u} (as : Array α) (p : αBool) (start : Nat := 0) (stop : Nat := as.size) :
Equations
def Array.contains {α : Type u} [BEq α] (as : Array α) (a : α) :

as.contains a is true if there is some element b in as such that a == b.

Equations
  • as.contains a = as.any fun (x : α) => a == x
def Array.elem {α : Type u} [BEq α] (a : α) (as : Array α) :

Variant of Array.contains with arguments reversed.

For verification purposes, we simplify this to contains.

Equations
@[export lean_array_to_list_impl]
def Array.toListImpl {α : Type u} (as : Array α) :
List α

Convert a Array α into an List α. This is O(n) in the size of the array.

Equations
@[inline]
def Array.toListAppend {α : Type u} (as : Array α) (l : List α) :
List α

Prepends an Array α onto the front of a list. Equivalent to as.toList ++ l.

Equations
def Array.append {α : Type u} (as bs : Array α) :
Equations
instance Array.instAppend {α : Type u} :
Equations
def Array.appendList {α : Type u} (as : Array α) (bs : List α) :
Equations
instance Array.instHAppendList {α : Type u} :
HAppend (Array α) (List α) (Array α)
Equations
@[inline]
def Array.flatMapM {α : Type u} {m : Type u_1 → Type u_2} {β : Type u_1} [Monad m] (f : αm (Array β)) (as : Array α) :
m (Array β)
Equations
@[reducible, inline, deprecated Array.flatMapM (since := "2024-10-16")]
abbrev Array.concatMapM {α : Type u_1} {m : Type u_2 → Type u_3} {β : Type u_2} [Monad m] (f : αm (Array β)) (as : Array α) :
m (Array β)
Equations
@[inline]
def Array.flatMap {α : Type u} {β : Type u_1} (f : αArray β) (as : Array α) :
Equations
@[reducible, inline, deprecated Array.flatMap (since := "2024-10-16")]
abbrev Array.concatMap {α : Type u_1} {β : Type u_2} (f : αArray β) (as : Array α) :
Equations
@[inline]
def Array.flatten {α : Type u} (as : Array (Array α)) :

Joins array of array into a single array.

flatten #[#[a₁, a₂, ⋯], #[b₁, b₂, ⋯], ⋯] = #[a₁, a₂, ⋯, b₁, b₂, ⋯]

Equations
@[inline]
def Array.filter {α : Type u} (p : αBool) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
@[inline]
def Array.filterM {m : TypeType u_1} {α : Type} [Monad m] (p : αm Bool) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
m (Array α)
Equations
@[specialize #[]]
def Array.filterMapM {α : Type u} {m : Type u_1 → Type u_2} {β : Type u_1} [Monad m] (f : αm (Option β)) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
m (Array β)
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.filterMap {α : Type u} {β : Type u_1} (f : αOption β) (as : Array α) (start : Nat := 0) (stop : Nat := as.size) :
Equations
@[specialize #[]]
def Array.getMax? {α : Type u} (as : Array α) (lt : ααBool) :
Equations
  • as.getMax? lt = if h : 0 < as.size then let a0 := as[0]; some (Array.foldl (fun (best a : α) => if lt best a = true then a else best) a0 as 1) else none
@[inline]
def Array.partition {α : Type u} (p : αBool) (as : Array α) :
Array α × Array α
Equations
  • One or more equations did not get rendered due to their size.
def Array.reverse {α : Type u} (as : Array α) :
Equations
theorem Array.reverse.termination {i j : Nat} (h : i < j) :
j - 1 - (i + 1) < j - i
@[irreducible]
def Array.reverse.loop {α : Type u} (as : Array α) (i : Nat) (j : Fin as.size) :
Equations
def Array.popWhile {α : Type u} (p : αBool) (as : Array α) :
Equations
def Array.takeWhile {α : Type u} (p : αBool) (as : Array α) :
Equations
def Array.takeWhile.go {α : Type u} (p : αBool) (as : Array α) (i : Nat) (r : Array α) :
Equations
def Array.eraseIdx {α : Type u} (a : Array α) (i : Nat) (h : i < a.size := by get_elem_tactic) :

Remove the element at a given index from an array without a runtime bounds checks, using a Nat index and a tactic-provided bound.

This function takes worst case O(n) time because it has to backshift all elements at positions greater than i.

Equations
  • a.eraseIdx i h = if h' : i + 1 < a.size then let a' := a.swap (i + 1) i h' h; a'.eraseIdx (i + 1) else a.pop
@[simp]
theorem Array.size_eraseIdx {α : Type u} (a : Array α) (i : Nat) (h : i < a.size) :
(a.eraseIdx i h).size = a.size - 1
def Array.eraseIdxIfInBounds {α : Type u} (a : Array α) (i : Nat) :

Remove the element at a given index from an array, or do nothing if the index is out of bounds.

This function takes worst case O(n) time because it has to backshift all elements at positions greater than i.

Equations
  • a.eraseIdxIfInBounds i = if h : i < a.size then a.eraseIdx i h else a
def Array.eraseIdx! {α : Type u} (a : Array α) (i : Nat) :

Remove the element at a given index from an array, or panic if the index is out of bounds.

This function takes worst case O(n) time because it has to backshift all elements at positions greater than i.

Equations
  • a.eraseIdx! i = if h : i < a.size then a.eraseIdx i h else panicWithPosWithDecl "Init.Data.Array.Basic" "Array.eraseIdx!" 841 45 "invalid index"
def Array.erase {α : Type u} [BEq α] (as : Array α) (a : α) :
Equations
  • as.erase a = match as.indexOf? a with | none => as | some i => as.eraseIdx i
def Array.eraseP {α : Type u} (as : Array α) (p : αBool) :

Erase the first element that satisfies the predicate p.

Equations
@[inline]
def Array.insertIdx {α : Type u} (as : Array α) (i : Nat) (a : α) :
autoParam (i as.size) _auto✝Array α

Insert element a at position i.

Equations
def Array.insertIdx.loop {α : Type u} (i : Nat) (as : Array α) (j : Fin as.size) :
Equations
@[reducible, inline, deprecated Array.insertIdx (since := "2024-11-20")]
abbrev Array.insertAt {α : Type u_1} (as : Array α) (i : Nat) (a : α) :
autoParam (i as.size) _auto✝Array α
Equations
def Array.insertIdx! {α : Type u} (as : Array α) (i : Nat) (a : α) :

Insert element a at position i. Panics if i is not i ≤ as.size.

Equations
  • as.insertIdx! i a = if h : i as.size then as.insertIdx i a h else panicWithPosWithDecl "Init.Data.Array.Basic" "Array.insertIdx!" 875 7 "invalid index"
@[reducible, inline, deprecated Array.insertIdx! (since := "2024-11-20")]
abbrev Array.insertAt! {α : Type u_1} (as : Array α) (i : Nat) (a : α) :
Equations
def Array.insertIdxIfInBounds {α : Type u} (as : Array α) (i : Nat) (a : α) :

Insert element a at position i, or do nothing if as.size < i.

Equations
  • as.insertIdxIfInBounds i a = if h : i as.size then as.insertIdx i a h else as
def Array.isPrefixOfAux {α : Type u} [BEq α] (as bs : Array α) (hle : as.size bs.size) (i : Nat) :
Equations
  • as.isPrefixOfAux bs hle i = if h : i < as.size then let a := as[i]; let_fun this := ; let b := bs[i]; if (a == b) = true then as.isPrefixOfAux bs hle (i + 1) else false else true
def Array.isPrefixOf {α : Type u} [BEq α] (as bs : Array α) :

Return true iff as is a prefix of bs. That is, bs = as ++ t for some t : List α.

Equations
  • as.isPrefixOf bs = if h : as.size bs.size then as.isPrefixOfAux bs h 0 else false
@[specialize #[]]
def Array.zipWithAux {α : Type u} {β : Type u_1} {γ : Type u_2} (as : Array α) (bs : Array β) (f : αβγ) (i : Nat) (cs : Array γ) :
Equations
  • as.zipWithAux bs f i cs = if h : i < as.size then let a := as[i]; if h : i < bs.size then let b := bs[i]; as.zipWithAux bs f (i + 1) (cs.push (f a b)) else cs else cs
@[inline]
def Array.zipWith {α : Type u} {β : Type u_1} {γ : Type u_2} (as : Array α) (bs : Array β) (f : αβγ) :
Equations
  • as.zipWith bs f = as.zipWithAux bs f 0 #[]
def Array.zip {α : Type u} {β : Type u_1} (as : Array α) (bs : Array β) :
Array (α × β)
Equations
def Array.zipWithAll {α : Type u} {β : Type u_1} {γ : Type u_2} (as : Array α) (bs : Array β) (f : Option αOption βγ) :
Equations
@[irreducible]
def Array.zipWithAll.go {α : Type u} {β : Type u_1} {γ : Type u_2} (f : Option αOption βγ) (as : Array α) (bs : Array β) (i : Nat) (cs : Array γ) :
Equations
def Array.unzip {α : Type u} {β : Type u_1} (as : Array (α × β)) :
Array α × Array β
Equations
  • as.unzip = Array.foldl (fun (x : Array α × Array β) (x_1 : α × β) => match x with | (as, bs) => match x_1 with | (a, b) => (as.push a, bs.push b)) (#[], #[]) as
@[deprecated Array.partition (since := "2024-11-06")]
def Array.split {α : Type u} (as : Array α) (p : αBool) :
Array α × Array α
Equations
  • as.split p = Array.foldl (fun (x : Array α × Array α) (a : α) => match x with | (as, bs) => if p a = true then (as.push a, bs) else (as, bs.push a)) (#[], #[]) as

Lexicographic ordering #

instance Array.instLT {α : Type u} [LT α] :
LT (Array α)
Equations
instance Array.instLE {α : Type u} [LT α] :
LE (Array α)
Equations

Auxiliary functions used in metaprogramming. #

We do not currently intend to provide verification theorems for these functions.

@[inline]
def Array.reduceOption {α : Type u} (as : Array (Option α)) :

Drop nones from a Array, and replace each remaining some a with a.

Equations

eraseReps #

def Array.eraseReps {α : Type u_1} [BEq α] (as : Array α) :

O(|l|). Erase repeated adjacent elements. Keeps the first occurrence of each run.

  • eraseReps #[1, 3, 2, 2, 2, 3, 5] = #[1, 3, 2, 3, 5]
Equations
  • One or more equations did not get rendered due to their size.

allDiff #

def Array.allDiff {α : Type u} [BEq α] (as : Array α) :
Equations

getEvenElems #

@[inline]
def Array.getEvenElems {α : Type u} (as : Array α) :
Equations
  • One or more equations did not get rendered due to their size.

Repr and ToString #

instance Array.instRepr {α : Type u} [Repr α] :
Repr (Array α)
Equations
  • One or more equations did not get rendered due to their size.
instance Array.instToString {α : Type u} [ToString α] :
Equations