Lean Kernel Arena / perf/unroll-versus-evaluate

Test "perf/unroll-versus-evaluate"

Expected: 馃憤 accept 路 Size: 44.6鈥疜B 路 Lines: 1.2鈥痥 路 lean4export: 3.1.0 路 Lean: 4.29.1 路 Timeout: 50.0鈥痵 路 馃搫 Declaration 路 馃敆 Source

The declaration to check compares

count #(n+1)      and      N.add (count #n) #1

where #k is the numeral with k successors, and count #k evaluates to #k in 螛(k虏) reductions.

The head constants differ. Unrolling count once turns the left side into the right side, leaving a traversal of the shared numeral #n, for 螛(n); evaluating both sides costs 螛(n虏). The test asks which of two differing head constants a checker chooses to unfold.

N=1000 in the Lean source. From Courant and Leroy, POPL 2026, 搂2.

Checker Result 鈴憋笍 馃
mathgraph 馃憤 2鈥痬s (梅12) 48.3鈥疢B (-26%)
sokonanoda 馃憤 3鈥痬s (梅12) 46.2鈥疢B (-30%)
nanoclo 馃憤 4鈥痬s (梅8.2) 56.5鈥疢B (-14%)
con-ron 馃憤 24鈥痬s (-22%) 59.3鈥疢B (-10%)
lazylean 馃憤 2鈥痬s (梅20) 21.3鈥疢B (梅3.1)
nanoda 馃憤 2鈥痬s (梅20) 3.4鈥疢B (梅19)
nanobruijn 馃憤 2鈥痬s (梅16) 9.8鈥疢B (梅6.7)
con-leche 馃憤 7鈥痬s (梅4.7) 27.1鈥疢B (梅2.4)
eink0rn 馃憤 3鈥痬s (梅12) 13.4鈥疢B (梅4.9)
ind-models 馃憤 65鈥痬s (脳2.1) 107.8鈥疢B (+64%)
official 馃憤 31鈥痬s (0%) 65.6鈥疢B (0%)
lean4lean 馃憤 31鈥痬s (+2%) 99.0鈥疢B (+51%)
tenet 馃憤 134鈥痬s (脳4.4) 44.4鈥疢B (-32%)
nanoclo-fortran 馃憤 9鈥痬s (梅3.5) 7.9鈥疢B (梅8.3)
lean4cobol 馃憤 25鈥痬s (-20%) 17.5鈥疢B (梅3.8)
evmlean 馃毇 1.6鈥痵 138.2鈥疢B
mini 馃挜 49.3鈥痵 89.9鈥疢B
overfull 馃挜 1.6鈥痬 48.6鈥疢B
kiota 馃憤 8鈥痬s (梅3.9) 18.4鈥疢B (梅3.6)
canonical-min 馃毇 390鈥痬s 1.1鈥疓B
rpylean 馃憤 1鈥痬s (梅23) 6.0鈥疢B (梅11)
vow-lean-kernel 馃憤 120鈥痬s (脳3.9) 9.0鈥疢B (梅7.3)
official-v4.28.0 馃憤 38鈥痬s (+23%) 73.8鈥疢B (+12%)
still-nanoda 馃憤 2鈥痬s (梅21) 3.3鈥疢B (梅20)
nyaya 馃憤 6鈥痬s (梅4.9) 11.4鈥疢B (梅5.7)
parse-only 馃憤 30鈥痬s (-3%) 65.5鈥疢B (0%)