¿Qué ganamos al tener "tipos dependientes"?

13

Pensé que entendía el tipeo dependiente (DT) correctamente, pero la respuesta a esta pregunta: /cstheory/30651/why-was-there-a-need-for-martin-l%C3% B6f-to-create-intuitionistic-type-theory me ha hecho pensar lo contrario.

Después de leer sobre DT y tratar de entender lo que son, intento preguntarme, ¿qué ganamos con esta noción de DT? Parecen ser más flexibles y poderosos que simplemente el cálculo lambda mecanografiado (STLC), aunque no puedo entender exactamente "cómo / por qué".

¿Qué es lo que podemos hacer con DT que no se pueden hacer con STLC? Parece que agregar DT hace que la teoría sea más complicada, pero ¿cuál es el beneficio?

De la respuesta a la pregunta anterior:

De Bruijn y Howard propusieron tipos dependientes que querían extender la correspondencia de Curry-Howard de la lógica proposicional a la de primer orden.

Esto parece tener sentido en algún nivel, pero todavía soy incapaz de comprender el panorama general de "cómo / por qué"? ¿Quizás un ejemplo explícitamente muestre que esta extensión de la correspondencia CH a la lógica FO podría ayudar a dar en el blanco para entender cuál es el problema con los DT? No estoy seguro de comprender esto tan bien como debería.

Doctor
fuente
1
¿Los has buscado en Google? ¿Has oído hablar de Coq, un probador de teoremas basado en tipos dependientes? ¿Sabías que el teorema de 4 colores ha demostrado usar Coq?
Dave Clarke
2
En realidad lo hice. Lo que es difícil para Google es ese "poder" adicional (por falta de una palabra mejor) que los DT prestan a la teoría de tipos, hablando intuitivamente.
Doctorado
1
¿Por qué? Los tipos dependientes le permiten escribir más programas sin dejar de ser seguros. ¿Cómo? Al parametrizar tipos con programas.
Martin Berger
@MartinBerger - ¿Puedes por favor elaborar "más programas"? ¿Qué "más" puedo hacer o necesitar, desde un punto de vista teórico?
PhD
2
@DaveClarke That Coq, con sus tipos elegantes, se ha utilizado para hacer cosas elegantes, no implica que esas cosas elegantes requieran esos tipos elegantes. Por ejemplo, Twelf ha tenido grandes éxitos (como una prueba de corrección de SML), y es solo de segundo orden, no de orden superior. He visto algunos sistemas bastante grandes probados solo con lógica de primer orden.
Gilles 'SO- deja de ser malvado'

Respuestas:

22

Ampliando mi comentario: los tipos dependientes pueden escribir más programas. "Más" simplemente significa que el conjunto de programas tipificables con tipos dependientes es un superconjunto adecuado de los programas tipificables en el cálculo tipo simple (STLC). Un ejemplo sería L i s t 2 3 + 4 ( α ) , las listas de longitud 10 , que llevan elementos de tipo α . La expresión 2 3 + 4 es al mismo tiempo un programa y parte de un tipo. No puede hacer esto en el STLC.λList23+4(α)10α23+4

La regla clave que distingue los tipos dependientes de los no dependientes es la aplicación:

ΓM:ABΓN:AΓMN:BΓM:ΠxA.BΓN:AΓMN:B{N/x}

A la izquierda tiene el STLC, donde los programas en las premisas 'fluyen' solo al programa de la conclusión. En contraste, en la regla de aplicación dependiente de la derecha, el programa de la premisa derecha 'fluye' al tipo en la conclusión .1N1

Para poder parametrizar los tipos por programas, la sintaxis de los tipos dependientes debe ser más rica, y para garantizar que los tipos estén bien formados, utilizamos un segundo 'sistema de tipeo' llamado clases que restringe los tipos. Este sistema de clasificación es esencialmente el STLC, pero "un nivel más".

Hay muchas explicaciones de los tipos dependientes. Algunos ejemplos.


1 En términos de colores: con tipos no dependientes, las expresiones negras en la conclusión se construyen a partir de expresiones negras en las premisas, mientras que las expresiones rojas en la conclusión se construyen a partir de expresiones rojas en las premisas. Con tipos dependientes, los colores se pueden mezclar haciendo que las partes negras de la conclusión se construyan a partir de partes rojas y negras de la premisa.

Martin Berger
fuente
Ahora, eso tiene mucho sentido. Puede haber sido obvio, pero por alguna razón no pude señalarlo. Aprecio la transición de comentario a respuesta. Desafortunadamente, la pregunta ha sido votada para el cierre, pero me alegro por la respuesta :)
PhD
1
No estoy loco por su ejemplo, ya que la longitud de la lista es solo algo que podría borrar en tipos y hacer que los programas hablen de listas normales (no indexadas). Puede ser útil tener en cuenta que hay tipos que no permanecen bien escritos después de este tipo de borrado, por ejemplo, un programa de tipo , donde y . A r r 0 = n a t A r r ( n + 1 ) = n a tA r r nArr nArr 0=natArr (n+1)=natArr n
cody
@ Cody, no estoy seguro de lo que quieres decir. Los tipos dependientes tienen (o pueden configurarse para que tengan) borrado de tipo en el siguiente sentido: para todos los tipos P: iff , donde es la relación de reducción de tiempo de ejecución . (Esta es una descripción simplificada donde la función borra programas de mapas con anotaciones de tipo a "los mismos" programas sin anotaciones). ¿Quizás quiere decir algo diferente? e r a s e ( P ) e r a s e ( V ) PVerase(P)erase(V)
Martin Berger
@ MartinBerger: sí, en este caso estoy hablando de borrar dependencias en tipos dependientes para obtener tipos simples. El único ejemplo que puedo señalar ahora es la prueba de que normaliza si se normaliza iff (por ejemplo, en el libro de Barendregt ). C o CFωCoC
cody
@cody Creo que es inusual llamar a este tipo de borrado. ¿Cuál es un mejor nombre? Tal vez la simplificación de tipo?
Martin Berger
2

Piense en las declaraciones de tipo como nada más que afirmaciones. Actualmente, todo lo que puede decir es cosas como isInt32 (), isCharPtr (), etc. Estas diversas afirmaciones se eligen para que se puedan verificar en tiempo de compilación. Pero este concepto se puede ampliar a cosas como: isCharPtr () && isNotNull (). Los punteros anulables son un gran problema. Los punteros no deben ser anulables como la posición predeterminada, ya que los punteros anulables son un tipo que no puede ser desreferenciable sin saber si es nulo o no. Problemas similares son cosas como: isPositiveInteger () o isEvenNaturalNumber ().

Robar
fuente