Se dice que el CoC es la culminación de las tres dimensiones del Cubo Lambda. Esto no es aparente para mí en absoluto. Creo que entiendo las dimensiones individuales, y la combinación de cualquiera de los dos parece resultar en una unión relativamente sencilla (¿tal vez me falta algo?). Pero cuando miro el CoC, en lugar de parecer una combinación de los tres, parece una cosa completamente diferente. ¿De qué dimensión provienen Type, Prop y los tipos pequeño / grande? ¿Dónde desaparecieron los productos dependientes? ¿Y por qué hay un enfoque en proposiciones y pruebas en lugar de tipos y programas? ¿Hay algo equivalente que se centre en tipos y programas?
Editar: en caso de que no esté claro, solicito una explicación de cómo el CoC es equivalente a la unión directa de las dimensiones del Cubo Lambda. ¿Y hay una unión real de los tres en algún lugar que pueda estudiar (es decir, en términos de programas y tipos, no de pruebas y proposiciones)? Esto es en respuesta a los comentarios sobre la pregunta, no a las respuestas actuales.
soft-question
. No veo una pregunta realmente técnica aquí. ¿Quizás puedas ser un poco más específico en cuanto a lo que estás preguntando?Respuestas:
Primero, para reiterar uno de los puntos de Cody, el cálculo de construcciones inductivas (en el que se basa el núcleo de Coq) es muy diferente del cálculo de construcciones. Es mejor pensar que comienza en la teoría de tipos Martin-Löf con universos, y luego agrega una especie de Prop en la parte inferior de la jerarquía de tipos. Esta es una bestia muy diferente al CoC original, que se considera mejor como una versión dependiente de F-omega. (Por ejemplo, CiC tiene modelos teóricos de conjuntos y el CoC no).
Dicho esto, el cubo lambda (del cual el CoC es miembro) generalmente se presenta como un sistema de tipo puro por razones de economía en el número de reglas de escritura. Al tratar las clases, los tipos y los términos como elementos de la misma categoría sintáctica, puede escribir muchas menos reglas y sus pruebas también serán un poco menos redundantes.
Sin embargo, para comprender, puede ser útil separar las diferentes categorías explícitamente. Podemos introducir tres categorías sintácticas, tipos (ordenados por la metavariable
k
), tipos (ordenados por la metavariableA
) y términos (ordenados por la metavariablee
). Entonces, los ocho sistemas pueden entenderse como variaciones de lo que está permitido en cada uno de los tres niveles.λ → (cálculo lambda de tipo simple)
Este es el cálculo básico tipo lambda. Hay un solo tipo
∗
, que es el tipo de tipos. Los tipos en sí son tipos atómicosp
y tipos de funcionesA → B
. Los términos son variables, abstracciones o aplicaciones.λω_ (STLC + operadores de tipo de tipo superior)
El STLC solo permite la abstracción a nivel de términos. Si lo agregamos a nivel de tipos, entonces agregamos un nuevo tipo
k → k
que es el tipo de funciones de nivel de tipo, y la abstracciónλa:k.A
y aplicación tambiénA B
a nivel de tipo. Entonces ahora no tenemos polimorfismo, pero tenemos operadores de tipo.Si la memoria sirve, este sistema no tiene más potencia computacional que el STLC; solo te da la capacidad de abreviar tipos.
λ2 (Sistema F)
En lugar de agregar operadores de tipo, podríamos haber agregado polimorfismo. En el nivel de tipo, agregamos
∀a:k. A
cuál es un formador de tipo polimórfico, y en el nivel de término, agregamos abstracción sobre tiposΛa:k. e
y aplicación de tipoe [A]
.Este sistema es mucho más poderoso que el STLC: es tan fuerte como la aritmética de segundo orden.
λω (Sistema F-omega)
Si tenemos operadores tipo y polimorfismo, obtenemos F-omega. Este sistema es más o menos la teoría del tipo de núcleo de la mayoría de los lenguajes funcionales modernos (como ML y Haskell). También es mucho más poderoso que el Sistema F: es equivalente en fuerza a la aritmética de orden superior.
λP (LF)
En lugar del polimorfismo, podríamos haber ido en la dirección de la dependencia del cálculo lambda de tipo simple. Si permitiste que el tipo de función permitiera que su argumento se usara en el tipo de retorno (es decir, escribir en
Πx:A. B(x)
lugar deA → B
), entonces obtienes λP. Para que esto sea realmente útil, tenemos que extender el conjunto de tipos con un tipo de operadores de tipo que toman términos como argumentosΠx:A. k
, por lo que también tenemos que agregar una abstracciónΛx:A.B
y aplicación correspondienteA [e]
en el nivel de tipo.Este sistema a veces se llama LF, o el Marco lógico de Edimburgo.
Tiene la misma fuerza computacional que el cálculo lambda de tipo simple.
λP2 (sin nombre especial)
También podemos agregar polimorfismo a λP, para obtener λP2. Este sistema no se usa con frecuencia, por lo que no tiene un nombre en particular. (El único artículo que he leído que lo usó es la inducción de Herman Geuvers no es derivable en la teoría del tipo dependiente de segundo orden ).
Este sistema tiene la misma fuerza que el Sistema F.
λPω_ (sin nombre especial)
También podríamos agregar operadores de tipo a λP, para obtener λPω_. Esto implica agregar un tipo
Πa:k. k'
para operadores de tipo, y la abstracciónΛx:A.B
y aplicación de nivel de tipo correspondienteA [e]
.Dado que nuevamente no hay un salto en la fuerza computacional sobre el STLC, este sistema también debería ser una buena base para un marco lógico, pero nadie lo ha hecho.
λPω (el cálculo de las construcciones)
Finalmente, llegamos a λPω, el cálculo de construcciones, tomando λPω_ y agregando una
∀a:k.A
abstracción de tipo polimórfico y una abstracción a nivel de términoΛa:k. e
y su aplicacióne [A]
.Los tipos de este sistema son mucho más expresivos que en F-omega, pero tiene la misma fuerza computacional.
fuente
Pero primero, uno probablemente debería tratar de desenredar varios problemas. El probador de teoremas interactivo de Coq se basa en una teoría de tipos subyacente, a veces llamada amorosamente cálculo de construcciones inductivas con universos . Notarás que esto es más bocado que simplemente "Cálculo de construcciones", y de hecho, hay muchas más cosas allí que solo el CoC. En particular, creo que está confundido acerca de qué características están en CoC propiamente dicho. En particular, la distinción Set / Prop y los universos no aparecen en CoC.
No daré una descripción completa de Pure Type Systems aquí, pero la regla importante (para PTS funcionales como el CoC) es la siguiente
Y entonces tenemos 4 reglas que corresponden a 4 propósitos diferentes:
Explicaré cada uno de estos con más detalle.
Con estos tipos y reglas adicionales, obtienes algo que no es un PTS, sino algo cercano. Este es (casi) el cálculo extendido de construcciones , que está más cerca de la base de Coq. La gran pieza que falta aquí son los tipos inductivos, que no discutiré aquí.
Editar: Hay una referencia bastante agradable que describe varias características de los lenguajes de programación en el marco de los PTS, al describir un PTS que es un buen candidato para una representación intermedia de un lenguaje de programación funcional:
Henk: A Typed Intermediate Language , SP Jones y E. Meijer.
fuente