La matemática tiene fantasmas
(overreacted.io)- Lean es un lenguaje de programación diseñado para formalizar matemáticas, y permite que los matemáticos manejen los teoremas matemáticos como si fueran código.
- Los usuarios escriben teoremas, pruebas y axiomas, entre otros, en formato de código, y el proceso de prueba se lleva a cabo mediante un conjunto de comandos llamado tactic.
- Aunque se puede cerrar provisionalmente una prueba con
sorryaunque aún no esté terminada, esto es una prueba falsa similar alanyde TypeScript. - Si se agregan axiomas de forma incorrecta (por ejemplo,
2 = 3), surge el riesgo de contradicción lógica y de la posibilidad de probar cualquier enunciado. - Lean solo obtiene conclusiones sobre los axiomas elegidos y el sistema de pruebas lógicamente válido, por lo que preservar la validez matemática es de gran importancia.
Lean: un lenguaje para trabajar la matemática como código
- Lean es un lenguaje de programación especializado en escribir matemáticas formalizadas.
- Los matemáticos usan Lean para expresar la matemática como código y estructurar sus teoremas y demostraciones para poder colaborar y compartirlos.
- Plantea un futuro en el que una gran parte del conocimiento matemático de la humanidad podría volverse código para verificación y composición mecánica.
Primeros pasos en una prueba en Lean
- Es posible declarar un teorema simple en Lean como
theorem two_eq_two : 2 = 2 := by sorry. - Cuando la prueba no está completa, se usa
sorry, pero es solo un recurso temporal y no una prueba real.sorrypasa la verificación de pruebas de Lean, pero lógicamente no se puede considerar confiable.
- Para una prueba completa se usan táctica como
rfl(reflexividad) para demostrar una igualdad trivial como2 = 2. - Lo que ya se ha demostrado puede reutilizarse en otros teoremas con
exact, destacando la modularidad.
Axiomas y contradicción: cuando la matemática está embrujada
- Si se agrega un axioma como
axiom math_is_haunted : 2 = 3, Lean lo tratará como verdadero. - Ese axioma puede luego aplicarse en procesos de prueba y permite demostrar conclusiones matemáticamente imposibles (por ejemplo,
2 + 2 = 6). - Es posible usar la táctica
rewritepara sustituir2por3y terminar el procedimiento de demostración conrfl. - Si un axioma inadecuado provoca contradicción, en Lean se llega a un estado donde todas las proposiciones son demostrables (colapso lógico).
- En realidad, a principios del siglo XX, paradojas como la de Russell provocaron una revisión profunda de los fundamentos matemáticos debido a contradicciones en sistemas axiomáticos.
- Lean muestra claramente que la elección de los axiomas es decisiva para mantener la validez de un sistema lógico.
Lean como verificador de pruebas (proof checker)
- Si los axiomas se eligen bien y Lean es lógicamente correcto, ofrece conclusiones con fiabilidad teórica.
- Verifica desde igualdades simples hasta teoremas muy complejos (por ejemplo, el Último Teorema de Fermat) siguiendo los mismos principios.
- Un gran teorema se completa como un árbol en el que la estructura total se va armando a partir de la acumulación repetida de pruebas de subestructuras y teoremas.
- Como ejemplo, existe un proyecto a gran escala para formalizar el Último Teorema de Fermat en Lean, y se espera que finalmente se complete un sistema de prueba formal sin pruebas provisionales (
sorry).
El placer de aprender Lean
- Hacer pruebas con Lean es una combinación creativa de programación y matemáticas.
- Al principio se trata de aprender a probar proposiciones simples, y luego, gradualmente, el proceso de construir matemáticas cada vez más complejas y profundas con rigurosidad se vuelve una gran fuente de disfrute.
- Los tutoriales oficiales y recursos comunitarios (por ejemplo, Natural Numbers Game, Mathematics in Lean, entre otros) son adecuados para empezar.
- Al usar Lean, al formalizar la lógica por uno mismo, se puede redescubrir la belleza de ideas y argumentos ingeniosos.
- Finalmente se concluye que, con o sin una razón aparente, para cierto tipo de personas Lean brinda una diversión especial.
1 comentarios
Comentarios en Hacker News
rfl, por ejemplo) son demasiado amplias, y ni siquiera con tutoriales es fácil captar su significado exacto. Por ejemplo, en C puedes rastrear cambios de estado hasta el nivel de bits, pero Lean se siente medio difuso. Y la sintaxis de la tácticarewrite(rw) también me parece poco naturalrewriteno funcionaba por razones difíciles de explicar (supongo que por un tema con definiciones de estructuras intermedias). En cambio, Metamath y la base de datos set.mm hacen que pruebes todo sin tactics, solo con inferencia concreta (usando reglas comoax-mp), aunque eso tampoco es fácil porque entonces tienes que memorizar un montón de lemas utilitariosrewriteno te parece natural, me da curiosidad: ¿qué forma derewritete parecería natural?reflectionyrewriteserían más fundamentales que la suma. Lean trae suma incorporada, pero parece que tienes que escribirrflorewritecada vez. Supongo que quizá exista alguna versión con algo tipo prelude que automatice esorw [x]. En el editor puedes ver el estado de cada línea, pero hay que estar haciendo clic todo el tiempo y se rompe el flujo. Si en Python no hubiera sangría y hubiera que hacer clic para entender el flujo mirando solo la estructura de bloques, sería parecido. Puede que desde mi perspectiva eso se deba a que al inicio del juego las órdenes están muy limitadas, pero me pregunto si en un entorno completo de Lean ese flujo mejoraby ...usando una tactic. No sé si Lean tiene algo así, pero al menos podría servirte como palabra clave de búsqueda o como tema para preguntar en el foro de Leanintrosignifica entrar a un cuantificador, queconstructorsignifica dividir el goal, etc. Al final, las tactics son una especie de macro/DSL que construye un árbol de prueba (term tree). Cuando veo código de prueba, lo siento como manipulación de árboles (dividir piezas, llenar huecos en orden, etc.). Aun así, sigue siendo cierto que para saber exactamente qué afirma una assertion a mitad del código todavía tienes que hacer clic. Las pruebas con buenas ideas se pueden leer con claridad, como la progresión lógica de un artículo. Por eso, quien quiere transmitir intención termina escribiendo con nombres legibles, una progresión clara, extrayendo lemas pequeños y poniendo primero las hipótesis para resolver luego con pruebas cortas. En cambio, las partes que mecánicamente son fastidiosas pero que a ojos del matemático son obvias suelen resolverse con “golfing” (hacerlo lo más corto posible). Ese estilo golf a menudo acorta el código, pero solo toca las partes que el humano capta intuitivamente. En resumen: en Lean la estructura de lectura es implícita, aunque hay maneras de hacerla más clara, y mientras más dominas las tactics, mejor captas la estructura sin necesidad de hacer clic. A veces basta con recorrer los nombres de los lemas para entender el flujo general, y el orden puede reconstruirse con facilidadLa comunidad de Lean se reúne mucho en Zulip, y en el canal Machine-Learning-for-Theorem-Proving puedes revisar varios hilos de referencia
sorryque dejaron vacías en los ejercicios (mis soluciones están aquí)sorry) o la introducción continua de axiomas adicionales. Por ejemplo, ¿se puede comprobar que “esta proof no usasorryde ninguna manera” y que “depende solo del poder demostrativo de un conjunto fijo de axiomas”?#print axioms some_theoremmencionado al final del artículo podría ser justo el ejemplo que buscas. Con eso puedes ver si la prueba depende directa o indirectamente desorryo de axiomas no revisadosprint axiomspara verificar que no se hayan agregado axiomas extra. Y también puedes fijarte en si compila sin warnings ni errores. La utilidad SafeVerify también detecta algunos trucos que encontraron sistemas de RL