cert-machine · report · generated from the records

Does an AI’s Lean proof prove the right statement? One command to check

A Lean proof can be correct and still prove the wrong thing. Lean’s kernels check the proof; this tool checks the statement, with exact tests instead of a reader’s opinion. Two AI-written refutations of Erdős problems, waiting on Google DeepMind’s list of open problems, went through it.

the proof the claimant’s Lean, pinned 1 · is the proof correct? Lean, leanchecker and nanoda all accept, on both claims only the three standard axioms the statement DeepMind’s, from its declaration 2 · is it the right statement? the kernel accepts the proof against it, exactly 16 of 16 wrong statements refused · 10 of 10 rewordings accepted on #488, 2,205 small cases agree with Erdős’s sentence
the proof the claimant’s Lean, pinned 1 · is the proof correct? Lean, leanchecker and nanoda all accept, on both claims only the three standard axioms the statement DeepMind’s, from its declaration 2 · is it the right statement? the kernel accepts the proof against it, exactly 16 of 16 wrong statements refused · 10 of 10 rewordings accepted on #488, 2,205 small cases agree with Erdős’s sentence
Lean’s kernels answer the first question. The second is the one this tool adds: the same statement, wrong ones refused, and the statement compared with the problem’s own words on small cases.Records: certs/lean-intake-erdos-488.json · sha256 3d55fa1fe80a; certs/lean-intake-erdos-786i.json · sha256 98066cbd66c4
claims checked
2
Erdős #488 and #786(i)
planted wrong statements refused
16 of 16
and 10 of 10 rewordings accepted
planted defects caught
7 of 7
a false step, a sorry, an axiom, native_decide
a fresh claim, rules to record
51 min
on a laptop

The mathematics is the claimants’ (Declan Gessel’s, with OpenAI’s GPT-6 Astra, for both refutations); the statements are Google DeepMind’s. This page checks their proofs against those statements. The tool is mine, built with Claude (Anthropic).

read this first

What it does not decide

does the check work?

Every planted test came out as it should

Each run tests the check itself. Wrong versions of the statement are planted (a dropped hypothesis, a changed constant, a shifted interval) and must be refused; rewordings of the same statement must be accepted; broken copies of the proof must be caught. One square per test; hover for what it was.

wrong statements must be refused #488 W01: the statement as it read before 2026-10-14: answer(sorry) ↔ … (the 11-06 run's Ctl1) — REFUSED by type mismatch #488 W02: the constant 2 changed to 3 (the 11-06 run's Ctl2) — REFUSED by type mismatch #488 W03: m > n changed to m ≥ n (the 11-06 run's Ctl3) — REFUSED by type mismatch #488 W04: the strict < of the conclusion made ≤ — REFUSED by type mismatch #488 W05: the hypothesis 1 ∉ A dropped — REFUSED by type mismatch #488 W06: the hypothesis 0 ∉ A dropped — REFUSED by type mismatch #488 W07: A.max ≤ n made strict, A.max < n — REFUSED by type mismatch #488 W09: the set B starts at 2: n ≥ 2 for n ≥ 1 — REFUSED by type mismatch #488 W10: the left denominator m replaced by n — REFUSED by type mismatch #488 W11: the left interval widened to Icc 1 (m + 1) (added by amendment 2, after the first run, to keep ten wrong controls) — REFUSED by type mismatch #786(i) W01: the hypothesis 0 ∉ A dropped — REFUSED by type mismatch #786(i) W02: 1 - ε < δ made 1 - ε ≤ δ — REFUSED by type mismatch #786(i) W03: ε ≤ 1 made strict, ε < 1 — REFUSED by type mismatch #786(i) W04: the bar 1 - ε changed to 1 - 2 * ε — REFUSED by type mismatch #786(i) W05: the density δ replaced by δ / 2 — REFUSED by type mismatch #786(i) W06: 0 ∉ A replaced by 1 ∉ A — REFUSED by type mismatch 16 of 16 the same, reworded must be accepted #488 S0: the canonical statement copied verbatim (the baseline) — ACCEPTED #488 S1: m > n written as an explicit n < m hypothesis (GT.gt is reducible notation for LT.lt) — ACCEPTED #488 S2: every bound variable renamed (A→S, B→D, n→k, m→l, a→d) — ACCEPTED #488 S3: the letI B inlined at both uses (zeta) — ACCEPTED #488 S4: 0 ∉ A written ¬ (0 ∈ A) (the notation's own unfolding) — ACCEPTED #488 W08: the interval Icc 1 m shifted to Icc 0 m (left side only) — RECLASSIFIED by amendment 2: 0 is not in B (n ≥ 1), so the two filtered intervals are definitionally equal (rfl, amendment-2/why.lean); the pre-registration's class was wrong, not the check — ACCEPTED #786(i) S0: the canonical statement copied verbatim — ACCEPTED #786(i) S1: the binder predicate written out: ∀ ε : ℝ, ε > 0 → … — ACCEPTED #786(i) S2: every bound variable renamed (ε→e, A→S, δ→d) — ACCEPTED #786(i) S3: the claimant's own wording of the proposition: 0 < ε and nested ∃ (GT.gt is reducible notation) — ACCEPTED 10 of 10 equivalent by an argument refused: the limit #488 E1: the left interval starts at 2: the same statement only because 1 ∉ A is a hypothesis, not by definition (added by amendment 2: a probe of F1's limit — identity up to definitional unfolding, not logical equivalence) — REFUSED by type mismatch #786(i) E1: the first two conjuncts swapped: the same statement logically, not definitionally — REFUSED by type mismatch #786(i) E2: the existential quantifiers swapped, ∃ (δ : ℝ) (A : Set ℕ): the same logically, not definitionally — REFUSED by type mismatch 3 of 3 defects in the proofs must be caught #488 R1: 4096 replaced by 1000 everywhere: a false arithmetic claim — caught: the build fails: Tactic decide proved that the proposition #488 R2: a sorry in constant_ratio — caught: the axioms list sorryAx #488 R3: an added axiom — caught: the axioms list Submissions.ErdosMultiplesSmoothRefuted.Counterexample.intakeRedAxiom #488 R4: native_decide in endpoint_gap — caught: the axioms list Submissions.ErdosMultiplesSmoothRefuted.Counterexample.FiniteGrowth.endpoint_gap._native.native_decide.ax_1_1 #786(i) R1: the witness ε = 1/16 changed to 1/2: the final step becomes false (δ > 1/2 does not contradict δ ≤ 7/8) — caught: the build fails: linarith failed to find a contradiction #786(i) R2: the final step replaced by sorry — caught: the axioms list sorryAx #786(i) R3: the key lemma made an axiom (its proof kept under another name) — caught: the axioms list density_le_seven_eighths 7 of 7 filled: refused or caught · hollow: accepted · in each row, #488 first, then #786(i)
The planted tests of both runs. The three filled squares in the third row are the stated limit: statements that are logically the same but differ by more than unfolding a definition are refused.Records: certs/lean-intake-erdos-488.json · sha256 3d55fa1fe80a; certs/lean-intake-erdos-786i.json · sha256 98066cbd66c4The build refuses this figure if a planted statement or defect is not as expected.
Erdős #488

DeepMind’s statement against Erdős’s sentence

Erdős asked whether, for a finite set A and B the numbers with a divisor in A, |B ∩ [1,m]|/m < 2|B ∩ [1,n]|/n always holds for m > n ≥ max(A). Gessel’s proof refutes DeepMind’s Lean version of it; this run reached the same verdicts as a separate hand-built check of 6 November.

Then the new check: Lean evaluated DeepMind’s statement part by part on 3,024 small cases (the kernel confirmed every value), and a program written from Erdős’s sentence alone evaluated the same cases.

0 1,000 2,000 3,024 agree: 2,205 divide by zero: 819 differ: 20 all with A = {0} small cases (A ⊆ {0, …, 5}, n below 6, m below 8)
Every part agrees wherever Erdős’s sentence makes sense. The 20 cases where the whole statements differ all have A = {0}: B is empty there, the sentence reads 0 < 0 and is false as written. DeepMind’s statement adds the hypothesis 0 ∉ A for exactly this (their pull request #256); the check found the reason without being told.Records: certs/lean-intake-erdos-488.json · sha256 3d55fa1fe80a; instruments/intake/erdos-488.js · sha256 a2dc8058927bThe build refuses this figure if the cases stop adding up, or a disagreement is not one with A = {0}.
Erdős #786(i)

A claim the tool had not seen

Part (i) asks whether some set of density above 1 − ε has all its equal products of equal length. Gessel’s refutation (pull request #5299, open since 6 September) states its own versions of the two definitions it needs. The kernel accepts it against DeepMind’s declaration as it stands today, so the definitions match.

It also turned up one thing for the pull request: DeepMind reworded this statement on 14 October, so the change no longer applies and GitHub reports a conflict. The proof still refutes the current statement.

17:24 17:34 17:44 17:54 18:04 18:14 rules spec committed 17:24 tool fixed 17:58 runs record recorded 18:15 · 51 min time, UTC (9 November 2026)
From the spec committed to the record, on a laptop. The first run found a defect in the tool (its test files missed one line of DeepMind’s file); it was fixed and the planted statements run again, with no statement or expectation changed.Records: certs/lean-intake-erdos-786i.json · sha256 98066cbd66c4; corpus/lean-intake/erdos-786i/runs/2026-11-09/_status.txt · sha256 16a5b9f23555The build refuses this figure if the clock falls out of order.
what I got wrong

Four corrections, made in the open

Each spec was committed before its run, and each correction is a dated amendment beside the first outcome.

check it yourself

Re-run it

contact

Write to Carlos

Sent by Web3Forms to Carlos’s inbox; nothing stored here.

Or write to carlos@carlostoledo.co, or open the public pilot form on GitHub.