En informática y lógica , un tipo dependiente es aquel cuya definición depende de un valor. Es una característica común a la teoría de tipos y a los sistemas de tipos . En la teoría de tipos intuicionista , los tipos dependientes se utilizan para codificar cuantificadores lógicos como "para todo" y "existe". En lenguajes de programación funcional como Agda , ATS , Rocq (anteriormente conocido como Coq ), F* , Epigram , Idris y Lean , los tipos dependientes ayudan a reducir errores al permitir al programador asignar tipos que restringen aún más el conjunto de posibles implementaciones.
Dos ejemplos comunes de tipos dependientes son las funciones dependientes y los pares dependientes . El tipo de retorno de una función dependiente puede depender del valor (no solo del tipo) de uno de sus argumentos. Por ejemplo, una función que toma un entero positivo.puede devolver una matriz de longituddonde la longitud del array forma parte del tipo del array. (Cabe destacar que esto difiere del polimorfismo y la programación genérica , ya que ambos incluyen el tipo como argumento). Un par dependiente puede tener un segundo valor, cuyo tipo depende del primero. Siguiendo con el ejemplo del array, un par dependiente puede utilizarse para emparejar un array con su longitud de forma segura en cuanto a tipos.
Los tipos dependientes añaden complejidad a un sistema de tipos. Decidir la igualdad de tipos dependientes en un programa puede requerir cálculos. Si se permiten valores arbitrarios en los tipos dependientes, entonces decidir la igualdad de tipos puede implicar decidir si dos programas arbitrarios producen el mismo resultado; por lo tanto, la decidibilidad de la verificación de tipos puede depender de la semántica de igualdad de la teoría de tipos dada, es decir, si la teoría de tipos es intensional o extensional . [ 1 ]
Historia
En 1934, Haskell Curry observó que los tipos utilizados en el cálculo lambda tipado , y en su contraparte de lógica combinatoria , seguían el mismo patrón que los axiomas en la lógica proposicional . Más aún, para cada demostración en la lógica, existía una función (término) correspondiente en el lenguaje de programación. Uno de los ejemplos de Curry fue la correspondencia entre el cálculo lambda tipado simple y la lógica intuicionista . [ 2 ]
La lógica de predicados es una extensión de la lógica proposicional, que añade cuantificadores. Howard y de Bruijn extendieron el cálculo lambda para que coincidiera con esta lógica más potente mediante la creación de tipos para funciones dependientes, que corresponden a "para todo", y pares dependientes, que corresponden a "existe". [ 3 ]
Debido a esto, y a otros trabajos de Howard, la noción de proposiciones como tipos se conoce como la correspondencia Curry-Howard .
Definición formal
En la teoría de tipos dependientes, un tipo dependiente es un tipo cuya especificación puede variar con un valor, y puede considerarse análogo a una familia indexada de conjuntos .denotan un universo de tipos y escribenpara indicar quees un tipo enPor un términode tipo, escribir. Una familia dependiente de tipos sobreestá escrito, lo que significa que a cada términoLa familia asigna un tipo. Por lo tanto, dadoy, la expresióndenota un tipo que depende del valor particularEn la terminología estándar, esto se describe diciendo que el tipovaría con.
tipo Π
Una función cuyo tipo de valor de retorno varía con su argumento (es decir, no hay un codominio fijo ) es una función dependiente y el tipo de esta función se llama tipo de producto dependiente , tipo pi ( tipo Π ) o tipo de función dependiente . [ 4 ] De una familia de tipospodemos construir el tipo de funciones dependientes, cuyos términos son funciones que toman un términoy devolver un término en. Para este ejemplo, el tipo de función dependiente se escribe normalmente comoo.
Sies una función constante, el tipo de producto dependiente correspondiente es equivalente a un tipo de función ordinaria . Es decir,es equivalente en cuanto a juiciocuandono depende de.
El nombre "tipo Π" proviene de la idea de que estos pueden considerarse como un producto cartesiano de tipos. Los tipos Π también pueden entenderse como modelos de cuantificadores universales .
Por ejemplo, si escribimospara n -tuplas de números reales , entoncesSería el tipo de una función que, dado un número natural n , devuelve una tupla de números reales de tamaño n . El espacio de funciones usual surge como un caso especial cuando el tipo de rango no depende realmente de la entrada. Por ejemploes el tipo de funciones de números naturales a números reales, que se escribe comoen cálculo lambda tipado.
Para un ejemplo más concreto, tomemosser del tipo de enteros sin signo del 0 al 255 (los que caben en 8 bits o 1 byte) ypara, entoncesse convierte en el producto de.
tipo Σ
El dual del tipo de producto dependiente es el tipo de par dependiente , el tipo de suma dependiente , el tipo sigma o (de forma confusa) el tipo de producto dependiente . [ 4 ] Los tipos sigma también pueden entenderse como cuantificadores existenciales . Continuando con el ejemplo anterior, si, en el universo de tipos, hay un tipoy una familia de tipos, entonces hay un tipo de par dependiente(Las notaciones alternativas son similares a las de los tipos Π ).
El tipo de par dependiente captura la idea de un par ordenado donde el tipo del segundo término depende del valor del primero. Sientoncesy. Sies una función constante, entonces el tipo de par dependiente se convierte (es a juicio igual a) el tipo de producto , es decir, un producto cartesiano ordinario. [ 4 ]
Para un ejemplo más concreto, tomemosser nuevamente de tipo enteros sin signo del 0 al 255, yvolver a ser igual apara 256 más arbitrario, entoncesse descompone en la suma.
Ejemplo como cuantificación existencial
Dejarser de algún tipo, y dejar. Según la correspondencia Curry-Howard,puede interpretarse como un predicado lógico en términos de. Para un dado, ya sea el tipoestá habitado indica sisatisface este predicado. La correspondencia puede extenderse a la cuantificación existencial y a pares dependientes: la proposiciónes verdadero si y solo si el tipoestá habitado.
Por ejemplo,es menor o igual quesi y solo si existe otro número naturalde tal manera queEn lógica, esta afirmación se codifica mediante la cuantificación existencial:
Esta proposición corresponde al tipo de par dependiente:
Es decir, una prueba de la afirmación de quees menor o igual quees un par que contiene un número no negativo, que es la diferencia entreyy una prueba de la igualdad.
Sistemas del cubo lambda
Henk Barendregt desarrolló el cubo lambda como un medio para clasificar los sistemas de tipos a lo largo de tres ejes. Los ocho vértices del diagrama resultante, con forma de cubo, corresponden a un sistema de tipos, con el cálculo lambda de tipos simples en el vértice menos expresivo y el cálculo de construcciones en el más expresivo. Los tres ejes del cubo corresponden a tres aumentos diferentes del cálculo lambda de tipos simples: la adición de tipos dependientes, la adición de polimorfismo y la adición de constructores de tipos de orden superior (funciones de tipos a tipos, por ejemplo). El cubo lambda se generaliza aún más mediante sistemas de tipos puros .
Teoría de tipos dependientes de primer orden
El sistemade tipos dependientes de primer orden puros, que corresponden al marco lógico LF , se obtiene generalizando el tipo de espacio de funciones del cálculo lambda simplemente tipado al tipo de producto dependiente.
Teoría de tipos dependientes de segundo orden
El sistemade tipos dependientes de segundo orden se obtiene deal permitir la cuantificación sobre constructores de tipos. En esta teoría, el operador de producto dependiente engloba tanto eloperador del cálculo lambda simplemente tipado y elligante del Sistema F.
Cálculo lambda polimórfico de orden superior con tipos dependientes
El sistema de orden superiorextiendea las cuatro formas de abstracción del cubo lambda : funciones de términos a términos, de tipos a tipos, de términos a tipos y de tipos a términos. El sistema corresponde al cálculo de construcciones, cuya derivada, el cálculo de construcciones inductivas, es el sistema subyacente de Rocq.
Lenguaje de programación y lógica simultáneos
La correspondencia de Curry-Howard implica que se pueden construir tipos que expresen propiedades matemáticas de complejidad arbitraria. Si el usuario puede proporcionar una prueba constructiva de que un tipo está habitado (es decir, que existe un valor de ese tipo), un compilador puede verificar la prueba y convertirla en código ejecutable que calcule el valor mediante la construcción. La función de verificación de pruebas hace que los lenguajes con tipado dependiente estén estrechamente relacionados con los asistentes de prueba . El aspecto de generación de código proporciona un enfoque potente para la verificación formal de programas y el código portador de pruebas , ya que el código se deriva directamente de una prueba matemática verificada mecánicamente.
Comparación de lenguajes con tipos dependientes
- ↑ Esto se refiere al lenguaje central , no a ninguna táctica ( procedimiento de demostración de teoremas ) ni a ningún sublenguaje de generación de código.
- ↑ Sujeto a restricciones semánticas, como las restricciones del universo.
- ↑ Solucionador de anillos [ 6 ]
- ↑ Universos opcionales, polimorfismo de universos opcionales y universos opcionales especificados explícitamente
- ↑ Universos, restricciones de universo inferidas automáticamente (no es lo mismo que el polimorfismo de universo de Agda) e impresión explícita opcional de las restricciones de universo.
- ↑ Ha sido reemplazado por ATS
- ↑ El último documento de Sage y la última instantánea del código datan de 2006.
Véase también
Referencias
- ↑ Hofmann, Martin (1995), Conceptos extensionales en la teoría de tipos intensionales (PDF)
- ↑ Sørensen, Morten Heine B.; Urzyczyn, Pawel (1998), Lecciones sobre el isomorfismo de Curry-Howard , CiteSeerX 10.1.1.17.7385
- ↑ Bove, Ana; Dybjer, Peter (2008). Tipos dependientes en el trabajo (PDF) (Informe). Universidad Tecnológica de Chalmers.
- 1 2 3 Altenkirch, Thorsten; Danielsson, Nils Anders; Löh, Andres; Oury, Nicolas (2010). "ΠΣ: Dependent Types without the Sugar" (PDF) . En Blume, Matthias; Kobayashi, Naoki; Vidal, Germán (eds.). Functional and Logic Programming, 10th International Symposium, FLOPS 2010, Sendai, Japón, 19-21 de abril de 2010. Actas . Lecture Notes in Computer Science. Vol. 6009. Springer. pp. 40– 55. doi : 10.1007/978-3-642-12251-4_5 .
- ↑ "Página de descarga de Agda" .
- ↑ "Solucionador de anillos Agda" .
- 1 2 "Anuncio: Agda 2.2.8" . Archivado del original el 18 de julio de 2011. Recuperado el 28 de septiembre de 2010 .
- ↑ "Registro de cambios de Agda 2.6.0" .
- ↑ "Descargas de ATS2" .
- ↑ "Correo electrónico del inventor de ATS, Hongwei Xi" .
- ↑ Xi, Hongwei (marzo de 2017). "Sistema de tipos aplicado: un enfoque para la programación práctica con demostración de teoremas" (PDF) . arXiv : 1703.08683 .
- ↑ "Cambios de Coq en el repositorio Subversion" .
- ↑ "Introducción de SProp en Coq 8.10" .
- ↑ "F* cambia en GitHub" . GitHub .
- ↑ "Notas de la versión F* v0.9.5.0 en GitHub" . GitHub .
- ↑ "Guru SVN" .
- 1 2 Aaron Stump (6 de abril de 2009). "Programación verificada en Guru" (PDF) . Archivado del original (PDF) el 29 de diciembre de 2009. Recuperado el 28 de septiembre de 2010 .
- ↑ Petcher, Adam (mayo de 2008). Decidiendo la unibilidad módulo ecuaciones fundamentales en la teoría de tipos operacionales (PDF) (MSc). Universidad de Washington . Recuperado el 14 de octubre de 2010 .
- ↑ "Repositorio git de Idris" . GitHub . 17 de mayo de 2022.
- ↑ Brady, Edwin. "Idris, un lenguaje con tipos dependientes — resumen extendido" (PDF) . CiteSeerX 10.1.1.150.9442 .
- ↑ "Matita SVN" . Archivado del original el 8 de mayo de 2006. Consultado el 29 de septiembre de 2010 .
Lecturas adicionales
- Martin-Löf, Per (1984). Teoría de tipos intuicionista (PDF) . Bibliopolis.
- Nordström, Bengt; Petersson, Kent; Smith, enero M. (1990). Programación en la teoría de tipos de Martin-Löf: una introducción . Prensa de la Universidad de Oxford. ISBN 9780198538141.
- Barendregt, H. (1992). "Cálculos lambda con tipos" . En Abramsky, S.; Gabbay, D.; Maibaum, T. (eds.). Manual de lógica en informática . Oxford Science Publications . doi : 10.1017/CBO9781139032636 . hdl : 2066/17231 .
- Brandl, Helmut (2022). Cálculo de construcciones
- McBride, Conor ; McKinna, James (enero de 2004). "La perspectiva desde la izquierda" . Journal of Functional Programming . 14 (1): 69–111 . doi : 10.1017/s0956796803004829 . S2CID 6232997 .
- Altenkirch, Thorsten ; McBride, Conor ; McKinna, James (2006). «Por qué importan los tipos dependientes» (PDF) . Actas del 33.er Simposio ACM SIGPLAN-SIGACT sobre Principios de Lenguajes de Programación, POPL 2006, Charleston, Carolina del Sur, EE. UU., 11-13 de enero . ISBN 1-59593-027-2.
- Norell, Ulf (septiembre de 2007). Hacia un lenguaje de programación práctico basado en la teoría de tipos dependientes (PDF) (Tesis doctoral). Gotemburgo, Suecia: Departamento de Informática e Ingeniería, Universidad Tecnológica de Chalmers. ISBN 978-91-7291-996-9.
- Oury, Nicolas; Swierstra, Wouter (2008). "El poder de Pi" (PDF) . ICFP '08: Actas de la 13.ª conferencia internacional ACM SIGPLAN sobre programación funcional . pp. 39–50 . doi : 10.1145/1411204.1411213 . ISBN 9781595939197. S2CID 16176901 .
- Norell, Ulf (2009). "Programación escrita de forma dependiente en Agda" (PDF) . En Koopman, P.; Plasmeijer, R.; Swierstra, D. (eds.). Programación funcional avanzada. AFP 2008 . Apuntes de conferencias sobre informática. vol. 5832. Saltador. págs. 230–266 . doi : 10.1007/978-3-642-04652-0_5 . ISBN 978-3-642-04651-3.
- Sitnikovski, Boro (2018). Introducción sencilla a los tipos dependientes con Idris . Lean Publishing. ISBN 978-1723139413.
- McBride, Conor ; Nordvall-Forsberg, Fredrik (2022). «Sistemas de tipos para programas que respetan dimensiones» (PDF) . Herramientas matemáticas y computacionales avanzadas en metrología y ensayos XII . Avances en matemáticas para ciencias aplicadas. World Scientific. pp. 331–345 . doi : 10.1142/9789811242380_0020 . ISBN 9789811242380. S2CID 243831207 .
Enlaces externos
- Programación con tipos dependientes 2008
- Programación con tipos dependientes 2010
- Programación con tipos dependientes 2011
- "Tipo dependiente" en la wiki de Haskell
- Teoría de tipos dependientes en el Laboratorio n
- tipo dependiente en el laboratorio n
- tipo de producto dependiente en el laboratorio n
- tipo de suma dependiente en el laboratorio n
- producto dependiente en el laboratorio n
- suma dependiente en el laboratorio n
- Fundamentos de las matemáticas
- Programación con tipos dependientes
- teoría de tipos
- Sistemas de tipos