lumbda/proof/benchmark_results.md
russell@unturf.com f7352b51b0 rename: uncommonlisp -> lumbda throughout the repo
Historical internal name "uncommonlisp" retired in favor of the
public name "lumbda" ahead of lumbda.com going live. Scope of
this commit:

Source files renamed:
  uncommonlisp.py                     -> lumbda.py
  asm/uncommonlisp.s                  -> asm/lumbda.s
  c/uncommonlisp.h                    -> c/lumbda.h
  whitepaper/uncommonlisp-whitepaper  -> whitepaper/lumbda-whitepaper (.rst + .pdf)

Binaries renamed (tracked ones; c/ was always gitignored):
  asm/uncommonlisp, asm/uncommonlisp-gc, asm/uncommonlisp.o,
  asm/uncommonlisp-gc.o                -> asm/lumbda(-gc)(.o)
  c/.gitignore                          -> ignores lumbda

Internal string updates (sed pass ordered longest-first):
  asm/uncommonlisp -> asm/lumbda
  c/uncommonlisp   -> c/lumbda
  uncommonlisp.py  -> lumbda.py
  UNCOMMONLISP_BIN -> LUMBDA_BIN (asm/test.sh env var)
  "uncommonlisp> " -> "lumbda> " (asm REPL prompt baked into binary)
  UNCOMMONLISP     -> LUMBDA (macros, comments)
  uncommonlisp     -> lumbda (prose)

Binary portal magic updated:
  "ULPORTAL" -> "LUMBDAB1"   # "Lumbda Binary v1"
Old portal files are not backward-compatible — this is a deliberate
break since it's the rename moment. S-expression portals already
carry their own ";; lumbda-portal v1" header and remain cleanly
versioned.

WHITEPAPER.pdf / WHITEPAPER.rst symlinks repointed to the renamed
files. Makefile's whitepaper target targets lumbda-whitepaper.pdf.

Not changed (intentional, separate phases):
  - Filesystem directory /home/fox/git/uncommonlisp itself
    (fox renames locally and the gitlab repo URL in a follow-up)
  - tests.py hardcoded cwd=/home/fox/git/uncommonlisp
    (matches the current on-disk location; will flip when the
    directory rename ships)
  - Git history (immutable; old commits still say uncommonlisp,
    which is correct — that's what they were)

Verified:
  137 asm no-GC + 137 asm GC + 571 Python + 83 C + 189 shared
  functional tests all pass under the new names.
  bench-gc-http (2000 req): all 4 cells behave as expected
  (cells 1/2 flat, 3 leaks, 4 bounded at 1 chunk).
  Python REPL, C REPL, asm REPL all start cleanly.
2026-04-19 10:20:11 -04:00

2 KiB

EML Proof Friction Benchmark

Three approaches to verifying the same claim: eml(x,y) = exp(x) - ln(y) with constant 1 generates all elementary functions (arXiv:2603.21852v2).

Results

Approach Time Guarantee Friction
Python (numerical) 0.04s 1e-10 tolerance Low
lumbda (numerical) 59s 1e-10 tolerance High
Lean 4 (formal proof) 1.5s kernel-verified Medium

Analysis

The formal proof is 40x faster than brute-force search and provides mathematical certainty instead of floating-point tolerance.

The numerical approaches (Python and lumbda) perform O(N²) pairwise enumeration of EML trees, evaluating at transcendental test points and comparing against target functions. This is MOAD-0001 at the proof layer: quadratic search friction where algebraic reasoning suffices.

The Lean proof does 5 rewrites — each one an identity (exp(ln(x))=x, ln(exp(x))=x, ln(1)=0). The kernel checks each step in microseconds. No search, no tolerance, no conjecture dependency.

The MOAD-0001 in proof methodology

Step Numerical approach Algebraic approach
Find exp O(N²) search 1 rewrite: eml(x,1) = exp(x) - ln(1) = exp(x)
Find ln O(N²) search 3 rewrites: composition + cancel
Find 0 O(N²) search Corollary of ln: ln(1) = 0
Find sub O(N²) search 1 rewrite: eml(ln(a), exp(b)) = a - b
Verify Compare floats Type checker

The numerical search does redundant work at every step. The algebraic proof does each step exactly once. This is the sedimentary defect: brute-force where structure exists.

Lesson

The fastest path to truth is not computation — it is understanding. When you know WHY eml(1, eml(eml(1,x), 1)) = ln(x), you can verify it in microseconds. When you don't, you search for hours.

Proof assistants eliminate the quadratic friction of verification. They are the hash set to numerical analysis's nested loop.