¿Por qué no usar simplemente Lean?
(lawrencecpaulson.github.io)- La historia de la formalización matemática no empezó con Lean, y desde hace casi 60 años varios linajes de sistemas ya habían acumulado técnicas clave y resultados importantes
- Herramientas como AUTOMATH de 1968, la familia LCF, HOL, Rocq, ACL2 y Mizar lograron una amplia gama de formalizaciones, desde análisis real hasta el teorema de los números primos, el teorema de los cuatro colores y la conjetura de Kepler
- Lean construyó rápidamente definiciones de matemática moderna apoyándose en una gran biblioteca y una comunidad activa, pero propositions as types y los tipos dependientes no son el único camino para un proof assistant
- Isabelle destaca por su automatización fuerte, alta legibilidad y por evitar los tipos dependientes, manteniendo la tradición LCF de construir la verificación de pruebas con la barrera de abstracción del kernel incluso sin proof objects
- A medida que la IA también entra en el flujo de traducción de pruebas estructuradas entre distintos sistemas, la presión por ver una sola herramienta como estándar absoluto podría seguir disminuyendo
Sistemas iniciales y otros linajes
-
AUTOMATH
- AUTOMATH ya incluía en 1968 la mayoría de los elementos necesarios para la formalización matemática
- En 1977, Jutting formalizó con AUTOMATH Foundations of Analysis de Landau, y trató desde lógica pura hasta la construcción de los números complejos
- Usó clases de equivalencia y conjuntos de números racionales, y también demostró formalmente la completitud de Dedekind de la recta real
- Este logro no volvió a verse en 20 años, y recién a mediados de los años 90 reapareció la formalización de los reales en HOL Light de John Harrison y en Isabelle/HOL de Jacques Fleuriot
- La notación era muy incómoda y no había ninguna automatización, por lo que las pruebas eran largas y difíciles de leer
- Aun así, considera que en el manejo de clases de equivalencia era mejor que Rocq, y que, a diferencia del infierno de setoids que sufren los usuarios de Rocq, Jutting realizó la formalización de clases de equivalencia con calma y solidez
-
Boyer y Moore
- La computational logic de la línea de Robert Boyer, J Moore nació con el objetivo de verificar código, no matemática
- Esta dirección apareció por primera vez en el artículo de 1973 Proving theorems about LISP functions
- Aunque tenía límites claros para la matemática general, también se usó para formalizar resultados profundos como el teorema de incompletitud de Gödel, la reciprocidad cuadrática y el teorema de Banach–Tarski
- Su linaje actual, ACL2, se aplica sobre todo a la verificación de hardware
La corriente posterior a LCF
- Edinburgh LCF se centró en teoría de lenguajes de programación, pero la idea de usar un lenguaje funcional como metalenguaje de un asistente de pruebas se difundió ampliamente
- Varios grupos en Cambridge, INRIA, Cornell y otros lugares usaron ML para crear herramientas como las primeras versiones de HOL, Coq (hoy Rocq) y Nuprl
- El grupo HOL se concentró en la verificación de hardware, pero la verificación de hardware de punto flotante hizo necesaria el análisis real
- John Harrison demostró en la familia HOL resultados matemáticos de peso como el teorema de los números primos mediante la fórmula integral de Cauchy
- Bajo el objetivo de verificar la mayor cantidad posible de los 100 theorems, HOL Light solía ubicarse entre los primeros lugares
- Hasta 2014, los sistemas de este linaje habían formalizado varios teoremas avanzados
- teorema de los cuatro colores
- odd order theorem
- consistencia relativa del axioma de elección
- segundo teorema de incompletitud de Gödel
- conjetura de Kepler de Tom Hales
- En general, estos teoremas tenían pruebas largas y complejas, y el trabajo de formalización también fue de gran escala, cumpliendo un papel clave para reducir dudas que seguían presentes en los teoremas
El ascenso de la comunidad Lean
- Los matemáticos consideraban que los logros previos de formalización no alcanzaban construcciones sofisticadas de la matemática moderna dominante como los Grothendieck schemes o los perfectoid spaces
- Tom Hales eligió avanzar construyendo esas definiciones como biblioteca, enfocándose más en la acumulación de definiciones que en las pruebas, y optó por Lean
- Presentó esta dirección en el programa Big Proof, donde también se discutieron ideas similares
- Kevin Buzzard escuchó esto y decidió probar Lean en la enseñanza, lo que aceleró luego su expansión
- Como punto de inflexión importante de la comunidad Lean, se destaca que se alejó de la obsesión por la prueba constructiva que dominó durante mucho tiempo en Rocq
- El intuicionismo surgió tras la paradoja de Russell y también tuvo implicaciones específicas sobre el concepto de número real
- La teoría de tipos de Martin-Löf es claramente un formalismo intuicionista, pero se señala que Rocq no puede verse de forma tan simple
- Aun así, en artículos relacionados con Rocq la prueba constructiva aparecía repetidamente incluso en contextos donde era irrelevante o carente de sentido, y se considera que esa tendencia frenó el uso matemático de Rocq y terminó cediendo espacio a Lean
propositions as types y la diferencia con LCF
- Propositions as types es una dualidad que conecta los símbolos lógicos ∀, ∃, →, ∧, ∨ con los constructores de tipos Π, Σ, →, ×, +
- Este marco es bello y teóricamente productivo, pero no es el único camino
- Si se limita un proof assistant a software que verifica pruebas según el principio de propositions as types, gran parte de la investigación del último medio siglo queda fuera de la definición
- En ese caso, solo quedarían Rocq, Lean y Agda
- Incluso AUTOMATH no es un caso de propositions as types: aunque tiene elementos parecidos a Π y →, la lógica se establece como axiomas, como en un texto normal de lógica
- De Bruijn ya veía hace 50 años la necesidad de separar tipos y proposiciones
- Un ejemplo representativo es que la división debe recibir tres argumentos, y el valor de (x/y) dependería de una prueba de (y \ne 0), por lo que se necesita proof irrelevance
- También subraya que la idea de que el enfoque LCF es lo mismo que propositions as types no corresponde a los hechos
- Rocq y Lean tienen Prop, el sort de las proposiciones, donde todos los objetos de prueba de una misma proposición se evalúan como el mismo valor, aportando así proof irrelevance
- Eso no significa que los enormes objetos de prueba desaparezcan; en el sistema real siguen estando ahí
- El hallazgo central de Robin Milner fue que en LCF no hacen falta objetos de prueba en sí mismos
- Si el kernel de prueba se coloca dentro de un tipo de datos abstracto de ML y las reglas de inferencia se usan como constructores, las pruebas pueden verificarse dinámicamente
- Gracias a la abstraction barrier de ML, se considera imposible hacer trampa
- Que términos gigantes ocupen decenas de MB aunque no indiquen nada resulta especialmente irracional en la era de RAMmageddon
- También critica que incluso se siga investigando cómo volver más elegantes esos términos innecesarios
Razones para elegir Isabelle
- Si tus colegas usan Lean, la especialización del equipo también está en Lean y las bibliotecas previas necesarias existen en Lean, lo natural es usar Lean
- Aun así, si se puede elegir libremente, hay razones claras para considerar Isabelle
-
Automatización
- Se destaca su automatización más potente, y sostiene que incluso comparado con los “hammer” de uso cotidiano, nada se compara con sledgehammer
- Añade que el área de álgebra computacional también merece tratarse por separado
-
Legibilidad
- La presenta como la mejor opción en legibilidad, apoyándose en ejemplos sobre Isar
-
Evitar tipos dependientes
- Como no tiene tipos dependientes, evita niveles de universos y varias rarezas que complican la vida de principiantes
- Señala que incluso en mathlib de Lean y en SSReflect y Mathematical Components de Rocq no se recomienda usar tipos dependientes
- La dificultad central de los tipos dependientes es que, si se implementan correctamente, la verificación de tipos en sí misma se vuelve indecidible
- Esto se debe a que la decisión de igualdad es indecidible, y se indica que al principio esto se aceptaba como algo natural
- Desde alrededor de 1990, el consenso se movió hacia rebajar la igualdad a definitional/intensional equality para hacer decidible la verificación de tipos
- Como resultado, (T(N+1)) y (T(1+N)) se convierten en tipos distintos
- Estas limitaciones afectan las pruebas reales, y la verificación de definitional equality sigue teniendo una carga computacional considerable
Matemática moderna posible incluso sin tipos dependientes
- Indica que en 2017 era mucho más cauteloso respecto a qué matemáticas podría abarcar Isabelle
- En ese momento, parecía fácil pensar que para tratar temas como los siguientes los tipos dependientes eran imprescindibles
- Sin embargo, a través de la investigación relacionada con Alexandria, dice haber aprendido mucho, y resume que la clave es no empujar todo dentro de los tipos
Dirección futura e IA
- Lean está acertando en muchas cosas y, al admitir incluso bloques de prueba anidados, potencialmente puede convertirse en un lenguaje de pruebas lo bastante legible
- Ahora la comunidad Lean tiene que usar de verdad esas funciones, mientras que los usuarios de Isabelle ya suelen hacerlo
- Más importante que un objeto de prueba verificable por computadora es la transparencia del texto de prueba que una persona realmente puede leer
- El auge de la IA hace esta diferencia todavía más clara
- Las pruebas creadas por IA suelen ser desordenadas, pero son fáciles de ordenar con sledgehammer, y si la estructura está bien planteada, incluso con exceso de detalle siguen siendo legibles
- Eso facilita seguir el flujo del desarrollo y reducirlo luego a una forma más simple
- Recientemente también apareció una investigación donde un modelo de lenguaje invoca directamente sledgehammer
- La IA también podrá traducir con facilidad pruebas estructuradas y legibles de un proof assistant a otro
- Si eso ocurre, se reducirá la carga misma de decidir qué sistema elegir
Corrección por la omisión de Mizar
- La historia de la formalización matemática no puede estar completa sin Mizar y su enorme biblioteca matemática
- El lenguaje Isar de Isabelle también recibió una fuerte influencia de Mizar
- Corrige por separado la omisión de Mizar y señala que en el próximo texto hablará de Mizar
1 comentarios
Opiniones de Hacker News
La mayoría de los lectores de HN se parecen más a programadores que a matemáticos, así que parece más práctico ver Lean desde la perspectiva de la programación que desde la de las demostraciones matemáticas
Como libro para abordar Lean desde la óptica de la programación funcional, https://leanprover.github.io/functional_programming_in_lean/ está bastante bien
Yo también estoy aprendiendo Lean, así que puede que tenga una visión color de rosa de principiante, pero mi objetivo va más por escribir y demostrar código de programadores comunes, como algoritmos reales de compresión/descompresión, tal como en el ejemplo reciente de lean-zip
https://github.com/kiranandcode/lean-zip/blob/master/Zip/Nat...
https://github.com/dharmatech/symbolism.lean
Es un port de código en C#, y la expresividad de Lean es sorprendentemente grande
Recuerdo haber visto que se habló un poco de eso hace tiempo, aunque últimamente no he seguido de cerca esta área
Y además veo otros dos obstáculos. Primero, ya de por sí es difícil saber qué debe hacer el software, y lo que el usuario quiere hacer no necesariamente coincide con aquello por lo que el cliente paga
Segundo, la calidad del trabajo de muchos desarrolladores es tan baja que cuesta creer que vayan a manejar mejor un lenguaje de la verdad que un lenguaje como Java
Aunque lo segundo podría desaparecer si se reemplaza por sistemas de IA que pongan la atención necesaria, y en ese caso la situación podría cambiar
Igual que las matemáticas que ya dejó de lado la programación funcional, creo que para la mayoría de los programadores tiene muy poca relevancia
Parece que el autor entendió bastante mal Lean, y sorprende más porque da la impresión de conocer bien esta área
Da la impresión de que cree que Lean conserva tal cual los objetos de prueba y que, al final, verifica un único objeto de prueba gigantesco con todas las definiciones desplegadas, pero eso está lejos de la realidad
Lean implementa prácticamente la misma optimización que el autor elogia como ventaja de LCF. Por poner una analogía, es como ir borrando el pizarrón mientras se avanza en la demostración
Si en Lean4 se escribe con
theoremy no condef, ese objeto de prueba deja de usarse, y no es una simple optimización sino una propiedad central del lenguaje. theorem es opaqueAunque quedara el término de la prueba, sería solo para que el usuario pueda verlo en modo interactivo, y al kernel ni siquiera le importa cuál era ese objeto de prueba
En LCF, una prueba y un término son cosas distintas, y en mi opinión así debería ser. Esa confusión al estilo Curry-Howard es innecesaria, pero mucha gente cree que es la única manera de hacer matemáticas con computadoras
Si uno quiere, en LCF también puede guardar y reutilizar pruebas, y en Lean también puede eliminarlas por optimización si así lo desea
El enfoque de tipos abstractos quizá ahorre algo de memoria, pero sería solo una diferencia por factor constante, no una mejora asintótica
Quejarse de que Lean desperdicia decenas de MB tal vez importaba en los años 80 y 90, pero hoy ya no parece una ventaja tan decisiva
Se oye mucho que Lean es bueno para programación funcional, pero viniendo de Agda se siente como un downgrade bastante tosco
También se dice que sus tactic son buenas, pero por mi experiencia las tactic de Coq eran más potentes y más cómodas de usar
Puede que todo esto sea sesgo de primera impresión, pero hasta ahora parece que la fortaleza de Lean no está en hacer una sola cosa mejor que nadie, sino en que en general cumple y tiene una comunidad grande
Entiendo por qué resulta atractivo, pero también da un poco de pena sentir que en el proceso se perdió algo de belleza y de potencia
Pero estos efectos, aunque en el momento parezcan permanentes, en realidad duran menos de lo que uno cree. Si de verdad eso fuera lo único importante, Perl seguiría siendo un gigante hasta hoy
En Lean pesa mucho haber conseguido primero una gran biblioteca. Algo parecido a lo que fue CPAN para Perl
Pero si uno mira las leyes de escalamiento, para la mayoría de los usuarios el valor de una gran biblioteca probablemente crece más o menos como el logaritmo de su tamaño
https://pdodds.w3.uvm.edu/teaching/courses/2009-08UVM-300/do...
Al principio esa brecha parece imposible de cerrar, pero no hace falta igualar el tamaño para que llegue un punto en que la usabilidad importe más
Además, el port de bibliotecas matemáticas es una tarea que les calza muy bien a los LLM. La fuente ya está verificada, el destino también se puede verificar, y el camino de razonamiento en general se puede trasladar
Visto al revés, gracias a los LLM la barrera para trabajar en plataformas minoritarias también baja más de lo esperado. Si puedo portar esa biblioteca a mi plataforma, probablemente también pueda portar mis pruebas hacia ella
La clave no es tener la herramienta perfecta, sino lograr sacar el trabajo adelante con una herramienta suficientemente buena
Lean de verdad podría crecer hasta convertirse en un sucesor de Haskell, con potencial como lenguaje funcional para desarrollo de software
Creo que la diferencia estaba sobre todo en el soporte de herramientas. La documentación de Agda es floja, instalarlo y ponerlo a funcionar es engorroso, y prácticamente te empuja a usar Emacs
En cambio, Lean tiene en su propia documentación hasta cómo escribir una utilidad
cat, y en general da una experiencia de tooling mucho más modernaNormalmente los elogios van mucho por el lado del dependent pattern matching, y ahí sí siento que Lean es bastante débil
Pero si aun así Agda te parece más amigable incluso para FP en general, me gustaría saber en qué sentido
Isabelle/HOL como lenguaje está bien, pero su tooling tiene fallas profundas incluso dejando de lado su enfoque centrado en escritorio
El lenguaje no es tan distinto de Lean ni necesariamente mejor, y sí coincido con algunas críticas a los tipos dependientes
Al final, ambos lenguajes hicieron trade-offs distintos, y esas decisiones parecen haberlos vuelto herramientas bastante eficaces en sus respectivos terrenos. El campo de las pruebas es tan amplio que cada paradigma tiene fortalezas y debilidades, y Lean simplemente se especializa en otra parte de ese espacio
Sledgehammer está bien, pero parece cuestión de tiempo para que Lean tenga algo similar
En la etapa de exploración puede ser útil, pero consume muchos recursos, y aunque acorta las pruebas, en código público prefiero que se vean directamente todos los pasos de la prueba en lugar de algo medio mágico como
by sledgehammerEn cambio, desarrollar Isabelle en sí es mucho más doloroso que Lean, y especialmente lo es el proceso de comunicarse con sus desarrolladores
Esa actitud en la lista de correo de que no hay bugs, solo comportamientos no previstos me pareció infantil y poco profesional
Y burlarse del uso de RAM de sistemas parecidos a Lean también da bastante risa cuando se ve el despilfarro de memoria del lado de Isabelle
En la práctica, tiene una dificultad muy parecida a usar pruebas formales en sí
Aunque podría estar confundiéndolo con otro HOL
grindde Mathlibhttps://leanprover-community.github.io/mathlib4_docs/Init/Gr...
Lo interesante de Lean es que Lean es un lenguaje, pero de lo que la gente suele hablar en realidad es de una biblioteca llamada Mathlib
Los creadores de Mathlib parecen bastante pragmáticos, y por eso meten lógica clásica dentro de los tipos de Lean y usan la lógica intuicionista solo de forma parcial
“Algo no puede ser verdadero y falso al mismo tiempo” no es el tercero excluido sino la ley de no contradicción
El tercero excluido significa que
pes verdadero onot pes verdaderohttps://en.wikipedia.org/wiki/Law_of_noncontradiction
https://www.cslib.io https://www.github.com/leanprover/cslib
La lógica intuicionista tiene sentido esencialmente porque busca convertir argumentos matemáticos en construcciones computables, así que será interesante ver cómo manejan este tema
De hecho, en cuanto escribes algoritmos en Lean ya entras, de una u otra forma, en restricciones constructivas, y para ese propósito ese nivel de lógica quizá sea suficiente
negación, ira, negociación, depresión, aceptación
También valen la pena la charla y el texto relacionados de Andrej Bauer
https://www.youtube.com/watch?v=21qPOReu4FI
http://dx.doi.org/10.1090/bull/1556
Creo que hacen falta más textos como este
Incluso frente al pensamiento grupal de empujar como si fuera obvio eso de simplemente usa X, siempre hay razones al menos plausibles para examinar alternativas
Aunque al final termines descartándolas y eligiendo lo dominante, sigue siendo mejor decidir conociendo el terreno
Incluso hoy seguimos creando demasiados frameworks y alternativas, probablemente porque es divertido
Muchas veces, en lugar de mejorar las herramientas existentes o simplemente avanzar con el trabajo real, se termina multiplicando sin fin lenguajes, bibliotecas y herramientas de build
Creo que estaríamos mejor si hubiera solo la mitad de los lenguajes, bibliotecas y herramientas de build que existen hoy
Cuanto más te alejas de lo dominante, menos documentación hay, más bugs aparecen en rincones menos explorados y menos gente tienes para ayudarte
Cuando ya se acumulan más de veinte opciones, en promedio lo correcto es elegir la opción estándar y seguir adelante. La atención es limitada, y si haces un informe de investigación por cada dependencia, al final no resuelves el problema principal
Hay dos excepciones: cuando la herramienta estándar de verdad no encaja con mi caso de uso, o cuando la herramienta estándar se cruza mucho con el problema central que intento resolver
Esta discusión me recuerda a los textos que señalan las limitaciones de Python para computación científica
Cuando una comunidad alrededor de una herramienta razonablemente buena supera cierta masa crítica, eso termina pesando más que casi cualquier otro factor
Se genera impulso, se acumulan tutoriales, explicaciones y mejor documentación, y en la práctica se llega a una especie de velocidad de escape
Lean parece estar justo en esa posición ahora, incluso con el fuerte respaldo de alguien como Terrance Tao
Por eso, decir que “el lenguaje X es mejor” no es totalmente falso, pero hace fácil perder de vista la pregunta importante
La clave es si realmente es mejor que esa herramienta que todo el mundo conoce, puede usar de inmediato y a la que se le dedica más tiempo de mejora
Al final, parece otro caso de worse is better, o de que si algo es bueno y popular, con eso basta
Sobre todo porque en este campo el resultado traducido se puede verificar automáticamente en buena medida, así que la elección en sí quizá no sea un problema tan grande
La IA puede escribir código por su cuenta aunque no exista una biblioteca comunitaria gigantesca, y puede leer directamente la documentación y las especificaciones aunque no haya un millón de tutoriales dando vueltas por internet
Tampoco hace falta evitar lenguajes sin mercado laboral. La IA no está construyendo carrera, solo hace el trabajo que tiene enfrente
Así que lenguajes pequeños y DSL que antes no habrían tenido oportunidad ahora tienen más espacio para ser adoptados
Creo que la vieja monocultura de lenguajes en programación también podría terminarse por culpa de la IA
Decir que “casi todo lo formalizado hoy en cualquier sistema también podría haberse formalizado en AUTOMATH” se parece a decir que hoy todo lo que se programa en lenguajes modernos también podría haberse hecho en ensamblador hace 50 años
Técnicamente es cierto, pero económicamente es otra historia por completo
Hace unos 15 años traté de probar Coq/Rocq y algunas otras herramientas, y más que los conceptos, lo difícil era entender el software mismo
Lo raro de los asistentes de pruebas / demostradores interactivos de teoremas es que, por su naturaleza interactiva, el lenguaje y el IDE terminan acoplados, y en la práctica están fuertemente entrelazados
Por eso cuesta hablar del lenguaje por separado; también hay que mirar en qué entorno se usa
Yo tampoco soy un fanático de VS Code, pero está claro que un IDE extensible pulido por muchísima gente, usado por millones y respaldado con mucho dinero, va muy por delante del entorno de las alternativas
Rutas de entrada tan buenas como Natural Numbers Game también parecen posibles gracias a la capacidad de hackeo y al ecosistema de VS Code
Aun así, algo que me preocupa al aprender Lean es que la extensibilidad sintáctica sea un arma de doble filo
Una vez que aprendes el lenguaje, quieres leer código escrito en él, pero si cada proyecto empieza a crear un montón de DSL propios, eso puede salirse de control
Al final, esto depende de cuánta moderación tenga la comunidad y el ecosistema, así que lo veo con algo de entusiasmo pero también con cierta preocupación
Lean no es el asistente de pruebas más querido por los matemáticos, ni la mejor herramienta para la verificación formal de software
Pero hace ambas cosas razonablemente bien y, a cambio, consiguió el impulso que es lo más difícil de obtener
Además, en la era de la IA la cantidad de código escrito por humanos y disponible públicamente influye directamente en qué tan bien los agentes pueden generar código nuevo, así que ese impulso se vuelve todavía más fuerte