En lógica matemática y teoría de tipos , el λ-cubo (también escrito cubo lambda ) es un marco introducido por Henk Barendregt [1] para investigar las diferentes dimensiones en las que el cálculo de construcciones es una generalización del λ-cálculo de tipos simples . Cada dimensión del cubo corresponde a un nuevo tipo de dependencia entre términos y tipos. Aquí, "dependencia" se refiere a la capacidad de un término o tipo para vincular un término o tipo. Las dimensiones respectivas del λ-cubo corresponden a:
eje x ( ): tipos que pueden vincular términos, correspondientes a tipos dependientes .
Eje y ( ): términos que pueden unir tipos, correspondientes al polimorfismo .
Eje z ( ): tipos que pueden vincular tipos, correspondientes a operadores de tipo (de vinculación) .
Las diferentes formas de combinar estas tres dimensiones dan como resultado los 8 vértices del cubo, cada uno de los cuales corresponde a un tipo diferente de sistema tipificado. El λ-cubo se puede generalizar al concepto de un sistema de tipos puros .
Ejemplos de sistemas
(λ→) Cálculo lambda de tipos simples
El sistema más simple que se encuentra en el λ-cubo es el cálculo lambda de tipos simples , también llamado λ→. En este sistema, la única forma de construir una abstracción es haciendo que un término dependa de otro término , con la regla de tipificación :
(λ2) Sistema F
En el Sistema F (también llamado λ2 por el "cálculo lambda tipado de segundo orden") [2] hay otro tipo de abstracción, escrita con , que permite que los términos dependan de tipos , con la siguiente regla:
Los términos que comienzan con a se denominan polimórficos , ya que se pueden aplicar a diferentes tipos para obtener diferentes funciones, de manera similar a las funciones polimórficas en lenguajes tipo ML . Por ejemplo, la identidad polimórfica
lo que significa que puede tomar un argumento de cualquier tipo 'ay devolver un elemento de ese tipo. Este tipo corresponde en λ2 al tipo .
(λω) Sistema Fω
En el Sistema F se introduce una construcción para suministrar tipos que dependen de otros tipos . Esto se llama constructor de tipos y proporciona una forma de construir "una función con un tipo como valor ". [3] Un ejemplo de un constructor de tipos de este tipo es el tipo de árboles binarios con hojas etiquetadas por datos de un tipo dado : , donde " " significa informalmente " es un tipo". Esta es una función que toma un parámetro de tipo como argumento y devuelve el tipo de s de valores de tipo . En programación concreta, esta característica corresponde a la capacidad de definir constructores de tipos dentro del lenguaje, en lugar de considerarlos como primitivos. El constructor de tipos anterior corresponde aproximadamente a la siguiente definición de un árbol con hojas etiquetadas en OCaml:
tipo ' un árbol = | Hoja de ' un | Nodo de ' un árbol * ' un árbol
Este constructor de tipos se puede aplicar a otros tipos para obtener nuevos tipos. Por ejemplo, para obtener el tipo de árboles de números enteros:
tipo int_tree = int árbol
El sistema F generalmente no se utiliza por sí solo, pero es útil para aislar la característica independiente de los constructores de tipos. [4]
(λP) Lambda-P
En el sistema λP , también llamado ΛΠ, y estrechamente relacionado con el Marco Lógico LF , existen los llamados tipos dependientes . Estos son tipos a los que se les permite depender de términos . La regla de introducción crucial del sistema es
donde representa tipos válidos. El nuevo constructor de tipos corresponde, a través del isomorfismo de Curry-Howard , a un cuantificador universal, y el sistema λP en su conjunto corresponde a la lógica de primer orden con implicación como solo conectivo. Un ejemplo de estos tipos dependientes en la programación concreta es el tipo de vectores de una cierta longitud: la longitud es un término, del cual depende el tipo.
(λω) Sistema Fω
El sistema Fω combina tanto el constructor del sistema F como los constructores de tipos del sistema F. Por lo tanto, el sistema Fω proporciona tanto términos que dependen de tipos como tipos que dependen de tipos .
(λC) Cálculo de construcciones
En el cálculo de construcciones , denotado como λC en el cubo o como λPω, [1] : 130 estas cuatro características cohabitan, de modo que tanto los tipos como los términos pueden depender de tipos y términos. La clara frontera que existe en λ→ entre términos y tipos se elimina en cierta medida, ya que todos los tipos excepto el universal son en sí mismos términos con un tipo.
Definición formal
Como ocurre con todos los sistemas basados en el cálculo lambda de tipos simples, todos los sistemas del cubo se proporcionan en dos pasos: primero, los términos sin procesar, junto con una noción de β-reducción , y luego las reglas de tipificación que permiten tipificar esos términos.
El conjunto de tipos se define como , los tipos se representan con la letra . También existe un conjunto de variables, representadas por las letras . Los términos en bruto de los ocho sistemas del cubo se dan mediante la siguiente sintaxis:
y denotando cuando no ocurre libre en .
Los entornos, como es habitual en los sistemas tipificados, vienen dados por
La noción de β-reducción es común a todos los sistemas del cubo. Se escribe y se da mediante las reglas. Su clausura reflexiva y transitiva se escribe .
Las siguientes reglas de escritura también son comunes a todos los sistemas del cubo:
La diferencia entre los sistemas está en los pares de tipos que se permiten en las siguientes dos reglas de tipificación:
La correspondencia entre los sistemas y los pares permitidos en las reglas es la siguiente:
Cada dirección del cubo corresponde a un par (excluyendo el par compartido por todos los sistemas), y a su vez cada par corresponde a una posibilidad de dependencia entre términos y tipos:
permite que los términos dependan de los términos.
permite que los tipos dependan de los términos.
permite que los términos dependan de los tipos.
permite que los tipos dependan de tipos.
Comparación entre los sistemas
λ→
Una derivación típica que se puede obtener es o con el atajo de flecha que se asemeja mucho a la identidad (de tipo ) del λ→ habitual. Tenga en cuenta que todos los tipos utilizados deben aparecer en el contexto, porque la única derivación que se puede realizar en un contexto vacío es .
La potencia de cálculo es bastante débil, corresponde a los polinomios extendidos (polinomios junto con un operador condicional). [5]
λ2
En λ2, se pueden obtener términos como con . Si se lee como una cuantificación universal, a través del isomorfismo de Curry-Howard, esto puede verse como una prueba del principio de explosión. En general, λ2 agrega la posibilidad de tener tipos impredicativos como , es decir, términos que cuantifican sobre todos los tipos, incluidos ellos mismos. El polimorfismo también permite la construcción de funciones que no eran construibles en λ→. Más precisamente, las funciones definibles en λ2 son aquellas demostrablemente totales en la aritmética de Peano de segundo orden . [6] En particular, todas las funciones recursivas primitivas son definibles.
lambda
En λP, la capacidad de tener tipos que dependen de términos significa que se pueden expresar predicados lógicos. Por ejemplo, el siguiente es derivable: lo que corresponde, a través del isomorfismo de Curry-Howard, a una prueba de . Sin embargo, desde el punto de vista computacional, tener tipos dependientes no mejora la potencia computacional, solo la posibilidad de expresar propiedades de tipo más precisas. [7]
La regla de conversión es muy necesaria cuando se trabaja con tipos dependientes, porque permite realizar cálculos sobre los términos del tipo. Por ejemplo, si se tiene y , se debe aplicar la regla de conversión [a] para obtener y poder escribir .
λω
En λω, el siguiente operador es definible, es decir . La derivación se puede obtener ya en λ2, sin embargo, el polimorfismo solo se puede definir si la regla también está presente.
Desde un punto de vista computacional, λω es extremadamente fuerte y ha sido considerado como base para lenguajes de programación. [10]
lambda
El cálculo de construcciones tiene tanto la expresividad predicativa de λP como el poder computacional de λω, de ahí que λC también se llame λPω, [1] : 130 por lo que es muy potente, tanto en el lado lógico como en el lado computacional.
Relación con otros sistemas
El sistema Automath es similar a λ2 desde un punto de vista lógico. Los lenguajes tipo ML , desde un punto de vista de tipificación, se encuentran en algún punto entre λ→ y λ2, ya que admiten un tipo restringido de tipos polimórficos, es decir, los tipos en forma normal prenex. Sin embargo, debido a que presentan algunos operadores de recursión, su poder de cálculo es mayor que el de λ2. [7] El sistema Coq se basa en una extensión de λC con una jerarquía lineal de universos, en lugar de solo uno no tipificable , y la capacidad de construir tipos inductivos.
Los sistemas de tipos puros pueden considerarse como una generalización del cubo, con un conjunto arbitrario de ordenaciones, axiomas, productos y reglas de abstracción. Por el contrario, los sistemas del cubo lambda pueden expresarse como sistemas de tipos puros con dos ordenaciones , el único axioma y un conjunto de reglas tales que . [1]
A través del isomorfismo de Curry-Howard, existe una correspondencia uno a uno entre los sistemas del cubo lambda y los sistemas lógicos, [1] a saber:
Todas las lógicas son implicativas (es decir, los únicos conectivos son y ), sin embargo, se pueden definir otros conectivos como o de manera impredicativa en lógicas de segundo orden y de orden superior. En las lógicas débiles de orden superior, hay variables para predicados de orden superior, pero no se puede realizar ninguna cuantificación sobre ellas.
Todo esto se puede demostrar en sistemas de tipos puros genéricos. [11]
Cualquier término bien tipificado en un sistema del cubo es fuertemente normalizante, [1] aunque esta propiedad no es común a todos los sistemas de tipos puros. Ningún sistema del cubo es Turing completo. [7]
Subtipificación
Sin embargo, la subtipificación no está representada en el cubo, aunque sistemas como , conocido como cuantificación acotada de orden superior, que combina la subtipificación y el polimorfismo, son de interés práctico y se pueden generalizar a operadores de tipo acotados. Se han realizado extensiones adicionales para permitir la definición de objetos puramente funcionales; estos sistemas se desarrollaron generalmente después de que se publicara el artículo sobre el cubo lambda. [12]
La idea del cubo se debe al matemático Henk Barendregt (1991). El marco de trabajo de los sistemas de tipos puros generaliza el cubo lambda en el sentido de que todos los vértices del cubo, así como muchos otros sistemas, pueden representarse como instancias de este marco de trabajo general. [13] Este marco de trabajo es anterior al cubo lambda en un par de años. En su artículo de 1991, Barendregt también define los vértices del cubo en este marco de trabajo.
Véase también
En su Habilitation à diriger les recherches , [14] Olivier Ridoux proporciona una plantilla recortada del cubo lambda y también una representación dual del cubo como octaedro, donde los 8 vértices son reemplazados por caras, así como una representación dual como dodecaedro, donde las 12 aristas son reemplazadas por caras.
Notas
^ abcdef Barendregt, Henk (1991). "Introducción a los sistemas de tipos generalizados". Revista de programación funcional . 1 (2): 125–154. doi :10.1017/s0956796800020025. hdl : 2066/17240 . ISSN 0956-7968. S2CID 44757552.
^ Nederpelt, Rob; Geuvers, Herman (2014). Teoría de tipos y demostración formal. Cambridge University Press. pág. 69. ISBN9781107036505.
^ Nederpelt y Geuvers 2014, pág. 85
^ Nederpelt y Geuvers 2014, pág. 100
^ Schwichtenberg, Helmut (1975). "Definierbare Funktionen imλ-Kalkül mit Typen". Archiv für Mathematische Logik und Grundlagenforschung (en alemán). 17 (3–4): 113–114. doi :10.1007/bf02276799. ISSN 0933-5846. S2CID 11598130.
^ Girard, Jean-Yves; Lafont, Yves; Taylor, Paul (1989). Pruebas y tipos . Cambridge Tracts in Theoretical Computer Science. Vol. 7. Cambridge University Press. ISBN9780521371810.
^ abc Ridoux, Olivier (1998). Lambda-Prolog de A à Z... ou presque (PDF) . [número] OCLC 494473554.
^ Angiuli, Carlo; Gratzer, Daniel (2024). "2.1.3 ¿Quién verifica las reglas de tipificación? y 2.2 Hacia la sintaxis de la teoría de tipos dependientes". Principios de la teoría de tipos dependientes (PDF) . Universidad de Indiana y Universidad de Aarhus . Consultado el 7 de septiembre de 2024 .
^ Favier, Naïm (17 de agosto de 2023). «En la regla de inferencia de conversión del cubo lambda, ¿por qué es necesario Γ ⊢ B′:s?». Stack Exchange en Ciencias de la Computación . Consultado el 7 de septiembre de 2024 .
^ Pierce, Benjamin; Dietzen, Scott; Michaylov, Spiro (1989). Programación en cálculos lambda tipados de orden superior . Departamento de Ciencias de la Computación, Universidad Carnegie Mellon. OCLC 20442222. CMU-CS-89-111 ERGO-89-075.
^ Sørensen, Morten Heine; Urzyczyin, Pawel (2006). "Sistemas de tipos puros y el λ-cubo". Lecciones sobre el isomorfismo de Curry-Howard . Elsevier. págs. 343–359. doi :10.1016/s0049-237x(06)80015-7. ISBN9780444520777.
^ Pierce, Benjamin (2002). Tipos y lenguajes de programación . MIT Press. pp. 467–490. ISBN978-0262162098.OCLC 300712077 .
^ Pierce 2002, pág. 466
^ Ridoux 1998, pág. 70
^ La suposición de la regla de conversión es una conveniencia; en su lugar, se podría demostrar un metateorema que ... [8] [9]
Lectura adicional
Peyton Jones, Simon; Meijer, Erik (1997). "Henk: A Typed Intermediate Language" (PDF) . Microsoft . Henk se basa directamente en el cubo lambda, una familia expresiva de cálculos lambda tipados.