Typos were found with ``` pip install codespell --upgrade codespell --summary --ignore-words-list enew,forin,fro,happend,hge,ihs,iterm,spred --skip stage0 --check-filenames codespell --summary --ignore-words-list enew,forin,fro,happend,hge,ihs,iterm,spred --skip stage0 --check-filenames --regex '[A-Z][a-z]*' codespell --summary --ignore-words-list enew,forin,fro,happend,hge,ihs,iterm,spred --skip stage0 --check-filenames --regex "\b[a-z']*" ```
35 lines
1.1 KiB
Text
35 lines
1.1 KiB
Text
/-
|
|
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Joachim Breitner
|
|
-/
|
|
|
|
module
|
|
prelude
|
|
public import Lean.Meta.Basic
|
|
import Lean.Meta.InferType
|
|
|
|
open Lean Meta
|
|
|
|
/-!
|
|
This module provides builder for efficient `Nat → …` functions based on binary decision trees.
|
|
-/
|
|
|
|
/--
|
|
Builds an expression of type `Nat → $type` that returns the `es[i]`, using binary search.
|
|
The array must be non-empty.
|
|
-/
|
|
public def mkNatLookupTable (i : Expr) (type : Expr) (es : Array Expr) : MetaM Expr := do
|
|
if h : es.size = 0 then
|
|
panic! "mkNatLookupTable: expected non-empty array"
|
|
else
|
|
let u ← getLevel type
|
|
let rec go (start stop : Nat) (hstart : start < stop := by omega) (hstop : stop ≤ es.size := by omega) : MetaM Expr := do
|
|
if h : start + 1 = stop then
|
|
return es[start]
|
|
else
|
|
let mid := (start + stop) / 2
|
|
let low ← go start mid
|
|
let high ← go mid stop
|
|
return mkApp4 (mkConst ``cond [u]) type (mkApp2 (mkConst ``Nat.ble) i (mkRawNatLit (mid-1))) low high
|
|
go 0 es.size
|