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 metavariable A
) y términos (ordenados por la metavariable e
). 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)
k ::= ∗
A ::= p | A → B
e ::= x | λx:A.e | e e
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ómicos p
y tipos de funciones A → B
. Los términos son variables, abstracciones o aplicaciones.
λω_ (STLC + operadores de tipo de tipo superior)
k ::= ∗ | k → k
A ::= a | p | A → B | λa:k.A | A B
e ::= x | λx:A.e | e e
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én A 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)
k ::= ∗
A ::= a | p | A → B | ∀a:k. A
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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 tipo e [A]
.
Este sistema es mucho más poderoso que el STLC: es tan fuerte como la aritmética de segundo orden.
λω (Sistema F-omega)
k ::= ∗ | k → k
A ::= a | p | A → B | ∀a:k. A | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | Λx:A.B | A [e]
e ::= x | λx:A.e | e e
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 de A → 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 correspondiente A [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)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e
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 correspondiente A [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)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
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ón e [A]
.
Los tipos de este sistema son mucho más expresivos que en F-omega, pero tiene la misma fuerza computacional.
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?