Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jaalonso/explorando-con-lean

Explorando formalizaciones con Lean
https://github.com/jaalonso/explorando-con-lean

automated-reasoning interactive-theorem-proving lean math proof-assistant

Last synced: 17 days ago
JSON representation

Explorando formalizaciones con Lean

Awesome Lists containing this project

README

        

#+TITLE: Explorando formalizaciones con Lean
#+OPTIONS: num:t

Estas son las notas de la lectura del libro de [[https://loeh.app.uni-regensburg.de/index.html][Clara Löh]] titulado
[[https://loeh.app.uni-regensburg.de/mapa/main.pdf][Exploring formalisation (A primer in human-readable mathematics in Lean
3 with examples from simplicial topology)]] cuyo código se encuentra en
[[https://gitlab.com/polywuisch/mapa_notes][GitLab]].

* Contenido :TOC:
- [[#introducción][Introducción]]
- [[#el-asistente-de-pruebas-lean][El asistente de pruebas Lean]]
- [[#asistentes-de-pruebas][Asistentes de pruebas]]
- [[#fundamentos][Fundamentos]]
- [[#tipos][Tipos]]
- [[#demostraciones][Demostraciones]]
- [[#ejemplos-básicos][Ejemplos básicos]]
- [[#aplicaciones-inyectivas-y-suprayectivas][Aplicaciones inyectivas y suprayectivas]]
- [[#inducción][Inducción]]
- [[#conmutadores][Conmutadores]]
- [[#el-cero-real][El cero real]]
- [[#ejercicios][Ejercicios]]
- [[#opciones-de-diseño][Opciones de diseño]]
- [[#diseño-recursivo][Diseño recursivo]]
- [[#complejos-simpliciales][Complejos simpliciales]]
- [[#aplicaciones-simpliciales][Aplicaciones simpliciales]]
- [[#complejos-simpliciales-finitos][Complejos simpliciales finitos]]
- [[#generación-de-complejos-simpliciales][Generación de complejos simpliciales]]
- [[#combinación-de-complejos-simpliciales][Combinación de complejos simpliciales]]
- [[#la-característica-de-euler][La característica de Euler]]
- [[#hacia-una-biblioteca][Hacia una biblioteca]]
- [[#ejercicios-1][Ejercicios]]
- [[#abstracción-y-prototipado][Abstracción y prototipado]]
- [[#formalización-directa-seminormas-functoriales][Formalización directa: Seminormas functoriales]]
- [[#formalización-indirecta-multiplicidad-susceptible][Formalización indirecta: Multiplicidad susceptible]]

* Introducción

+ La formalización de las matemáticas en un asistente de pruebas tiene
los siguientes beneficios:
+ La implementación de las matemáticas requiere un conocimiento muy
profundo de del tema y de todos los casos extremos. Por lo tanto,
una formalización exitosa permite un mejor conocimiento de los
detalles.
+ Una formalización en un asistente de pruebas puede conducir a un
código ejecutable y, por tanto ofrece la oportunidad de realizar
experimentos con ejemplos concretos.
+ Los asistentes de pruebas fomentan la abstracción. A menudo es más
fácil formalizar conceptos de forma declarativa a través de
propiedades universales en lugar de construcciones concretas y
potencialmente engorrosas. Esto puede conducir a una una visión más
clara de las cuestiones e ideas fundamentales.
+ Interactuar con un asistente de pruebas es divertido y adictivo.

+ Si los estudiantes aprenden las técnicas básicas de demostración a
través de un asistente de pruebas, pueden obtener una
retroalimentación inmediata y pueden experimentar con pruebas y
ejemplos. Además, los estudiantes pueden ver en términos más prácticos
cómo las abstracciones simplifican la vida matemática.

* El asistente de pruebas Lean

** Asistentes de pruebas

+ Un asistente de pruebas es un lenguaje de programación junto con su
correspondiente intérprete/compilador que nos permite formalizar
objetos y hechos matemáticos (definiciones, teoremas, pruebas y
ejemplos).

+ La principal tarea de un asistente de pruebas no es encontrar pruebas,
sino comprobar que las pruebas son correctas.

+ Los asistentes de pruebas ayudan a detectar y evitar errores. Además,
indirectamente también conducen a una mejor comprensión general de las
conexiones matemáticas y, a largo plazo, conducirán a formas más
sistemáticas y estructuradas de generalizar los resultados a nuevos
contextos.

+ Uno de los grandes retos es utilizar los asistentes de pruebas de tal
manera que la formalización no sólo sea fácil de comprobar por el
intérprete/compilador sino también comprensible para los lectores
humanos: La belleza de las matemáticas no reside en los complicados
detalles técnicos, sino en las ideas subyacentes.

+ Hay muchos asistentes de pruebas; actualmente, los asistentes de
pruebas de propósito general más populares son Coq, Isabelle y Lean.

** Fundamentos

+ La formalización de las matemáticas consta de los siguientes componentes
- un universo de objetos,
- un lenguaje lógico,
- un concepto de prueba y
- un metalenguaje (en el que se formula todo esto).

+ En las pruebas clásicas de papel y lápiz, solemos trabajar con la
teoría de conjuntos, con una lógica clásica y con un cálculo de
pruebas que nos permite descomponer, construir y recombinar enunciados
lógicos.

+ Lean es un lenguaje de programación funcional. Lean se basa en la
teoría de tipos y en el cálculo de construcciones inductivas en lugar
de la teoría de conjuntos, ofrece la posibilidad de elegir entre la
lógica clásica y la intuicionista, y el cálculo de pruebas se basa en
el isomorfismo de Curry-Howard.

** Tipos

+ El lenguaje de programación Lean es de tipo estático; es decir, todos
los términos están sujetos a reglas de tipado y sus tipos se declaran
o infieren en tiempo de compilación.

+ Los tipos en Lean se pueden construir combinando los siguientes:
- Tipos de función (símbolo →): Si A y B son tipos, entonces A → B
denota el tipo de todas las funciones de A a B.
- Tipos de pares (símbolo ×): Si A y B son tipos, entonces A × B
denota el tipo de todos los pares con el primer componente del tipo
A y el segundo componente del tipo B.
- Tipos inductivos (palabra clave ~inductive~):
+ Los tipos inductivos tienen una lista finita de constructores que
pueden depender recursivamente unos de otros.
+ Ejemplos de tipos inductivos son los tipos de enumeración simple,
las listas de números naturales y los árboles.
- Tipos de registro (palabra clave ~structure~):
+ Los tipos de registro tienen un único constructor sobre una lista
finita de campos.
+ Se puede acceder a estos campos a través de las proyecciones
correspondientes.
+ Ejemplos de tipos de registro son los tipos de pares o las
estructuras matemáticas combinadas que constan de múltiples
componentes o propiedades.
+ Los registros en Lean son extensibles y, por tanto, pueden
utilizarse para construir teorías de forma jerárquica.
- Además, Lean tiene cierto soporte para subtipos y cocientes.

+ Lean admite clases de tipo.
+ Las clases de tipos (palabra clave ~class~ o ~@[class] structure~)
son una variante de los tipos de registro.
+ Las clases de tipos pueden verse como la formalización de un
conjunto finito de axiomas sobre los tipos de parámetros dados.
+ Dar una instancia de una clase de tipo corresponde a demostrar los
axiomas correspondientes sobre los tipos de parámetros.
+ Las clases de tipos y sus instancias están sujetas a la
inferencia de clases de tipos.
+ Ejemplos de clases de tipos son todo tipo de estructuras algebraicas
como monoides, grupos, etc. Análogamente, también las estructuras
métricas y los conceptos de la teoría de categorías se axiomatizan
mediante clases de tipos.
+ Es posible definir múltiples instancias para la misma clase de tipos
sobre los mismos tipos de parámetros; matemáticamente, esto
corresponde a, por ejemplo definir múltiples estructuras de grupo
sobre el mismo conjunto.

+ Tipos dependientes:
+ Lean se basa en la teoría de tipos dependientes.
+ Los tipos son ciudadanos de primera clase y los tipos de suma y
producto subyacentes a los tipos de función, tipos inductivos y
tipos de registro son sumas dependientes (tipos Sigma dependientes:
Σ) y productos (tipos Pi dependientes: Π).
+ Lean admite restricciones y dependencias en los tipos de los
argumentos y en el del resultado resultado.

+ Los tipos de Lean están organizados en una jerarquía:
+ ~Prop~ (equivalentemente, ~Sort 0~) es la parte inferior de la
jerarquía de tipos.
+ Las expresiones de tipo ~Prop~ se consideran "proposiciones".
+ El tipo ~Prop~ contiene las constantes booleanas ~true~ y ~false~
+ Las conectivas lógicas convierten los miembros del tipo ~Prop~ en
resultados del tipo ~Prop~.
+ El ~Type u~ (equivalentemente, ~Sort (u+1)~), para un número natural
~u~, pertenece a ~Type (u+1)~.
+ ~Type~ es una abreviatura de ~Type 0~.
+ ~Type*~ es una abreviatura para el ~Type u~ para algún nivel de
universo no especificado ~u~.
+ Los constructores de tipos (como →) operan sobre estos universos de
tipos.

+ Los términos de tipo ~Prop~ satisfacen la *extensionalidad
proposicional*: Si ~A : Prop~ y ~x, y : A~, entonces ~x~ e ~y~ se
consideran iguales en todos los aspectos.

** Demostraciones

+ En las pruebas matemáticas se usa el /modus ponens/:
+ Si el enunciado ~A~ está demostrado y si la implicación ~A ⇒ B~ está demostrada, entonces
se deduce que también se demuestra ~B~.

+ El *isomorfismo Curry-Howard* identifica
- enunciados con tipos y
- pruebas de enunciados con elementos del tipo correspondiente.

+ El /modus ponens/ corresponde a la aplicación de la función:
+ Si ~x : A~ y ~f : A → B~, entonces ~f x : B~.

+ Las pruebas en Lean son sólo implementaciones de funciones.
+ Una prueba del lema
#+begin_src lean
lemma primer_resultado
(x : A)
: ϕ x :=
begin
...
end
#+end_src
no es más que una implementación de una función del tipo ~Π (x : A), ϕ x~.

+ [[./src/primer_ejemplo.lean][Primer ejemplo de demostración]]
#+INCLUDE: "./src/primer_ejemplo.lean" src lean

* Ejemplos básicos

** Aplicaciones inyectivas y suprayectivas

+ [[./src/aplicaciones.lean][Aplicaciones inyectivas, suprayectivas y biyectivas]]
#+INCLUDE: "./src/aplicaciones.lean" src lean

** Inducción

+ [[./src/induccion.lean][Inducción]]
#+INCLUDE: "./src/induccion.lean" src lean

** Conmutadores

+ [[./src/Conmutadores_en_grupos.lean][Conmutadores en grupos]].
#+INCLUDE: "./src/Conmutadores_en_grupos.lean" src lean

** El cero real

** Ejercicios

* Opciones de diseño

** Diseño recursivo

** Complejos simpliciales

** Aplicaciones simpliciales

** Complejos simpliciales finitos

** Generación de complejos simpliciales

** Combinación de complejos simpliciales

** La característica de Euler

** Hacia una biblioteca

** Ejercicios

* Abstracción y prototipado

** Formalización directa: Seminormas functoriales

** Formalización indirecta: Multiplicidad susceptible