¿Cómo se obtiene el cálculo de construcciones de los otros puntos en el Cubo Lambda?

21

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.

indil
fuente
1
Por lo menos esto debería ser un 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?
Andrej Bauer
3
@AndrejBauer No es la pregunta: ¿Cuál es la relación entre la presentación Barendregt-cube / PTS del CoC y la presentación original de Coquand & Huet?
Martin Berger
1
@AndrejBauer: La pregunta también parece ser preguntar sobre la diferencia en la presentación de CoC (en cualquier forma) y el énfasis en ciertas características en la práctica. Es cierto que la versión de CoC orientada a PTS enfatiza algunas características como importantes, mientras que la práctica de Coq enfatiza otras. Estoy de acuerdo en que debe tener la etiqueta de pregunta suave.
Jacques Carette
1
Me alegra ver que alguien podrá responder esto.
Andrej Bauer

Respuestas:

28

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 py 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 → kque es el tipo de funciones de nivel de tipo, y la abstracción λa:k.Ay aplicación también A Ba 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. Acuál es un formador de tipo polimórfico, y en el nivel de término, agregamos abstracción sobre tipos Λa:k. ey 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.By 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.By 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.Aabstracción de tipo polimórfico y una abstracción a nivel de término Λa:k. ey 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.

Neel Krishnaswami
fuente
3
Por supuesto, técnicamente el CoC (sin axiomas) tiene al menos tantos modelos de teoría de conjuntos como el CiC, simplemente no son muy buenos para modelar la situación que queremos, que es el CoC con axiomas para los números naturales (digamos, ). 0 01
cody
2
También agradecería una referencia sobre la conservadurismo de sobre el STLC. Esto parece no obvio. λω_ _
cody
3
@cody: No conozco una referencia: ¡Kevin Watkins dibujó la prueba para mí en una pizarra! La idea es que tome un término escrito en λω_, ponga todos los tipos en forma beta-normal eta-larga, y luego lo incorpore en STLC introduciendo un tipo atómico nuevo para cada forma normal distinta en el programa original. Entonces es obvio que las secuencias de reducción deben alinearse uno a uno.
Neel Krishnaswami
1
0 01norteunat
1
Usted dice que Fw es "mucho más poderoso" que el Sistema F. ¿Tiene alguna referencia para esto? En particular, ¿hay una función en los números naturales que sea total demostrable en Fw pero no en F?
Thorsten Altenkirch
21

λ

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

ΓUNA:sΓ,X:UNAsi:kΓΠX:UNA.si : k (s,k)R

s,kS(s,k)RS

SRΠX:UNA.si

S

{,}
R={(,),(,),(,),(,)}

Y entonces tenemos 4 reglas que corresponden a 4 propósitos diferentes:

  • (,)

  • (,)

  • (,)

  • (,)

Explicaré cada uno de estos con más detalle.


UNAsiΠX:UNA.siXsi

norteunatsioolX=yXy

lyostlyost:lyostnorteunat,lyostsiool(,)

Πt:. tt
λ(t:)(X:t).XΠt:._ _(,)tt(,)

UNAsi: =Πt:. (UNAsit)t
UNAsi: =Πt:. (UNAt)(sit)t
: =Πt:. t
: =Πt:. tt
X:UNA. PAGS(X): =Πt:. (Πy:UNA. PAGS(y)t)t
(,)

(,)

(,)

Πdo:.  do norteunatdo norteunat

0 0=1

= : norteunatnorteunat
= : Πt:. tt
norteunatnorteunat(,)

yoyo=1,2,3,...yo:yo+1

(yo,yo)

ΓUNA:yoΓUNA:j yoj

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.

cody
fuente
2
Temas avanzados en tipos y lenguajes de programación, S2.6 y S2.7 .
Kaveh
2
Por cierto, las "familias de tipos" a menudo también se denominan tipos de tipo superior.
Martin Berger
1
PTS fue una buena idea hace 20 años, pero las cosas han avanzado desde entonces.
Thorsten Altenkirch
@ThorstenAltenkirch no hay necesidad de exclusionismo, Thorsten! Todavía hay algunas cosas divertidas para considerar involucrando PTSes, por ejemplo, el trabajo de Bernardy sobre parametricidad internalizada viene a mi mente.
cody
@cody No se pretende excluir el exclusionismo, pero no debemos quedarnos atascados en el pasado de la teoría de tipos sintácticos. El trabajo de Bernardi es excelente y se puede hacer mejor usando universos.
Thorsten Altenkirch