perf(library/init/data/array): mkArray in Lean doesn't seem to buy us anything

The primitive implementation combines all `inc`'s into a single one.
This commit is contained in:
Leonardo de Moura 2019-04-03 10:27:58 -07:00
parent a18c88a727
commit 273a0775d6
3 changed files with 9 additions and 23 deletions

View file

@ -40,9 +40,13 @@ def push (a : Array α) (v : α) : Array α :=
if h₂ : j = a.sz then v
else a.data ⟨j, Nat.ltOfLeOfNe (Nat.leOfLtSucc h₁) h₂⟩ }
@[extern cpp inline "lean::mk_array(#2, #3)"]
def mkArray {α : Type u} (n : Nat) (v : α) : Array α :=
let a : Array α := mkEmpty n in
n.repeat (λ a, a.push v) a
{ sz := n,
data := λ _, v}
theorem szMkArrayEq {α : Type u} (n : Nat) (v : α) : (mkArray n v).sz = n :=
rfl
def empty : Array α :=
mkEmpty 0
@ -183,25 +187,6 @@ end Array
export Array (mkArray)
private theorem repeatCorePushSz {α : Type u} : ∀ (n : Nat) (v : α) (a : Array α),
(Nat.repeatCore (λ (a : Array α), a.push v) n (a.push v)).sz =
(Nat.repeatCore (λ (a : Array α), a.push v) n a).sz.succ
| 0 _ _ := rfl
| (Nat.succ n) v a :=
show (Nat.repeatCore (λ (a : Array α), a.push v) n ((a.push v).push v)).sz =
(Nat.repeatCore (λ (a : Array α), a.push v) n (a.push v)).sz.succ, from
repeatCorePushSz n v (a.push v)
theorem szMkArrayEq {α : Type u} (n : Nat) (v : α) : (mkArray n v).sz = n :=
Nat.recOn n rfl $ λ n ih,
have aux₁ : (Nat.repeatCore (λ (a : Array α), a.push v) n (Array.mkEmpty n)).sz = n, from ih,
have aux₂ : (Nat.repeatCore (λ (a : Array α), a.push v) n ((Array.mkEmpty n).push v)).sz =
(Nat.repeatCore (λ (a : Array α), a.push v) n (Array.mkEmpty n)).sz.succ, from
repeatCorePushSz _ _ _,
have aux₃ : (Nat.repeatCore (λ (a : Array α), a.push v) n (Array.mkEmpty n)).sz.succ = n.succ, from
congrArg _ aux₁,
Eq.trans aux₂ aux₃
@[inlineIfReduce] def List.toArrayAux {α : Type u} : List α → Array α → Array α
| [] r := r
| (a::as) r := List.toArrayAux as (r.push a)

View file

@ -24,7 +24,7 @@ let n := if nbuckets = 0 then 8 else nbuckets in
{ size := 0,
buckets :=
⟨ mkArray n AssocList.nil,
have p₁ : (mkArray n (@AssocList.nil α β)).size = n, from szMkArrayEq _ _,
have p₁ : (mkArray n (@AssocList.nil α β)).size = n, from Array.szMkArrayEq _ _,
have p₂ : n = (if nbuckets = 0 then 8 else nbuckets), from rfl,
have p₃ : (if nbuckets = 0 then 8 else nbuckets) > 0, from
match nbuckets with
@ -63,7 +63,7 @@ foldBuckets m.buckets d f
def expand [Hashable α] (size : Nat) (buckets : HashMapBucket α β) : HashMapImp α β :=
let nbuckets := buckets.val.size * 2 in
let aux₁ : nbuckets > 0 := Nat.mulPos buckets.property (Nat.zeroLtBit0 Nat.oneNeZero) in
let aux₂ : (mkArray nbuckets (@AssocList.nil α β)).size = nbuckets := szMkArrayEq _ _ in
let aux₂ : (mkArray nbuckets (@AssocList.nil α β)).size = nbuckets := Array.szMkArrayEq _ _ in
{ size := size,
buckets := foldBuckets buckets ⟨mkArray nbuckets AssocList.nil, aux₂.symm ▸ aux₁⟩ (reinsertAux hash) }

View file

@ -1430,6 +1430,7 @@ inline object * array_pop(obj_arg a) {
}
object * array_push(obj_arg a, obj_arg v);
object * mk_array(obj_arg n, obj_arg v);
// =======================================
// debugging helper functions