This PR adds `simpArrowTelescope`, a simproc that simplifies telescopes
of non-dependent arrows (p₁ → p₂ → ... → q) while avoiding quadratic
proof growth.
When using `Expr.forallE` to represent nested implications, each nesting
level bumps de Bruijn indices in subterms, destroying sharing even with
hash-consing. For example, a free variable `x` gets different de Bruijn
representations at each depth, causing proof terms to grow.
`simpArrowTelescope` works by:
- Converting arrows to `Arrow p q` (a definitional wrapper)
- Simplifying each component
- Converting back to `→` form
Since `Arrow` arguments are not under binders, subterms remain identical
across nesting levels and can be shared.
The `simp_4` benchmark demonstrates the improvement:
With `forallE`: ~160ms, proof_size ≈ 173k
With `Arrow`: ~43ms, proof_size ≈ 16k
Tradeoff: `simpArrowTelescope` misses simplifications that depend on the
arrow structure (e.g., `p → p` to `True`), since post-methods aren't
applied to intermediate arrows. Thus, it is not used by default. to use
it, one has to set `simpArrowTelescope` as a `pre`-method.
This folder contains multiple small Lean programs for benchmarking used by two
separate benchmark suites based on the
temci benchmarking tool:
The light-weight "Speedcenter" suite benchmarks the current build of Lean. It
can be used for quick comparisons on the cmdline and powers the Lean
Speedcenter website.
The heavy-weight "Cross" suite benchmarks multiple Lean configurations and
other functional compilers against each other and generates CSV and HTML
reports from that. It was created for the paper "Counting Immutable Beans -
Reference Counting Optimized for Purely Functional Programming" (IFL19).
Speedcenter Suite
Requirements:
A local Lean build in ../../build/release. Build at least the bin target.
temci. Using Nix, open a nix-shell in the project
root directory to add a compatible version to your PATH. Alternatively, try
pip3 install git+https://github.com/parttimenerd/temci.git.
To execute the suite and save the results in base.yaml, run (in this folder)
use --runs N to modify the default number of 10 runs per benchmark
use --included_blocks fast to excluded slow benchmarks like the stdlib
benchmark. You can replace fast with any benchmark name or label in
speedcenter.exec.yaml.
If you have multiple saved result files, you can compare them with
We recommend using Nix for building/obtaining all Lean variants and used
compilers in a reproducible way. After installing Nix, running the benchmarks is as easy as
nix develop
make
This will record 50 runs for each benchmark configuration (this can be changed with runs in cross.yaml),
generate results in report_lean.csv and report_cross.csv, and print them to stdout in a tabulated format.
It will also generate HTML reports in report/ comparing the time-based benchmarks.
In order to reduce noise in the benchmarking data, you may instead want to try calling make inside a
temci shell:
temci short shell --sudo --preset usable --cpuset_active make
Using root powers, this will temporarily configure your machine similarly to the
LLVM benchmarking recommendations and move all your other
processes to a single CPU core.