certo
GitHub

The work before the proof

Between having a mathematical idea and having a proof of it there is a lot of work that is not proving. certo does that work — and every step comes back with a certificate anyone can re-check without trusting certo.

CLI + MCP 46 commands 47 certificate kinds milliseconds, not hours MIT

Start with the failure it exists to catch

This is the clearest way to explain what certo is for.

Here is the shape of a Lean theorem. It has no sorry. It audits clean on #print axioms[propext, Classical.choice, Quot.sound], everything a formalisation is supposed to look like.

theorem main (dens : ℝ)
    (dens_high : dens ≥ 3/4)      -- the regime the paper works in
    (sparse    : dens ≤ 1/2)      -- ...and a bound from section 2
    : conclusion := by
  linarith [dens_high, sparse]

It is also about nothing. Its hypotheses contradict each other, so it would have proved any goal at all. A user had two modules like it. Another line produced four.

#print axioms certifies “I did not cheat.” It says nothing about “this is not hollow.” No proof assistant checks that your hypotheses were satisfiable, because that is not what a proof assistant is for.

certo asks that question directly, and answers it in milliseconds:

$ certo prove regime.py
PROVED -- symbolic and universal under the hypotheses  [unsat]
  VACUOUS: these hypotheses contradict each other, so this goal -- and
  every other goal -- follows. The proof is valid and says nothing.
  The clash is: dens_high, kappa_small

Note the second line. It does not just say “empty” — it names the minimal clashing set, so the next question is already answered. And the flag travels in the certificate, so it keeps saying so months later, when only the artefact remains.

The idea: a verdict you can re-check

A verdict you cannot re-check is a rumour.

Every command writes an artefact. Most of them re-check with nothing but arithmetic — no Z3, no CBC, nothing to take on trust:

$ certo verify out/lp.json
VALID  lp_dual certificate (verified without a solver)
  [ok] primal feasibility (A x <= b)
  [ok] dual feasibility (A^T y >= c)
  [ok] exact strong duality (c.x == b.y)  (c.x=25/2 | b.y=25/2)
  EXACT rational arithmetic, no tolerances

That matters for two different people. For you, it is a safety net: if the solver had a bug, the certificate would not verify and you would get ERROR, not PROVED. For whoever reads your paper, it is the difference between an assertion and something they can check on their own machine without running your code.

Tamper-evident

Edit a dual's objective by hand and verify catches it. Every quantity is recomputed, never read back — a payload nobody recomputes is a payload anybody can edit.

The warnings travel too

A vacuous proof keeps saying it is vacuous. A sweep keeps saying what it did not certify. That is the half that ages.

The arc

Six things you do between an idea and a proof.

Two minutes

pip install "certo-math[mcp,numerics]"

certo core examples/amgm.py
PROVED -- symbolic and universal under the hypotheses  [unsat]
  hypotheses needed: a_pos, b_pos, c_pos | redundant: noise

A spec is ordinary Python. There is no bespoke language, because an LLM writes Python far better than it writes SMT-LIB:

import z3
from certo import Spec

def spec():
    a, b, c = z3.Reals("a b c")
    s = Spec()
    s.assume("a_pos", a > 0)      # NAMED: core reports on them
    s.assume("b_pos", b > 0)
    s.assume("c_pos", c > 0)
    s.claim((a+b)*(b+c)*(a+c) >= 8*a*b*c)
    return s

Find the command by the question

Read the question, not the name. certo commands prints this in your terminal, in your language.

You want to askCommand
Is this claim true under these hypotheses?prove
Which of my hypotheses does it actually need?core
Does every hypothesis earn its place, or is my theorem overstated?audit
Is my regime non-empty at all?check --hypotheses-only
What is the optimum, exactly?opt
Does this term decay in n, or is it Θ(1)?order
I checked it for p = 5..12. Does it hold for every p?parametric
Does it hold for every graph on n vertices?sweep
A thousand failures — how many objects is that?sweep --witnesses
“By symmetry” — is that step actually sound here?reduce
How do I assemble my lemmas into one proof?compose
Is this spec well-posed, before I spend the compute?lint

All forty-three, each with what it does not establish, in the command reference.

What it does not do

This matters as much as the command list.

The hard limit is asymptotic statements with quantifiers over n. The ladder, with Ramsey numbers:

Questioncerto?
Is R(3,3) ≤ 6?Yes. cases, a 23-line DRAT proof, verified
Is R(3,3) = 6?Yes. bisect, certified on both sides
Is R(5,5) ≤ 48?Not in practice. Finite, but the space is 2903
Does R(k,k)1/k converge?No, in principle. Asymptotic: not expressible

certo is not a proof assistant — that is Lean, Rocq or Isabelle — nor a computer algebra catalogue. It is the layer before: discover objects, destroy false formulations and minimise hypotheses before paying the cost of formalising them.

The division of labour, in a user's words after a real session: certo finds and certifies the small trades; the human proof explains why they assemble globally without double-counting.

El trabajo previo a la demostración

Entre tener una idea matemática y tener una demostración de ella hay mucho trabajo que no es demostrar. certo hace ese trabajo — y cada paso vuelve con un certificado que cualquiera puede re-comprobar sin fiarse de certo.

CLI + MCP 46 comandos 47 tipos de certificado milisegundos, no horas MIT

Empieza por el fallo que existe para atrapar

Es la forma más clara de explicar para qué sirve certo.

Esta es la forma de un teorema en Lean. No tiene ningún sorry. Sale limpio en #print axioms[propext, Classical.choice, Quot.sound], todo lo que una formalización debe parecer.

theorem main (dens : ℝ)
    (dens_high : dens ≥ 3/4)      -- el régimen en el que trabaja el paper
    (sparse    : dens ≤ 1/2)      -- ...y una cota de la sección 2
    : conclusion := by
  linarith [dens_high, sparse]

Y además no habla de nada. Sus hipótesis se contradicen, así que habría demostrado cualquier objetivo. Un usuario tenía dos módulos así. Otra línea produjo cuatro.

#print axioms certifica «no hice trampa». No dice nada sobre «esto no está hueco». Ningún asistente de demostración comprueba que tus hipótesis fueran satisfacibles, porque no es para lo que sirve un asistente de demostración.

certo hace esa pregunta directamente, y la responde en milisegundos:

$ certo prove regime.py --lang es
DEMOSTRADO -- simbólico y universal bajo las hipótesis  [unsat]
  VACUA: estas hipótesis se contradicen, así que este objetivo --y
  cualquier otro-- se sigue. La demostración es válida y no dice nada.
  El choque es: dens_high, kappa_small

Fíjate en la segunda línea. No dice solo «vacío»: nombra el conjunto minimal que choca, así que la siguiente pregunta ya está respondida. Y la marca viaja en el certificado, así que lo sigue diciendo meses después, cuando solo queda el artefacto.

La idea: un veredicto que puedes re-comprobar

Un veredicto que no puedes re-comprobar es un rumor.

Cada comando escribe un artefacto. La mayoría se re-comprueban con nada más que aritmética — sin Z3, sin CBC, nada que haya que creerse:

$ certo verify out/lp.json
VÁLIDO  certificado lp_dual (verificado sin solver)
  [ok] factibilidad primal (A x <= b)
  [ok] factibilidad dual (A^T y >= c)
  [ok] dualidad fuerte exacta (c.x == b.y)  (c.x=25/2 | b.y=25/2)
  aritmética racional EXACTA, sin tolerancias

Eso importa a dos personas distintas. Para ti es una red de seguridad: si el solver tuviera un fallo, el certificado no verificaría y obtendrías ERROR, no DEMOSTRADO. Para quien lea tu paper es la diferencia entre una aseveración y algo que puede comprobar en su propia máquina sin ejecutar tu código.

Delatan la manipulación

Edita a mano el objetivo de un dual y verify lo atrapa. Cada cantidad se recalcula, nunca se lee: una carga útil que nadie recalcula es una que cualquiera puede editar.

Los avisos también viajan

Una demostración vacua sigue diciendo que es vacua. Un barrido sigue diciendo qué no certificó. Esa es la mitad que envejece.

El arco

Seis cosas que haces entre una idea y una demostración.

Dos minutos

pip install "certo-math[mcp,numerics]"

certo core examples/amgm.py --lang es
DEMOSTRADO -- simbólico y universal bajo las hipótesis  [unsat]
  hipótesis necesarias: a_pos, b_pos, c_pos | redundantes: noise

Un spec es Python normal. No hay lenguaje propio, porque un LLM escribe Python mucho mejor de lo que escribe SMT-LIB:

import z3
from certo import Spec

def spec():
    a, b, c = z3.Reals("a b c")
    s = Spec()
    s.assume("a_pos", a > 0)      # NOMBRADAS: core informa sobre ellas
    s.assume("b_pos", b > 0)
    s.assume("c_pos", c > 0)
    s.claim((a+b)*(b+c)*(a+c) >= 8*a*b*c)
    return s

Busca el comando por la pregunta

Lee la pregunta, no el nombre. certo commands imprime esto en tu terminal, en tu idioma.

Lo que quieres preguntarComando
¿Es cierta esta afirmación bajo estas hipótesis?prove
¿Qué hipótesis necesita realmente?core
¿Cada hipótesis se gana su lugar, o mi teorema está sobreenunciado?audit
¿Mi régimen es no vacío siquiera?check --hypotheses-only
¿Cuál es el óptimo, exactamente?opt
¿Decae este término en n, o es Θ(1)?order
Lo comprobé para p = 5..12. ¿Vale para todo p?parametric
¿Vale para todo grafo de n vértices?sweep
Mil fallos. ¿Cuántos objetos son?sweep --witnesses
«Por simetría»: ¿ese paso es correcto aquí?reduce
¿Cómo ensamblo mis lemas en una demostración?compose
¿Está bien planteado este spec, antes de gastar el cómputo?lint

Los cuarenta y tres, cada uno con lo que no establece, en la referencia de comandos.

Qué no hace

Esto importa tanto como la lista de comandos.

El límite duro son los enunciados asintóticos con cuantificadores sobre n. La escalera, con números de Ramsey:

Pregunta¿certo?
¿R(3,3) ≤ 6?Sí. cases, una prueba DRAT de 23 líneas, verificada
¿R(3,3) = 6?Sí. bisect, certificado por ambos lados
¿R(5,5) ≤ 48?En la práctica no. Finito, pero el espacio es 2903
¿Converge R(k,k)1/k?No, en principio. Asintótico: no expresable

certo no es un asistente de demostración —eso es Lean, Rocq o Isabelle— ni un catálogo de álgebra computacional. Es la capa anterior: descubrir objetos, destruir formulaciones falsas y minimizar hipótesis antes de pagar el coste de formalizarlas.

La división del trabajo, en palabras de un usuario tras una sesión real: certo encuentra y certifica los intercambios pequeños; la demostración humana explica por qué se ensamblan globalmente sin doble conteo.