docs← Back to article

Markdown for LLMs

Lean: the divisibility-instances run

The source Markdown for this article. Copy it into your assistant or download it as a text file.

Download this articlePlain text ↗
# Lean: the divisibility-instances run

**Result:** 14 divisibility cases were checked on 2 October 2026 with
Lean 4.33.0 (toolchain `leanprover/lean4:v4.33.0`) on one side and the
Arxo package `mathlib.divisibility` with `law` 0.1.1 on the other:
10 match, 3 not comparable, 0 mismatch, 1 not checked. The Lean side ran
on the core library; mathlib statements were not executed. The mathlib
statements themselves are pinned at revision
`db584cd6d46c92f209a44c0f1c829460d327499d`, and the Arxo side anchors its
provenance to that same pin at the text level — but no mathlib file was
executed on either side in this run. The numbers belong to these versions
and to these 14 cases only.

## The task and the reference

The reference is a set of mathlib theorem statements about divisibility
and order (`dvd_trans`, `dvd_refl`, a semigroup projection, `le_trans`,
`le_of_lt`, `le_less_trans`), pinned at the revision above. The two sides
do deliberately different work with them. Lean proves each numeric
instance with its kernel: a term the kernel accepts, with the axioms
printed and inspected. Arxo applies the imported statement to the data
and returns an evaluation document with a proof graph reaching the pinned
mathlib text — the proof itself stays in the source; what Arxo certifies
is the application of an accepted result to the facts at hand. The public
pages of the two references are [Lean](https://lean-lang.org/) and
[mathlib](https://github.com/leanprover-community/mathlib4).

## What "agreement" means here

A case matches when both sides settle the same instance: Lean with an
accepted proof term, Arxo with a supporting evaluation document — or when
both sides honestly refuse it. A case is not comparable when the two
sides answer different questions by contract design: Arxo permission
facts have no counterpart in Lean, so those cases cannot meet. Pairwise
equality of proof objects is never required; what is compared is the
verdict on the instance, plus the honesty of refusals.

## Results

| Case | Instance | Lean 4.33.0 core | Arxo | Outcome |
|---|---|---|---|---|
| N-01 | transitivity with witnesses | proved (`Nat.dvd_trans` with witnesses) | TRUE_ONLY | match |
| N-02 | reflexivity at 5 | proved (`Nat.dvd_refl 5`) | TRUE_ONLY | match |
| N-03 | semigroup projection | not executed (no core analogue) | TRUE_ONLY | not checked |
| N-04 | missing premise | refusal shown by unclosed-placeholder analogue | NEITHER with reason | match as honest-refusal class |
| N-05 | missing premise | refusal shown by the same analogue | NEITHER with reason | match as honest-refusal class |
| N-06 | permission fact absent | proved as N-01 (Lean has no permission mechanism) | NEITHER with reason | not comparable by design |
| N-07 | permission fact absent | proved as N-02 (Lean has no permission mechanism) | NEITHER with reason | not comparable by design |
| N-08 | small instance by computation | proved by `decide` | TRUE_ONLY | match: both sides compute the witnesses |
| N-09 | 4 divides 6 (false) | positive goal refuted; negation proved | NEITHER with reason | match as honest-refusal class |
| N-10 | 0 divides 6 (false) | positive goal unprovable; negation proved | NEITHER with reason | match as honest-refusal class |
| N-11 | order transitivity | proved (`Nat.le_trans`), no axioms | TRUE_ONLY | match |
| N-12 | less-implies-less-or-equal | proved (`Nat.le_of_lt`), no axioms | TRUE_ONLY | match |
| N-13 | composed order step | proved by `omega` (core has no name for it) | TRUE_ONLY | match, with the naming note |
| N-14 | permission fact absent | proved as N-11 (Lean has no permission mechanism) | NEITHER with reason | not comparable by design |

Nowhere in the run is there a placeholder axiom or a native-code shortcut:
`sorry` and native decision procedures were not used, and every printed
axiom list shows core and standard axioms only.

## Where the two systems behave differently

There are no mismatches; the systematic difference is structural. Lean
has no permission mechanism, so the three permission cases (N-06, N-07,
N-14) are proved on the Lean side exactly like their unguarded twins
while Arxo answers NEITHER for the missing permission fact — by contract
design these cases are not comparable rather than decided. Refusals also
differ in form while agreeing as a class: an elaborator error on the Lean
side (N-04, N-05) and a rejected positive goal with a proved negation
(N-09, N-10) stand next to an Arxo NEITHER with a stated reason. The
contract counts the class, not the shape.

## Where the model stops

The mathlib file of the stand (`dvd_trans`, `dvd_refl`, the semigroup
projection, the order lemmas at the pinned revision) was written and its
texts were checked against the package sources, but it was never
executed: a full mathlib checkout with its build cache (about 6 to 10 GB)
did not fit the shared machine, so it was not downloaded. That is the one
recorded deviation of the run, and case N-03 carries its cost as
not checked — the projection has no core-library analogue. Beyond that:
only natural-number instances were exercised, and no timing or memory
figures were taken. Agreement on 14 instances is not a claim about either
language as a whole.

## Reproducing the run

Pin both sides: Lean toolchain `leanprover/lean4:v4.33.0` with the core
stand files (the core file must succeed; the refusals file must fail to
elaborate — that failure is the expected observation), and Arxo package
`mathlib.divisibility` with `law` 0.1.1, whose case package answers all
14 cases. Pin the text both sides point at: mathlib revision
`db584cd6d46c92f209a44c0f1c829460d327499d`. A full mathlib execution of
the stand remains a separate task for a machine with a free disk; until
then N-03 stays not checked.