Lean Kernel Arena / vow-lean-kernel

Checker "vow-lean-kernel"

Version: 0.1.0 · 📄 Declaration · 🔗 Source

A Lean 4 kernel (proof checker) written in Vow, a young systems language. Reads lean4export NDJSON and verifies each declaration is well-typed.

It accepts the full Arena tutorial suite and all of Lean core Init (54,475 declarations). Nat arithmetic uses a base-2^32 bignum backend, so reductions past 2^64 are exact. Declarations beyond the currently supported fragment are declined (exit 2) rather than falsely rejected — the checker is sound-by-construction on what it accepts and conservative elsewhere.

Vow is a language developed by Paulo Matos (github.com/pmatos) for agentic use — one of several such languages currently emerging, alongside MoonBit, Vera-lang, and Zerolang. This kernel, the first large program written in Vow, was undertaken as a challenge: to have an agent develop a complete Lean kernel entirely in the new language, and it doubles as a proving ground for it. The work was 100% agentic, carried out with Claude Code.

Completeness (rightfully accepted tests)

95/95

Soundness (rightfully rejected tests)

49/49

Declined tests

8

Test Expected Result ⏱️ 🧠
bogus1 113 ms 7.8 MB
cedar 👍 💥 55.7 s 375.8 MB
constlevels 130 ms 7.8 MB
cslib 👍 💥 56.2 s 377.7 MB
init 👍 💥 56.1 s 374.4 MB
init-prelude 👍 👍 16.2 s (+3925%) 33.5 MB
k-rec-conv 117 ms 7.8 MB
large-elim-param 67 ms 7.8 MB
level-imax-leq 84 ms 7.8 MB
level-imax-normalization 84 ms 7.8 MB
level-index-out-of-order 👍 👍 50 ms 7.8 MB
mathlib 👍 💥 56.8 s 378.4 MB
nat-rec-rules 97 ms 7.8 MB
perf/app-lam 👍 💥 55.3 s 19.2 MB
perf/grind-ring-5 👍 💥 48.9 s 235.8 MB
perf/shift-cascade 👍 👍 322 ms (+520%) 11.7 MB
proj-of-prop 🚫 83 ms 7.8 MB
sparse-name-index 👍 👍 50 ms 7.8 MB
std 👍 💥 56.2 s 379.2 MB
tutorial/001_basicDef 👍 👍 50 ms 7.8 MB
tutorial/002_badDef 47 ms 7.8 MB
tutorial/003_arrowType 👍 👍 50 ms 7.7 MB
tutorial/004_dependentType 👍 👍 50 ms 7.8 MB
tutorial/005_constType 👍 👍 50 ms 7.8 MB
tutorial/006_betaReduction 👍 👍 54 ms 7.8 MB
tutorial/007_betaReduction2 👍 👍 54 ms 7.8 MB
tutorial/008_forallSortWhnf 👍 👍 54 ms 7.8 MB
tutorial/009_forallSortBad 51 ms 7.8 MB
tutorial/010_nonTypeType 51 ms 7.8 MB
tutorial/011_nonPropThm 47 ms 7.8 MB
tutorial/012_levelComp1 👍 👍 50 ms 7.8 MB
tutorial/013_levelComp2 👍 👍 50 ms 7.8 MB
tutorial/014_levelComp3 👍 👍 50 ms 7.8 MB
tutorial/015_levelParams 👍 👍 54 ms 7.8 MB
tutorial/016_tut06_bad01 47 ms 7.8 MB
tutorial/017_levelComp4 👍 👍 50 ms 7.8 MB
tutorial/018_levelComp5 👍 👍 50 ms 7.8 MB
tutorial/019_imax1 👍 👍 50 ms 7.8 MB
tutorial/020_imax2 👍 👍 50 ms 7.8 MB
tutorial/021_levelMaxComm 👍 👍 50 ms 7.8 MB
tutorial/022_levelMaxAssoc 👍 👍 50 ms 7.8 MB
tutorial/023_levelMaxIdem 👍 👍 50 ms 7.8 MB
tutorial/024_levelMaxAbsorb 👍 👍 50 ms 7.8 MB
tutorial/025_inferVar 👍 👍 50 ms 7.8 MB
tutorial/026_defEqLambda 👍 👍 51 ms 7.8 MB
tutorial/027_peano1 👍 👍 74 ms 7.8 MB
tutorial/028_peano2 👍 👍 79 ms 7.8 MB
tutorial/029_peano3 👍 👍 86 ms 7.8 MB
tutorial/030_letType 👍 👍 50 ms 7.8 MB
tutorial/031_letTypeDep 👍 👍 58 ms 7.8 MB
tutorial/032_letRed 👍 👍 54 ms 7.8 MB
tutorial/033_empty 👍 👍 58 ms 7.8 MB
tutorial/034_boolType 👍 👍 66 ms 7.8 MB
tutorial/035_twoBool 👍 👍 79 ms 7.8 MB
tutorial/036_andType 👍 👍 64 ms 7.8 MB
tutorial/037_prodType 👍 👍 64 ms 7.8 MB
tutorial/038_pprodType 👍 👍 64 ms 7.8 MB
tutorial/039_pUnitType 👍 👍 62 ms 7.8 MB
tutorial/040_eqType 👍 👍 64 ms 7.8 MB
tutorial/041_natDef 👍 👍 67 ms 7.8 MB
tutorial/042_rbTreeDef 👍 👍 115 ms 8.0 MB
tutorial/043_inductBadNonSort 51 ms 7.8 MB
tutorial/044_inductBadNonSort2 51 ms 7.8 MB
tutorial/045_inductLevelParam 47 ms 7.8 MB
tutorial/046_inductTooFewParams 47 ms 7.8 MB
tutorial/047_inductWrongCtorParams 58 ms 7.8 MB
tutorial/048_inductWrongCtorResParams 55 ms 7.8 MB
tutorial/049_inductWrongCtorResLevel 55 ms 7.8 MB
tutorial/050_inductInIndex 58 ms 7.8 MB
tutorial/051_indNeg 55 ms 7.8 MB
tutorial/052_reduceCtorParam.mk 👍 👍 68 ms 7.8 MB
tutorial/053_reduceCtorType.mk 59 ms 7.8 MB
tutorial/054_indNegReducible 62 ms 7.8 MB
tutorial/055_predWithTypeField 👍 👍 62 ms 7.8 MB
tutorial/056_typeWithTypeField 👍 👍 62 ms 7.8 MB
tutorial/057_typeWithTypeFieldPoly 👍 👍 62 ms 7.8 MB
tutorial/058_typeWithTooHighTypeField.mk 55 ms 7.8 MB
tutorial/059_emptyRec 👍 👍 58 ms 7.8 MB
tutorial/060_boolRec 👍 👍 67 ms 7.8 MB
tutorial/061_twoBoolRec 👍 👍 79 ms 7.8 MB
tutorial/062_andRec 👍 👍 64 ms 7.8 MB
tutorial/063_prodRec 👍 👍 65 ms 7.8 MB
tutorial/064_pprodRec 👍 👍 65 ms 7.8 MB
tutorial/065_punitRec 👍 👍 62 ms 7.8 MB
tutorial/066_eqRec 👍 👍 64 ms 7.8 MB
tutorial/067_nRec 👍 👍 67 ms 7.8 MB
tutorial/068_rbTreeRef 👍 👍 116 ms 8.0 MB
tutorial/069_boolPropRec 👍 👍 66 ms 7.8 MB
tutorial/070_existsRec 👍 👍 64 ms 7.8 MB
tutorial/071_sortElimPropRec 👍 👍 80 ms 7.8 MB
tutorial/072_sortElimProp2Rec 👍 👍 85 ms 7.8 MB
tutorial/073_boolRecEqns 👍 👍 96 ms 7.8 MB
tutorial/074_prodRecEqns 👍 👍 81 ms 7.8 MB
tutorial/075_nRecReduction 👍 👍 105 ms 7.8 MB
tutorial/076_listRecReduction 👍 👍 115 ms 7.9 MB
tutorial/077_RBTree.id_spec 👍 👍 171 ms 8.5 MB
tutorial/078_And.right 👍 👍 68 ms 7.8 MB
tutorial/079_Prod.snd 👍 👍 69 ms 7.8 MB
tutorial/080_PProd.snd 👍 👍 69 ms 7.8 MB
tutorial/081_PSigma.snd 👍 👍 69 ms 7.8 MB
tutorial/082_projOutOfRange 61 ms 7.8 MB
tutorial/083_projNotStruct 64 ms 7.8 MB
tutorial/084_projProp1 👍 👍 90 ms 7.8 MB
tutorial/085_projProp2 87 ms 7.8 MB
tutorial/086_projProp3 👍 👍 90 ms 7.8 MB
tutorial/087_projProp4 87 ms 7.8 MB
tutorial/088_projProp5 87 ms 7.8 MB
tutorial/089_projProp6 87 ms 7.8 MB
tutorial/090_projDataIndexRec 👍 👍 92 ms 7.8 MB
tutorial/091_projIndexData 89 ms 7.8 MB
tutorial/092_projIndexData2 89 ms 7.8 MB
tutorial/093_projRed 👍 👍 103 ms 7.8 MB
tutorial/094_ruleK 👍 👍 81 ms 7.8 MB
tutorial/095_ruleKbad 78 ms 7.8 MB
tutorial/096_ruleKAcc 96 ms 7.8 MB
tutorial/097_aNatLit 👍 👍 67 ms 7.8 MB
tutorial/098_natLitEq 👍 👍 81 ms 7.8 MB
tutorial/099_proofIrrelevance 👍 👍 69 ms 7.8 MB
tutorial/100_proofIrrelevanceBad 66 ms 7.8 MB
tutorial/101_proofIrrelevanceWhnf 👍 👍 73 ms 7.8 MB
tutorial/102_unitEta1 👍 👍 84 ms 7.8 MB
tutorial/103_unitEta2 👍 👍 80 ms 7.8 MB
tutorial/104_unitEta3 👍 👍 80 ms 7.8 MB
tutorial/105_structEta 👍 👍 106 ms 7.8 MB
tutorial/106_funEta 👍 👍 69 ms 7.8 MB
tutorial/107_funEtaDep 👍 👍 69 ms 7.8 MB
tutorial/108_funEtaBad 62 ms 7.8 MB
tutorial/109_etaRuleK 78 ms 7.8 MB
tutorial/110_etaCtor 106 ms 7.8 MB
tutorial/111_reflOccLeft 72 ms 7.8 MB
tutorial/112_reflOccInIndex 72 ms 7.8 MB
tutorial/113_reduceCtorParamRefl.mk 👍 👍 68 ms 7.8 MB
tutorial/114_reduceCtorParamRefl2.mk 👍 👍 68 ms 7.8 MB
tutorial/115_rTreeRec 👍 👍 84 ms 7.8 MB
tutorial/116_rtreeRecReduction 👍 👍 107 ms 7.8 MB
tutorial/117_accRecType 👍 👍 69 ms 7.8 MB
tutorial/118_accRecReduction 👍 👍 101 ms 7.8 MB
tutorial/119_accRecNoEta 96 ms 7.8 MB
tutorial/120_quotMkType 👍 👍 81 ms 7.8 MB
tutorial/121_quotIndType 👍 👍 81 ms 7.8 MB
tutorial/122_quotLiftType 👍 👍 81 ms 7.8 MB
tutorial/123_quotSoundType 👍 👍 85 ms 7.8 MB
tutorial/124_quotLiftReduction 👍 👍 83 ms 7.8 MB
tutorial/125_quotIndReduction 👍 👍 83 ms 7.8 MB
tutorial/126_dup_defs 47 ms 7.7 MB
tutorial/127_dup_ind_def 48 ms 7.7 MB
tutorial/128_dup_ctor_def 48 ms 7.7 MB
tutorial/129_dup_rec_def 48 ms 7.7 MB
tutorial/130_misnamed_rec_user 48 ms 7.7 MB
tutorial/131_dup_rec_def2 48 ms 7.7 MB
tutorial/132_dup_ctor_rec 48 ms 7.7 MB
tutorial/133_DupConCon 48 ms 7.7 MB

Detailed results

Test "bogus1"

Expected: ✋ reject · Size: 11.4 KB · Lines: 198 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A clearly bogus proof. Also serves as an example for how to write simple cases.

Test result: ✋ rejected · exit code 1 · wall time: 130 ms · instructions: 677.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/16 arena=143
FAIL decl 15 name=thm kind=2

Test "cedar"

Expected: 👍 accept · Size: 790.9 MB · Lines: 14.6 M · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Lean formalization of, and proofs about, Cedar.

Auto-generated documentation is available at https://cedar-policy.github.io/cedar-spec/docs/.

This test case exports the whole Cedar module and as such contains even unused parts Init and Batteries.

Test result: 💥 error · exit code 124 · wall time: 30.1 s · instructions: 334.2 G · max rss memory: 375.8 MB

Test "constlevels"

Expected: ✋ reject · Size: 15.3 KB · Lines: 283 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration

Regression test for undefined behavior in lazy_delta_reduction_step in the official kernel

In the function lazy_delta_reduction_step, the official kernel expects unfold_definition to always succeed. However, if the constant has an incorrect number of level parameters, it actually fails, which leads to memory corruption in lazy_delta_reduction_step.

This test is to check that the official kernel and also other kernels that closely follow the logic of the official kernel correctly handle this unfolding failure.

The issue in the official kernel was originally reported as https://github.com/leanprover/lean4/issues/10577.

Test result: ✋ rejected · exit code 1 · wall time: 87 ms · instructions: 777.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/20 arena=204
FAIL decl 19 name=_test kind=2

Test "cslib"

Expected: 👍 accept · Size: 1.3 GB · Lines: 25.1 M · lean4export: 3.1.0 · Lean: 4.29.0 · 📄 Declaration · 🔗 Source

The Lean Computer Science Library (CSLib).

Test result: 💥 error · exit code 124 · wall time: 30.1 s · instructions: 337.3 G · max rss memory: 377.7 MB

Test "init"

Expected: 👍 accept · Size: 309.5 MB · Lines: 6.1 M · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The Init module export from Lean 4 core.

This test contains the fundamental building blocks of Lean 4, including:

  • Basic data types (Nat, List, Array, String, etc.)
  • Core tactics and syntax
  • Foundational mathematical structures
  • Essential metaprogramming infrastructure

This is one of the smallest meaningful test cases, making it ideal for initial checker validation and debugging.

Test result: 💥 error · exit code 124 · wall time: 30.1 s · instructions: 336.7 G · max rss memory: 374.4 MB

Test "init-prelude"

Expected: 👍 accept · Size: 3.5 MB · Lines: 63.7 k · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The Init.Prelude module export.

Test result: 👍 accepted · exit code 0 · wall time: 8.9 s · instructions: 97.0 G · max rss memory: 33.5 MB

stdout:
Checking decl 0/2059 arena=54535
Checking decl 100/2059 arena=54535
Checking decl 200/2059 arena=54535
Checking decl 300/2059 arena=54535
Checking decl 400/2059 arena=54535
Checking decl 500/2059 arena=54535
Checking decl 600/2059 arena=54535
Checking decl 700/2059 arena=54535
Checking decl 800/2059 arena=54535
Checking decl 900/2059 arena=54535
Checking decl 1000/2059 arena=54535
Checking decl 1100/2059 arena=54535
Checking decl 1200/2059 arena=54535
Checking decl 1300/2059 arena=54535
Checking decl 1400/2059 arena=54535
Checking decl 1500/2059 arena=54535
Checking decl 1600/2059 arena=54535
Checking decl 1700/2059 arena=54535
Checking decl 1800/2059 arena=54535
Checking decl 1900/2059 arena=54535
Checking decl 2000/2059 arena=54535

Test "k-rec-conv"

Expected: ✋ reject · Size: 13.0 KB · Lines: 243 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Bogus proof that tests for incorrectly implemented K-like reduction.

fun x => x and fun _ => y are not convertible, but a checker that does treat them as convertible would accept the resulting theorem bad, which is true propositionally, but not definitionally.

Regression test for sokonanoda.

Test result: ✋ rejected · exit code 1 · wall time: 81 ms · instructions: 701.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/17 arena=167
FAIL decl 16 name=bad kind=2

Test "large-elim-param"

Expected: ✋ reject · Size: 3.1 KB · Lines: 48 · 📄 Declaration

Proof of False via incorrect large elimination restriction.

If the check for whether a level is surely not zero is implemented wrong, in particular if it incorrectly returns true for params, we can create a universe-polymorphic

inductive MyBool.{u} : Sort u | tt | ff

where the recursor MyBool.rec.{1,0} can do large elimination of a Prop. Because of proof irrelevance we have tt = ff, so we can derive a contradiction.

Found by Anthony Wang using Aristotle.

Test result: ✋ rejected · exit code 1 · wall time: 55 ms · instructions: 400.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=34
FAIL decl 5 name=MyBool kind=5

Test "level-imax-leq"

Expected: ✋ reject · Size: 5.6 KB · Lines: 93 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration

Proof of False via incorrect universe level comparison for imax.

A correct kernel must reject leq(imax(u,v)+1, imax(u,v)), since at u=0, v=0 this becomes leq(1, 0) which is false. However, a checker that only compares the imax arguments structurally (without accounting for an accumulated successor offset) will incorrectly accept it.

This allows defining a universe-collapsing identity function down.{u,v} : Sort (succ (imax u v)) → Sort (imax u v), which is used to cast between True and False via Bool.rec at Sort (imax 0 0) = Prop.

Nanoda incorrectly accepted this proof until it was fixed.

Test result: ✋ rejected · exit code 1 · wall time: 64 ms · instructions: 503.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=59
FAIL decl 9 name=down kind=1

Test "level-imax-normalization"

Expected: ✋ reject · Size: 5.8 KB · Lines: 96 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration

Proof of False via incorrect universe level normalization for imax.

A correct kernel must distinguish imax 0 v from succ(imax 0 v), since at v=0 these evaluate to 0 and 1 respectively. However, a level normalization algorithm that drops an accumulated successor offset when decomposing imax u (param v) will produce identical normal forms for both, causing the equivalence check to incorrectly return true.

This allows defining a universe-collapsing identity function down.{v} : Sort (succ (imax 0 v)) → Sort (imax 0 v), and then myProp : Prop := down.{0} Bool (a Prop that is computationally Bool). Proof irrelevance on myProp equates Bool.true and Bool.false, and Bool.rec maps this into False.

Test result: ✋ rejected · exit code 1 · wall time: 67 ms · instructions: 504.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/12 arena=60
FAIL decl 9 name=down kind=1

Test "level-index-out-of-order"

Expected: 👍 accept · Size: 328 B · Lines: 6 · lean4export: 0.1.0 · Lean: 4.29.1 · 📄 Declaration

Lean4export will create internalization-table references contiguously in order: in references for names, il references for levels, and ie references for expressions all work this way.

However, the spec merely requires that these are integers. It's reasonable for an implementation to assume these are approximately dense (and to treat them as array indices instead of hashtable entries), but a kernel should handle skipped indices or out-of-order indices.

This test checks that the kernel doesn't require internaliation-table references to be presented in ascending order. If the level referenes 2 and 1 were swapped, this would be the expected encoding of axiom foo : Sort 2. This encoding should be equivalent.

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 299.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=1

Test "mathlib"

Expected: 👍 accept · Size: 5.2 GB · Lines: 100.0 M · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The complete Mathlib library export.

This test contains all the mathematical definitions, theorems, and proofs from Mathlib, representing the largest and most comprehensive test case in the Lean kernel arena.

Test result: 💥 error · exit code 124 · wall time: 30.1 s · instructions: 340.9 G · max rss memory: 378.4 MB

Test "nat-rec-rules"

Expected: ✋ reject · Size: 8.1 KB · Lines: 128 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration

Proof of False via incorrect recursor rule validation.

When processing an inductive type declaration, a correct kernel must verify that the generated recursor rules match the ones provided in the export data. A checker that accidentally compares the imported rules against themselves (instead of against independently constructed rules) will accept arbitrary recursor reduction behavior.

This test defines Nat with a wrong Nat.rec succ rule that always returns hzero (ignoring the induction hypothesis). Combined with a nat literal extension that hardcodes correct arithmetic for concrete nat literals but falls back to the wrong Nat.rec rules for symbolic arguments, this creates an inconsistency that yields a proof of False.

Nanoda incorrectly accepted this proof until it was fixed.

Test result: ✋ rejected · exit code 1 · wall time: 70 ms · instructions: 583.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/15 arena=92
FAIL decl 12 name=Nat kind=5

Test "perf/app-lam"

Expected: 👍 accept · Size: 1.2 MB · Lines: 28.6 k · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A synthetically generated term with n levels of alternating applications and lambdas, with DAG sharing.

At each level, a constant is applied to two identical lambda arguments. The export format records these as a single shared expression (DAG). Each lambda body grows with the nesting depth, referencing all enclosing binders.

This tests two aspects of checker performance:

Infer cache: Since both arguments at each level are the same expression, a checker without an infer cache re-infers the type of each shared subterm, doubling work at every level — O(2ⁿ) total.

Substitution cost: Even with a cache, type-inferring each lambda requires substituting into its body (size O(n)) at each of the n levels, giving O(n²) total. Whether this cost arises depends on the checker's binder representation.

Test result: 💥 error · exit code 124 · wall time: 30.0 s · instructions: 331.9 G · max rss memory: 19.2 MB

stdout:
Checking decl 0/34 arena=24427

Test "perf/grind-ring-5"

Expected: 👍 accept · Size: 9.7 MB · Lines: 199.2 k · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A grind tactic test from the Lean 4 test suite.

This produces a theorem with a rather large proof term that needs fast reduction.

Test result: 💥 error · exit code 124 · wall time: 30.0 s · instructions: 293.5 G · max rss memory: 235.8 MB

stdout:
Checking decl 0/2432 arena=180991
Checking decl 100/2432 arena=180991
Checking decl 200/2432 arena=180991
Checking decl 300/2432 arena=180991
Checking decl 400/2432 arena=180991
Checking decl 500/2432 arena=180991
Checking decl 600/2432 arena=180991
Checking decl 700/2432 arena=180991
Checking decl 800/2432 arena=180991
Checking decl 900/2432 arena=180991
Checking decl 1000/2432 arena=180991
Checking decl 1100/2432 arena=180991
Checking decl 1200/2432 arena=180991
Checking decl 1300/2432 arena=180991
Checking decl 1400/2432 arena=180991
Checking decl 1500/2432 arena=180991
Checking decl 1600/2432 arena=180991
Checking decl 1700/2432 arena=180991
Checking decl 1800/2432 arena=180991
Checking decl 1900/2432 arena=180991
Checking decl 2000/2432 arena=180991
Checking decl 2100/2432 arena=180991
Checking decl 2200/2432 arena=180991
Checking decl 2300/2432 arena=180991
Checking decl 2400/2432 arena=180991

Test "perf/shift-cascade"

Expected: 👍 accept · Size: 256.3 KB · Lines: 5.1 k · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Stress test for cascading substitution overhead in kernel let processing.

N nested let bindings inside a lambda, where each value references the outer lambda parameter and the previous binding:

fun (a : Nat → Nat) => let f₁ := fun x => a x let f₂ := fun x => a (f₁ x) ... let fₙ := fun x => a (fₙ₋₁ x) fₙ 0

The kernel processes each let by substituting the value into the body. Each value has a free bvar (references a), so substitution under inner binders creates shifted copies. In a de Bruijn kernel with deferred shifts, these Shift(val, offset) wrappers accumulate: step k must traverse through O(k) wrappers from previous steps, giving O(N²) total work.

A locally-nameless kernel substitutes fvars that need no shifting, giving O(N) total.

N=1000 in the Lean source. Increase to stress further.

Test result: 👍 accepted · exit code 0 · wall time: 174 ms · instructions: 1.9 G · max rss memory: 11.7 MB

stdout:
Checking decl 0/10 arena=4089

Test "proj-of-prop"

Expected: ✋ reject · Size: 3.9 KB · Lines: 56 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A proof of False via a projection from a Prop-typed structure whose constructor was applied to an ill-typed argument. The exported term is

badFalse : False := (Wrapper.mk True.intro).p

where Wrapper : Prop has a single field p : False, so Wrapper.mk expects a proof of False but is given True.intro : True.

A sound checker must reject this. A checker that types a projection by inferring (rather than checking) its structure argument — i.e. that trusts the structure to be well-typed instead of verifying the constructor's argument types against its binders — will accept it, because Wrapper.mk True.intro still formally inhabits Wrapper at the structural level, and the p projection is then read back out at the declared field type False.

Test result: 🚫 declined · exit code 2 · wall time: 63 ms · instructions: 495.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/9 arena=35
DIAG decl 8 name=badFalse kind=2 r=2 peak=36 delta=1 fuel=8 infer_u=7 deq_full=1 deq_one=1 cong_hit=0 cong_ft=0 ld_iter=1 whnf_nd=2 dfull{app=0,lf=0,prj=0,pi=0,eta=0,lf=1,ee=0,pr=0} tags=[0,1,4,1,0,0,0,0,1,0,0,0,0,0,0,0]

Test "sparse-name-index"

Expected: 👍 accept · Size: 292 B · Lines: 4 · lean4export: 0.1.0 · Lean: 4.29.1 · 📄 Declaration

Lean4export will create internalization-table references contiguously in order: in references for names, il references for levels, and ie references for expressions all work this way.

However, the spec merely requires that these are integers. It's reasonable for an implementation to assume these are approximately dense (and to treat them as array indices instead of hashtable entries), but a kernel should handle skipped indices or out-of-order indices.

This test checks that a kernel doesn't require internalization-table references to be assigned sequentially starting from 1. If the "2" and "4" were replaced by "1" and "0", respectively, this would be the expected encoding of axiom foo : Prop. This encoding should be equivalent.

Test result: 👍 accepted · exit code 0 · wall time: 49 ms · instructions: 299.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=5

Test "std"

Expected: 👍 accept · Size: 526.1 MB · Lines: 10.0 M · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The complete Std library export from Lean 4.

This test contains the standard library extensions beyond core Lean 4, including:

  • Enhanced data structures (HashMap, RBTree, etc.)
  • Additional mathematical operations
  • Extended list and array operations
  • Utility functions and theorems

This represents a medium-sized test case, larger than core modules but smaller than Mathlib, making it useful for performance testing.

Test result: 💥 error · exit code 124 · wall time: 30.1 s · instructions: 337.0 G · max rss memory: 379.2 MB

Test "tutorial/001_basicDef"

Expected: 👍 accept · Size: 367 B · Lines: 6 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Basic definition

Test result: 👍 accepted · exit code 0 · wall time: 45 ms · instructions: 299.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/002_badDef"

Expected: ✋ reject · Size: 365 B · Lines: 6 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Mismatched types

Test result: ✋ rejected · exit code 1 · wall time: 46 ms · instructions: 281.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2
FAIL decl 0 name=badDef kind=1

Test "tutorial/003_arrowType"

Expected: 👍 accept · Size: 622 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Arrow type (function type)

Test result: 👍 accepted · exit code 0 · wall time: 47 ms · instructions: 300.4 M · max rss memory: 7.7 MB

stdout:
Checking decl 0/1 arena=3

Test "tutorial/004_dependentType"

Expected: 👍 accept · Size: 460 B · Lines: 7 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Dependent type (forall)

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 300.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=3

Test "tutorial/005_constType"

Expected: 👍 accept · Size: 897 B · Lines: 17 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Lambda expression

Test result: 👍 accepted · exit code 0 · wall time: 49 ms · instructions: 301.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=6

Test "tutorial/006_betaReduction"

Expected: 👍 accept · Size: 1.3 KB · Lines: 27 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Lambda reduction

Test result: 👍 accepted · exit code 0 · wall time: 49 ms · instructions: 325.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=13

Test "tutorial/007_betaReduction2"

Expected: 👍 accept · Size: 1.4 KB · Lines: 28 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Lambda reduction under binder

Test result: 👍 accepted · exit code 0 · wall time: 47 ms · instructions: 326.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=14

Test "tutorial/008_forallSortWhnf"

Expected: 👍 accept · Size: 1.2 KB · Lines: 25 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The binding domain of a forall may need to be reduce before it is a sort

Test result: 👍 accepted · exit code 0 · wall time: 47 ms · instructions: 325.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=13

Test "tutorial/009_forallSortBad"

Expected: ✋ reject · Size: 1.2 KB · Lines: 26 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The binding domain of a forall has to be a sort

Test result: ✋ rejected · exit code 1 · wall time: 52 ms · instructions: 307.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=14
FAIL decl 1 name=forallSortBad kind=1

Test "tutorial/010_nonTypeType"

Expected: ✋ reject · Size: 1.1 KB · Lines: 21 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The type of a declaration has to be a type, not some other expression

Test result: ✋ rejected · exit code 1 · wall time: 47 ms · instructions: 305.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=8
FAIL decl 1 name=nonTypeType kind=1

Test "tutorial/011_nonPropThm"

Expected: ✋ reject · Size: 424 B · Lines: 7 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The type of a theorem has to be a proposition

Test result: ✋ rejected · exit code 1 · wall time: 45 ms · instructions: 281.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=3
FAIL decl 0 name=nonPropThm kind=2

Test "tutorial/012_levelComp1"

Expected: 👍 accept · Size: 391 B · Lines: 7 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Some level computation

Test result: 👍 accepted · exit code 0 · wall time: 73 ms · instructions: 299.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/013_levelComp2"

Expected: 👍 accept · Size: 409 B · Lines: 8 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Some level computation

Test result: 👍 accepted · exit code 0 · wall time: 45 ms · instructions: 299.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/014_levelComp3"

Expected: 👍 accept · Size: 427 B · Lines: 9 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Some level computation

Test result: 👍 accepted · exit code 0 · wall time: 55 ms · instructions: 299.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/015_levelParams"

Expected: 👍 accept · Size: 1.4 KB · Lines: 29 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level parameters

Test result: 👍 accepted · exit code 0 · wall time: 48 ms · instructions: 326.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=13

Test "tutorial/016_tut06_bad01"

Expected: ✋ reject · Size: 427 B · Lines: 8 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Duplicate universe parameters

Test result: ✋ rejected · exit code 1 · wall time: 47 ms · instructions: 281.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2
FAIL decl 0 name=tut06_bad01 kind=1

Test "tutorial/017_levelComp4"

Expected: 👍 accept · Size: 424 B · Lines: 8 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Some level computation

Test result: 👍 accepted · exit code 0 · wall time: 45 ms · instructions: 299.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/018_levelComp5"

Expected: 👍 accept · Size: 424 B · Lines: 8 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Some level computation

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 299.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/019_imax1"

Expected: 👍 accept · Size: 809 B · Lines: 16 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type inference for forall using imax

Test result: 👍 accepted · exit code 0 · wall time: 45 ms · instructions: 301.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=6

Test "tutorial/020_imax2"

Expected: 👍 accept · Size: 828 B · Lines: 17 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type inference for forall using imax

Test result: 👍 accepted · exit code 0 · wall time: 65 ms · instructions: 301.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=6

Test "tutorial/021_levelMaxComm"

Expected: 👍 accept · Size: 524 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level equality: max is commutative (max u v ≈ max v u).

Test result: 👍 accepted · exit code 0 · wall time: 61 ms · instructions: 300.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/022_levelMaxAssoc"

Expected: 👍 accept · Size: 623 B · Lines: 16 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level equality: max is associative (max (max u v) w ≈ max u (max v w)).

Test result: 👍 accepted · exit code 0 · wall time: 45 ms · instructions: 301.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/023_levelMaxIdem"

Expected: 👍 accept · Size: 447 B · Lines: 9 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level equality: max is idempotent (max u u ≈ u).

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 300.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/024_levelMaxAbsorb"

Expected: 👍 accept · Size: 526 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level equality: max absorption (max u (max u v) ≈ max u v).

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 300.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2

Test "tutorial/025_inferVar"

Expected: 👍 accept · Size: 713 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type inference of local variables

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 301.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=7

Test "tutorial/026_defEqLambda"

Expected: 👍 accept · Size: 1.4 KB · Lines: 26 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Definitional equality between lambdas

Test result: 👍 accepted · exit code 0 · wall time: 65 ms · instructions: 305.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=15

Test "tutorial/027_peano1"

Expected: 👍 accept · Size: 3.6 KB · Lines: 73 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Peano arithmetic: 2 = 2

Test result: 👍 accepted · exit code 0 · wall time: 56 ms · instructions: 445.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/7 arena=41

Test "tutorial/028_peano2"

Expected: 👍 accept · Size: 4.5 KB · Lines: 90 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Peano arithmetic: 1 + 1 = 2

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 472.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=55

Test "tutorial/029_peano3"

Expected: 👍 accept · Size: 4.9 KB · Lines: 98 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Peano arithmetic: 2 * 2 = 4

Test result: 👍 accepted · exit code 0 · wall time: 63 ms · instructions: 518.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=59

Test "tutorial/030_letType"

Expected: 👍 accept · Size: 489 B · Lines: 9 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type checking a non-dependent let

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 300.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=4

Test "tutorial/031_letTypeDep"

Expected: 👍 accept · Size: 1.2 KB · Lines: 26 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type checking a dependent let

Test result: 👍 accepted · exit code 0 · wall time: 48 ms · instructions: 346.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=11

Test "tutorial/032_letRed"

Expected: 👍 accept · Size: 627 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reducing a let

Test result: 👍 accepted · exit code 0 · wall time: 46 ms · instructions: 322.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=5

Test "tutorial/033_empty"

Expected: 👍 accept · Size: 1.2 KB · Lines: 20 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A simple empty inductive type

Test result: 👍 accepted · exit code 0 · wall time: 48 ms · instructions: 347.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=9

Test "tutorial/034_boolType"

Expected: 👍 accept · Size: 2.3 KB · Lines: 37 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A simple enumeration inductive type

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 396.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=22

Test "tutorial/035_twoBool"

Expected: 👍 accept · Size: 4.2 KB · Lines: 65 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A simple product type

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 472.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=43

Test "tutorial/036_andType"

Expected: 👍 accept · Size: 3.2 KB · Lines: 57 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A parametrized product type (no level parameters)

Test result: 👍 accepted · exit code 0 · wall time: 52 ms · instructions: 381.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=41

Test "tutorial/037_prodType"

Expected: 👍 accept · Size: 3.8 KB · Lines: 76 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A parametrized product type (with level parameters)

Test result: 👍 accepted · exit code 0 · wall time: 64 ms · instructions: 385.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=47

Test "tutorial/038_pprodType"

Expected: 👍 accept · Size: 3.8 KB · Lines: 75 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A parametrized product type (with more general level parameters)

Test result: 👍 accepted · exit code 0 · wall time: 51 ms · instructions: 384.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=47

Test "tutorial/039_pUnitType"

Expected: 👍 accept · Size: 1.8 KB · Lines: 31 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Level-polymorphic unit type

Test result: 👍 accepted · exit code 0 · wall time: 83 ms · instructions: 372.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=16

Test "tutorial/040_eqType"

Expected: 👍 accept · Size: 3.2 KB · Lines: 62 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Equality, as an important indexed non-recursive data type

Test result: 👍 accepted · exit code 0 · wall time: 51 ms · instructions: 381.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=42

Test "tutorial/041_natDef"

Expected: 👍 accept · Size: 3.3 KB · Lines: 61 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A recursive inductive data type

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 402.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=36

Test "tutorial/042_rbTreeDef"

Expected: 👍 accept · Size: 15.7 KB · Lines: 296 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A recursive indexed data type

Test result: 👍 accepted · exit code 0 · wall time: 75 ms · instructions: 690.8 M · max rss memory: 8.0 MB

stdout:
Checking decl 0/14 arena=248

Test "tutorial/043_inductBadNonSort"

Expected: ✋ reject · Size: 1.2 KB · Lines: 20 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive type with a non-sort type

Test result: ✋ rejected · exit code 1 · wall time: 47 ms · instructions: 306.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=7
FAIL decl 1 name=inductBadNonSort kind=5

Test "tutorial/044_inductBadNonSort2"

Expected: ✋ reject · Size: 598 B · Lines: 8 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Another inductive type with a non-sort type

Test result: ✋ rejected · exit code 1 · wall time: 47 ms · instructions: 303.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/2 arena=2
FAIL decl 1 name=inductBadNonSort2 kind=5

Test "tutorial/045_inductLevelParam"

Expected: ✋ reject · Size: 515 B · Lines: 7 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with duplicate level params

Test result: ✋ rejected · exit code 1 · wall time: 45 ms · instructions: 281.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=1
FAIL decl 0 name=inductLevelParam kind=5

Test "tutorial/046_inductTooFewParams"

Expected: ✋ reject · Size: 548 B · Lines: 6 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with too few parameters in the type

Test result: ✋ rejected · exit code 1 · wall time: 46 ms · instructions: 282.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/1 arena=2
FAIL decl 0 name=inductTooFewParams kind=5

Test "tutorial/047_inductWrongCtorParams"

Expected: ✋ reject · Size: 1.2 KB · Lines: 16 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with a constructor with wrong parameters

Test result: ✋ rejected · exit code 1 · wall time: 51 ms · instructions: 349.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=7
FAIL decl 3 name=inductWrongCtorParams kind=5

Test "tutorial/048_inductWrongCtorResParams"

Expected: ✋ reject · Size: 1.3 KB · Lines: 19 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with a constructor with wrong parameters in result (they are swapped)

Test result: ✋ rejected · exit code 1 · wall time: 50 ms · instructions: 329.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=11
FAIL decl 2 name=inductWrongCtorResParams kind=5

Test "tutorial/049_inductWrongCtorResLevel"

Expected: ✋ reject · Size: 1.4 KB · Lines: 23 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with a constructor with wrong level parameters in result (they are swapped)

Test result: ✋ rejected · exit code 1 · wall time: 50 ms · instructions: 329.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=11
FAIL decl 2 name=inductWrongCtorResLevel kind=5

Test "tutorial/050_inductInIndex"

Expected: ✋ reject · Size: 1.1 KB · Lines: 14 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A constructor with an unexpected occurrence of the type in index position of a return type.

Test result: ✋ rejected · exit code 1 · wall time: 51 ms · instructions: 349.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=6
FAIL decl 3 name=inductInIndex kind=5

Test "tutorial/051_indNeg"

Expected: ✋ reject · Size: 996 B · Lines: 12 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The classic example of an inductive with negative recursive occurrence

Test result: ✋ rejected · exit code 1 · wall time: 49 ms · instructions: 327.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=5
FAIL decl 2 name=indNeg kind=5

Test "tutorial/052_reduceCtorParam.mk"

Expected: 👍 accept · Size: 4.1 KB · Lines: 80 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

When checking inductives, we expect the kernel to reduce the types of constructor arguments.

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 407.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=54

Test "tutorial/053_reduceCtorType.mk"

Expected: ✋ reject · Size: 1.5 KB · Lines: 26 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

When checking inductives, we expect the kernel to not reduce the type of the constructor itself; that should be all manifest foralls

Test result: ✋ rejected · exit code 1 · wall time: 61 ms · instructions: 351.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=13
FAIL decl 3 name=reduceCtorType kind=5

Test "tutorial/054_indNegReducible"

Expected: ✋ reject · Size: 1.9 KB · Lines: 31 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

When checking inductives, we expect the kernel to not reduce the type of the constructor parameters further than head normal form. Recursive occurrences nested inside the head normal form are considered negative occurrences, even if they could be reduced to disappear.

Test result: ✋ rejected · exit code 1 · wall time: 54 ms · instructions: 374.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=14
FAIL decl 4 name=indNegReducible kind=5

Test "tutorial/055_predWithTypeField"

Expected: 👍 accept · Size: 2.0 KB · Lines: 32 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive proposition can have constructors with fields of arbitrary level.

Test result: 👍 accepted · exit code 0 · wall time: 52 ms · instructions: 373.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=20

Test "tutorial/056_typeWithTypeField"

Expected: 👍 accept · Size: 2.1 KB · Lines: 36 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive type can have fields of level up to that of the inductive.

Test result: 👍 accepted · exit code 0 · wall time: 50 ms · instructions: 373.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=21

Test "tutorial/057_typeWithTypeFieldPoly"

Expected: 👍 accept · Size: 2.1 KB · Lines: 38 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive type can have fields of level up to that of the inductive (polymorphic variant).

Test result: 👍 accepted · exit code 0 · wall time: 44 ms · instructions: 374.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=21

Test "tutorial/058_typeWithTooHighTypeField.mk"

Expected: ✋ reject · Size: 943 B · Lines: 11 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive type can have fields of from higher universes.

Test result: ✋ rejected · exit code 1 · wall time: 50 ms · instructions: 327.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=4
FAIL decl 2 name=typeWithTooHighTypeField kind=5

Test "tutorial/059_emptyRec"

Expected: 👍 accept · Size: 1.2 KB · Lines: 21 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 47 ms · instructions: 347.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/3 arena=10

Test "tutorial/060_boolRec"

Expected: 👍 accept · Size: 3.0 KB · Lines: 53 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 52 ms · instructions: 400.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=32

Test "tutorial/061_twoBoolRec"

Expected: 👍 accept · Size: 4.8 KB · Lines: 78 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 475.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=50

Test "tutorial/062_andRec"

Expected: 👍 accept · Size: 3.2 KB · Lines: 58 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 67 ms · instructions: 382.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=42

Test "tutorial/063_prodRec"

Expected: 👍 accept · Size: 4.0 KB · Lines: 79 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 69 ms · instructions: 387.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=49

Test "tutorial/064_pprodRec"

Expected: 👍 accept · Size: 4.0 KB · Lines: 78 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 51 ms · instructions: 387.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=48

Test "tutorial/065_punitRec"

Expected: 👍 accept · Size: 2.2 KB · Lines: 39 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 50 ms · instructions: 373.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=18

Test "tutorial/066_eqRec"

Expected: 👍 accept · Size: 3.3 KB · Lines: 63 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 51 ms · instructions: 382.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=43

Test "tutorial/067_nRec"

Expected: 👍 accept · Size: 3.3 KB · Lines: 61 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 402.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=36

Test "tutorial/068_rbTreeRef"

Expected: 👍 accept · Size: 16.2 KB · Lines: 303 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor

Test result: 👍 accepted · exit code 0 · wall time: 77 ms · instructions: 698.5 M · max rss memory: 8.0 MB

stdout:
Checking decl 0/14 arena=254

Test "tutorial/069_boolPropRec"

Expected: 👍 accept · Size: 2.3 KB · Lines: 34 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Inductive predicates eliminate into Prop if they have more than one constructor.

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 396.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=22

Test "tutorial/070_existsRec"

Expected: 👍 accept · Size: 3.6 KB · Lines: 66 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Inductive predicates eliminate into Prop if they have one constructors and it carries data.

Test result: 👍 accepted · exit code 0 · wall time: 52 ms · instructions: 384.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=45

Test "tutorial/071_sortElimPropRec"

Expected: 👍 accept · Size: 5.6 KB · Lines: 97 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Inductive predicates eliminate into Sort if they have one constructors and it carries data, but the data is known from the type, e.g. a parameter or an index

Test result: 👍 accepted · exit code 0 · wall time: 61 ms · instructions: 482.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=69

Test "tutorial/072_sortElimProp2Rec"

Expected: 👍 accept · Size: 6.6 KB · Lines: 114 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Inductive predicates eliminate into Sort if they have one constructors and it carries data, but the data is known from the type, e.g. a parameter or an index. However, it must occur directly in the result type, with no intervening reduction.

Test result: 👍 accepted · exit code 0 · wall time: 62 ms · instructions: 510.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/9 arena=83

Test "tutorial/073_boolRecEqns"

Expected: 👍 accept · Size: 10.8 KB · Lines: 199 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of Bool.rec

Test result: 👍 accepted · exit code 0 · wall time: 68 ms · instructions: 576.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=133

Test "tutorial/074_prodRecEqns"

Expected: 👍 accept · Size: 10.1 KB · Lines: 205 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of Prod.rec

Test result: 👍 accepted · exit code 0 · wall time: 60 ms · instructions: 487.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/7 arena=127

Test "tutorial/075_nRecReduction"

Expected: 👍 accept · Size: 12.7 KB · Lines: 238 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A proof relying on the reduction behavior of N.rec

Test result: 👍 accepted · exit code 0 · wall time: 82 ms · instructions: 631.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/13 arena=170

Test "tutorial/076_listRecReduction"

Expected: 👍 accept · Size: 17.5 KB · Lines: 335 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of List.rec

Test result: 👍 accepted · exit code 0 · wall time: 75 ms · instructions: 689.2 M · max rss memory: 7.9 MB

stdout:
Checking decl 0/14 arena=256

Test "tutorial/077_RBTree.id_spec"

Expected: 👍 accept · Size: 47.9 KB · Lines: 1.0 k · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of RBTree.rec

Test result: 👍 accepted · exit code 0 · wall time: 104 ms · instructions: 1.0 G · max rss memory: 8.5 MB

stdout:
Checking decl 0/19 arena=878

Test "tutorial/078_And.right"

Expected: 👍 accept · Size: 4.3 KB · Lines: 74 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type-checking simple projection functions

Test result: 👍 accepted · exit code 0 · wall time: 55 ms · instructions: 410.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=55

Test "tutorial/079_Prod.snd"

Expected: 👍 accept · Size: 4.5 KB · Lines: 83 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type-checking projection functions with parameters

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 412.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=57

Test "tutorial/080_PProd.snd"

Expected: 👍 accept · Size: 4.5 KB · Lines: 83 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type-checking projection functions

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 412.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=57

Test "tutorial/081_PSigma.snd"

Expected: 👍 accept · Size: 5.1 KB · Lines: 96 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type-checking dependent projection functions

Test result: 👍 accepted · exit code 0 · wall time: 55 ms · instructions: 415.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=65

Test "tutorial/082_projOutOfRange"

Expected: ✋ reject · Size: 3.8 KB · Lines: 67 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Out of range projection

Test result: ✋ rejected · exit code 1 · wall time: 58 ms · instructions: 366.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=48
FAIL decl 3 name=projOutOfRange kind=1

Test "tutorial/083_projNotStruct"

Expected: ✋ reject · Size: 3.5 KB · Lines: 64 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projection out something that is not a structure

Test result: ✋ rejected · exit code 1 · wall time: 54 ms · instructions: 384.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=38
FAIL decl 4 name=projNotStruct kind=1

Test "tutorial/084_projProp1"

Expected: 👍 accept · Size: 8.2 KB · Lines: 143 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition

The lean kernel allows projections out of propositions if they precede all dependent data fields.

Test result: 👍 accepted · exit code 0 · wall time: 75 ms · instructions: 541.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=103

Test "tutorial/085_projProp2"

Expected: ✋ reject · Size: 8.2 KB · Lines: 143 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition

The lean kernel disallows data projections out of propositional structures.

Test result: ✋ rejected · exit code 1 · wall time: 81 ms · instructions: 522.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=103
FAIL decl 9 name=projProp2 kind=1

Test "tutorial/086_projProp3"

Expected: 👍 accept · Size: 8.2 KB · Lines: 143 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition

The lean kernel allows projections out of propositions if they precede all dependent data fields. Non-dependent data fields are not relevant.

Test result: 👍 accepted · exit code 0 · wall time: 65 ms · instructions: 541.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=103

Test "tutorial/087_projProp4"

Expected: ✋ reject · Size: 8.2 KB · Lines: 143 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition

The lean kernel disallows data projections out of propositional structures.

Test result: ✋ rejected · exit code 1 · wall time: 70 ms · instructions: 522.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=103
FAIL decl 9 name=projProp4 kind=1

Test "tutorial/088_projProp5"

Expected: ✋ reject · Size: 8.4 KB · Lines: 148 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition

The lean kernel disallows proof projections out of propositional structures that depend on data.

Test result: ✋ rejected · exit code 1 · wall time: 64 ms · instructions: 523.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=108
FAIL decl 9 name=projProp5 kind=1

Test "tutorial/089_projProp6"

Expected: ✋ reject · Size: 8.2 KB · Lines: 143 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out of a proposition.

The lean kernel rejects any projections out of a proposition that come after a dependent data field, even if that is not used by the present projection.

Test result: ✋ rejected · exit code 1 · wall time: 65 ms · instructions: 522.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/10 arena=103
FAIL decl 9 name=projProp6 kind=1

Test "tutorial/090_projDataIndexRec"

Expected: 👍 accept · Size: 6.8 KB · Lines: 111 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The recursor for ProjDataIndex allows elimination into sort.

Test result: 👍 accepted · exit code 0 · wall time: 65 ms · instructions: 552.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=72

Test "tutorial/091_projIndexData"

Expected: ✋ reject · Size: 6.8 KB · Lines: 111 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out data is not allowed, even if this data appears as an index and the recursor would allow it.

Test result: ✋ rejected · exit code 1 · wall time: 85 ms · instructions: 533.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=72
FAIL decl 10 name=projIndexData kind=1

Test "tutorial/092_projIndexData2"

Expected: ✋ reject · Size: 6.8 KB · Lines: 111 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projecting out data is not allowed, even if this data appears as an index and the recursor would allow it.

This also forbids projecting out proofs that follow such fields.

Test result: ✋ rejected · exit code 1 · wall time: 90 ms · instructions: 533.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=72
FAIL decl 10 name=projIndexData2 kind=1

Test "tutorial/093_projRed"

Expected: 👍 accept · Size: 9.9 KB · Lines: 177 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Projection reductions

Test result: 👍 accepted · exit code 0 · wall time: 71 ms · instructions: 616.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/13 arena=131

Test "tutorial/094_ruleK"

Expected: 👍 accept · Size: 6.5 KB · Lines: 121 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Rule k for Eq: The recursor reduces even if the major argument is not a constructor, as long replacing the major argument with a constructor is type correct.

Test result: 👍 accepted · exit code 0 · wall time: 52 ms · instructions: 486.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=83

Test "tutorial/095_ruleKbad"

Expected: ✋ reject · Size: 6.5 KB · Lines: 121 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Rule k for Eq should not fire if the types of the major argument do not match that of the constructor.

Test result: ✋ rejected · exit code 1 · wall time: 61 ms · instructions: 468.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=83
FAIL decl 7 name=ruleKbad kind=2

Test "tutorial/096_ruleKAcc"

Expected: ✋ reject · Size: 12.8 KB · Lines: 238 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Rule k should not fire for Acc.

Test result: ✋ rejected · exit code 1 · wall time: 71 ms · instructions: 577.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=189
FAIL decl 10 name=ruleKAcc kind=2

Test "tutorial/097_aNatLit"

Expected: 👍 accept · Size: 3.0 KB · Lines: 54 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Type checking Nat literals

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 401.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=37

Test "tutorial/098_natLitEq"

Expected: 👍 accept · Size: 6.1 KB · Lines: 114 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reducing Nat literals

Test result: 👍 accepted · exit code 0 · wall time: 60 ms · instructions: 485.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=84

Test "tutorial/099_proofIrrelevance"

Expected: 👍 accept · Size: 5.0 KB · Lines: 100 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Proof irrelevance: every Prop is a subsingleton, if p : Prop then all elements of p are definitionally equal.

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 412.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=66

Test "tutorial/100_proofIrrelevanceBad"

Expected: ✋ reject · Size: 4.7 KB · Lines: 93 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Proof irrelevance is limited to Prop: if p : Type, then all elements of p are not definitionally equal.

Test result: ✋ rejected · exit code 1 · wall time: 53 ms · instructions: 393.6 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=67
FAIL decl 4 name=proofIrrelevanceBad kind=1

Test "tutorial/101_proofIrrelevanceWhnf"

Expected: 👍 accept · Size: 5.6 KB · Lines: 112 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Proof irrelevance: if p : A and A is definitionally equal to Prop, then all elements of p are still definitionally equal. Just applying proof irrelevance at Sort 0 isn't sufficient.

Test result: 👍 accepted · exit code 0 · wall time: 56 ms · instructions: 437.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/6 arena=74

Test "tutorial/102_unitEta1"

Expected: 👍 accept · Size: 6.2 KB · Lines: 116 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Unit eta

Test result: 👍 accepted · exit code 0 · wall time: 57 ms · instructions: 505.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/9 arena=77

Test "tutorial/103_unitEta2"

Expected: 👍 accept · Size: 5.9 KB · Lines: 109 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Unit eta

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 482.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=73

Test "tutorial/104_unitEta3"

Expected: 👍 accept · Size: 6.0 KB · Lines: 111 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Unit eta

Test result: 👍 accepted · exit code 0 · wall time: 78 ms · instructions: 482.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=75

Test "tutorial/105_structEta"

Expected: 👍 accept · Size: 12.5 KB · Lines: 230 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Structure eta

Test result: 👍 accepted · exit code 0 · wall time: 73 ms · instructions: 635.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/13 arena=173

Test "tutorial/106_funEta"

Expected: 👍 accept · Size: 5.2 KB · Lines: 104 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Function eta for non-dependent functions.

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 414.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=71

Test "tutorial/107_funEtaDep"

Expected: 👍 accept · Size: 5.3 KB · Lines: 106 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Function eta for dependent functions (pi types).

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 415.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=73

Test "tutorial/108_funEtaBad"

Expected: ✋ reject · Size: 4.9 KB · Lines: 97 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Eta should not identify functions with different bodies.

Test result: ✋ rejected · exit code 1 · wall time: 53 ms · instructions: 373.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=64
FAIL decl 3 name=funEtaBad kind=2

Test "tutorial/109_etaRuleK"

Expected: ✋ reject · Size: 6.5 KB · Lines: 121 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Corner case for function eta: Does a defeq between a partially applied recursor with rule k and a free variable trigger eta expansion?

Taking the official kernel as the specification, the answer is no. See https://github.com/leanprover/lean4/issues/12520 for a discussion.

Test result: ✋ rejected · exit code 1 · wall time: 60 ms · instructions: 467.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=85
FAIL decl 7 name=etaRuleK kind=1

Test "tutorial/110_etaCtor"

Expected: ✋ reject · Size: 9.0 KB · Lines: 148 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Corner case for function eta: Does a defeq between a partially applied constructor trigger eta expansion?

Taking the official kernel as the specification, the answer is no. See https://github.com/leanprover/lean4/issues/12520 for a discussion.

Test result: ✋ rejected · exit code 1 · wall time: 74 ms · instructions: 633.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/15 arena=104
FAIL decl 14 name=etaCtor kind=1

Test "tutorial/111_reflOccLeft"

Expected: ✋ reject · Size: 3.7 KB · Lines: 61 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Rejection: recursive occurrence on the left of an arrow, behind further arrows inside a constructor argument.

The constructor argument is a function type Nat → (I → Nat).

Test result: ✋ rejected · exit code 1 · wall time: 58 ms · instructions: 430.4 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/7 arena=41
FAIL decl 6 name=reflOccLeft kind=5

Test "tutorial/112_reflOccInIndex"

Expected: ✋ reject · Size: 3.9 KB · Lines: 66 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Rejection: recursive occurrence in index position, behind a further arrow.

We build an indexed inductive I : Type → Type with a constructor argument Nat → I (I α), so the recursive occurrence appears as an index argument.

Test result: ✋ rejected · exit code 1 · wall time: 59 ms · instructions: 431.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/7 arena=45
FAIL decl 6 name=reflOccInIndex kind=5

Test "tutorial/113_reduceCtorParamRefl.mk"

Expected: 👍 accept · Size: 4.5 KB · Lines: 88 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

When checking inductives, we expect the kernel to reduce the types of constructor arguments in all positive positions.

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 410.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=62

Test "tutorial/114_reduceCtorParamRefl2.mk"

Expected: 👍 accept · Size: 4.5 KB · Lines: 88 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

When checking inductives, we expect the kernel to reduce the types of constructor arguments in all positive positions.

Test result: 👍 accepted · exit code 0 · wall time: 53 ms · instructions: 410.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/5 arena=62

Test "tutorial/115_rTreeRec"

Expected: 👍 accept · Size: 5.5 KB · Lines: 91 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of the generated recursor.

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 502.2 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/9 arena=60

Test "tutorial/116_rtreeRecReduction"

Expected: 👍 accept · Size: 10.8 KB · Lines: 193 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of RTree.rec on RTree.mk.

Test result: 👍 accepted · exit code 0 · wall time: 73 ms · instructions: 641.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/14 arena=136

Test "tutorial/117_accRecType"

Expected: 👍 accept · Size: 7.5 KB · Lines: 151 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of Acc.rec.

Test result: 👍 accepted · exit code 0 · wall time: 54 ms · instructions: 411.9 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/4 arena=124

Test "tutorial/118_accRecReduction"

Expected: 👍 accept · Size: 13.4 KB · Lines: 252 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Acc.rec reduces on Acc.intro.

Test result: 👍 accepted · exit code 0 · wall time: 69 ms · instructions: 604.0 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=202

Test "tutorial/119_accRecNoEta"

Expected: ✋ reject · Size: 13.0 KB · Lines: 244 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Acc.rec does not have structure eta.

Test result: ✋ rejected · exit code 1 · wall time: 70 ms · instructions: 578.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/11 arena=195
FAIL decl 10 name=accRecNoEta kind=2

Test "tutorial/120_quotMkType"

Expected: 👍 accept · Size: 6.3 KB · Lines: 123 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of Quot.mk.

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 484.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=87

Test "tutorial/121_quotIndType"

Expected: 👍 accept · Size: 6.3 KB · Lines: 124 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of Quot.ind.

Test result: 👍 accepted · exit code 0 · wall time: 101 ms · instructions: 484.8 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=88

Test "tutorial/122_quotLiftType"

Expected: 👍 accept · Size: 6.3 KB · Lines: 124 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of Quot.lift.

Test result: 👍 accepted · exit code 0 · wall time: 59 ms · instructions: 485.1 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=88

Test "tutorial/123_quotSoundType"

Expected: 👍 accept · Size: 7.2 KB · Lines: 141 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Asserting the type of Quot.sound.

Test result: 👍 accepted · exit code 0 · wall time: 62 ms · instructions: 511.5 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/9 arena=103

Test "tutorial/124_quotLiftReduction"

Expected: 👍 accept · Size: 7.8 KB · Lines: 153 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of Quot.lift on Quot.mk.

Test result: 👍 accepted · exit code 0 · wall time: 61 ms · instructions: 497.3 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=116

Test "tutorial/125_quotIndReduction"

Expected: 👍 accept · Size: 7.6 KB · Lines: 151 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Reduction behavior of Quot.ind on Quot.mk.

Test result: 👍 accepted · exit code 0 · wall time: 60 ms · instructions: 495.7 M · max rss memory: 7.8 MB

stdout:
Checking decl 0/8 arena=115

Test "tutorial/126_dup_defs"

Expected: ✋ reject · Size: 475 B · Lines: 7 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Two definitions with the same name

Test result: ✋ rejected · exit code 1 · wall time: 46 ms · instructions: 280.8 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/127_dup_ind_def"

Expected: ✋ reject · Size: 1.7 KB · Lines: 27 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A definition and a constructor with the same name

Test result: ✋ rejected · exit code 1 · wall time: 45 ms · instructions: 287.9 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/128_dup_ctor_def"

Expected: ✋ reject · Size: 1.7 KB · Lines: 27 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A definition and a constructor with the same name

Test result: ✋ rejected · exit code 1 · wall time: 46 ms · instructions: 287.8 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/129_dup_rec_def"

Expected: ✋ reject · Size: 1.7 KB · Lines: 27 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A definition and a recursor with the same name

Test result: ✋ rejected · exit code 1 · wall time: 47 ms · instructions: 287.8 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/130_misnamed_rec_user"

Expected: ✋ reject · Size: 2.0 KB · Lines: 33 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

The name of the recursor for misnamed_rec must be misnamed_rec.rec: another name (like misnamed_rec.not_rec) should be rejected. dupRecUser is included so that checkers that recreate the recursor (as misnamed_rec.rec) rather than validating it still fail, because misnamed_rec_user references misnamed_rec.not_rec.

Test result: ✋ rejected · exit code 1 · wall time: 48 ms · instructions: 289.2 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/131_dup_rec_def2"

Expected: ✋ reject · Size: 1.7 KB · Lines: 28 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

Even if a kernel doesn't catch a recursor for dup_rec_def2 that is misnamed as dup_rec_def2.not_rec, it should catch some other constant being given the name dup_rec_def2.rec that is reserved for the recursor.

Test result: ✋ rejected · exit code 1 · wall time: 49 ms · instructions: 287.9 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/132_dup_ctor_rec"

Expected: ✋ reject · Size: 1.5 KB · Lines: 24 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

A constructor and a recursor with the same name

Test result: ✋ rejected · exit code 1 · wall time: 46 ms · instructions: 287.1 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata

Test "tutorial/133_DupConCon"

Expected: ✋ reject · Size: 2.2 KB · Lines: 35 · lean4export: 3.1.0 · Lean: 4.29.1 · 📄 Declaration · 🔗 Source

An inductive with two constructors with the same name

Test result: ✋ rejected · exit code 1 · wall time: 45 ms · instructions: 290.8 M · max rss memory: 7.7 MB

stderr:
error: duplicate or invalid declaration metadata