Por qué no usar simplemente Lean
(lawrencecpaulson.github.io)- La historia de la formalización matemática no empezó con Lean, y durante casi 60 años varios linajes de sistemas ya habían acumulado técnicas clave y logros importantes
- Herramientas como AUTOMATH en 1968, la familia LCF, HOL, Rocq, ACL2 y Mizar lograron formalizaciones amplias, 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 la 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 los asistentes de prueba
- Isabelle destaca por su automatización fuerte, alta legibilidad y la ventaja de evitar tipos dependientes, continuando la tradición LCF de construir verificación de pruebas mediante la barrera de abstracción del kernel incluso sin proof objects
- A medida que la IA también ordena pruebas estructuradas y las traduce entre sistemas, podría seguir disminuyendo la presión de ver una sola herramienta como estándar absoluto
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, yendo desde la lógica pura hasta la construcción de los números complejos
- Usó clases de equivalencia y el conjunto de los números racionales, y también demostró formalmente la completitud de Dedekind de la recta real
- Este logro no volvió a aparecer durante 20 años, y solo a mediados de los noventa se retomó 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 automatización alguna, por lo que las pruebas eran largas y difíciles de leer
- Aun así, considera que era mejor que Rocq para tratar clases de equivalencia; a diferencia del setoid hell que sufren los usuarios de Rocq, Jutting llevó a cabo esa formalización con calma
-
Boyer y Moore
- La computational logic de la línea de Robert Boyer, J Moore surgió no para la matemática sino para la verificación de código
- 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 descendiente actual, ACL2, se aplica sobre todo a la verificación de hardware
La evolución después de LCF
- Edinburgh LCF se concentró en teoría de lenguajes de programación, pero la idea de usar un lenguaje funcional como metalenguaje del asistente de prueba se difundió ampliamente
- Varios grupos en Cambridge, INRIA, Cornell y otros lugares usaron ML para crear herramientas como HOL temprano, Coq (hoy Rocq) y Nuprl
- El grupo HOL se enfocó en verificación de hardware, pero la verificación de hardware de punto flotante terminó requiriendo 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 estuvo con frecuencia entre los primeros lugares
- Para 2014, los sistemas de este linaje ya 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, estas pruebas eran largas y complejas, y el trabajo de formalización también fue de gran escala, desempeñando un papel clave para reducir dudas que aún rodeaban a esos teoremas
El ascenso de la comunidad de Lean
- Los matemáticos veían que los logros previos de formalización aún no llegaban a construcciones sofisticadas de la matemática moderna dominante, como Grothendieck schemes o perfectoid spaces
- Tom Hales eligió avanzar acumulando esas definiciones como biblioteca y, más que centrarse en las pruebas, puso el foco en la acumulación de definiciones, eligiendo 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 educación, tras lo cual su difusión se aceleró
- Como punto de inflexión importante en la comunidad Lean, se señala el alejamiento de la obsesión con la prueba constructiva que dominó durante mucho tiempo en Rocq
- El intuicionismo apareció tras la paradoja de Russell y tuvo implicaciones específicas incluso para el concepto de número real
- La teoría de tipos de Martin-Löf es claramente un formalismo intuicionista, pero se escribe que Rocq no puede entenderse de manera tan simple
- Aun así, en trabajos relacionados con Rocq la prueba constructiva reaparecía repetidamente incluso donde era irrelevante o carente de sentido, y se considera que esa tendencia obstaculizó el uso matemático de Rocq y terminó cediendo terreno a Lean
La diferencia entre propositions as types y LCF
- Propositions as types es la dualidad que conecta los símbolos lógicos ∀, ∃, →, ∧, ∨ con los constructores de tipos Π, Σ, →, ×, +
- Este marco es hermoso y teóricamente productivo, pero no es el único camino
- Si se limita un proof assistant a software que verifica pruebas bajo el principio de propositions as types, gran parte de la investigación del último medio siglo queda fuera de la definición
- Entonces solo quedarían Rocq, Lean y Agda
- Incluso AUTOMATH no es un caso de propositions as types; aunque tiene elementos parecidos a Π y →, establece la lógica como axiomas al estilo de un texto general de lógica
- de Bruijn ya veía hace 50 años la necesidad de separar tipos y proposiciones
- Un ejemplo representativo es la división: debe tomar tres argumentos, y el valor de (x/y) pasa a depender 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 igual a propositions as types no se ajusta a los hechos
- Rocq y Lean tienen Prop como sort de las proposiciones, donde todos los objetos de prueba de una misma proposición se evalúan como el mismo valor y así se obtiene proof irrelevance
- Pero eso no hace desaparecer los enormes objetos de prueba; en los sistemas reales siguen estando allí
- El descubrimiento central de Robin Milner fue que en LCF no hacen falta objetos de prueba como tales
- Si el kernel de pruebas se coloca dentro de un tipo de dato abstracto de ML y las reglas de inferencia se vuelven constructores, la verificación puede hacerse de manera dinámica
- Se considera que la abstraction barrier de ML impide hacer trampa
- Que términos gigantescos ocupen decenas de MB sin siquiera señalar nada resulta especialmente irracional en la era de RAMmageddon
- También critica que incluso se continúe investigando cómo embellecer de forma más elegante esos términos innecesarios
Razones para elegir Isabelle
- Si tus colegas usan Lean, la experiencia del equipo también está en Lean y las bibliotecas de base que necesitas están en Lean, entonces lo natural es usar Lean
- Pero si puedes elegir libremente, hay razones claras para considerar Isabelle
-
Automatización
- Señala como ventaja la automatización más potente, y sostiene que incluso comparada con los “hammer” cotidianos, nada está a la altura de sledgehammer
- Añade que el lado del álgebra computacional también debe tratarse por separado
-
Legibilidad
- La presenta como la mejor opción en legibilidad, citando como respaldo ejemplos relacionados con Isar
-
Evitar tipos dependientes
- Como no tiene tipos dependientes, evita niveles de universos y otras rarezas que complican la vida a 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 misma se vuelve indecidible
- Esto se debe a que decidir la igualdad es indecidible, y se escribe que al principio este punto se aceptaba como algo natural
- Desde alrededor de 1990, el consenso pasó a hacer decidible la verificación de tipos rebajando la igualdad a definitional/intensional equality
- Como resultado, (T(N+1)) y (T(1+N)) se vuelven tipos distintos
- Estas restricciones afectan a las pruebas reales, y además la propia comprobación de la igualdad definicional sigue teniendo un costo computacional considerable
Matemática moderna posible incluso sin tipos dependientes
- Señala que en 2017 era mucho más cauto respecto de hasta qué punto podía llegar Isabelle en matemáticas
- En ese momento parecía fácil pensar que para temas como los siguientes los tipos dependientes eran imprescindibles
- Sin embargo, a través de la investigación relacionada con Alexandria aprendieron mucho, y resume que la clave es no empujar todo dentro de los tipos
La dirección futura y la IA
- Lean está acertando en muchos aspectos y, al admitir incluso bloques de prueba anidados, tiene potencial para convertirse en un lenguaje de pruebas suficientemente legible
- Ahora la comunidad de Lean debe usar realmente esas funciones, y se escribe que los usuarios de Isabelle ya lo hacen en gran medida
- Más importante que un objeto de prueba verificable por computadora es la transparencia del texto de prueba que las personas realmente pueden leer
- El auge de la IA hace esta diferencia todavía más clara
- Las pruebas generadas por IA suelen ser desordenadas, pero son fáciles de ordenar con sledgehammer y, si la estructura está bien planteada, siguen siendo legibles aunque los detalles sean excesivos
- Eso facilita captar el flujo del avance y reducirlo luego a una forma más simple
- Recientemente incluso aparecieron investigaciones en las que un modelo de lenguaje llama directamente a sledgehammer
- La IA también puede encargarse fácilmente de traducir pruebas estructuradas y legibles de un proof assistant a otro
- Si eso ocurre, disminuye la carga misma de decidir qué sistema elegir
Complemento sobre 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 el haber omitido Mizar y escribe que lo tratará en la próxima entrada
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