Recientemente intenté implementar Aaron's Cedille-Core , un lenguaje de programación minimalista capaz de probar teoremas matemáticos sobre sus propios términos. También probé la inducción de tipos de datos codificados con λ, lo que dejó en claro por qué serían necesarias sus extensiones.
Menos aún, todavía me pregunto de dónde provienen esas extensiones. ¿Por qué son lo que son? ¿Qué los justifica? Sé, por ejemplo, que algunas extensiones, como la recursividad, arruinan el lenguaje como un sistema de pruebas. Si decidiera extender también CoC con otras primitivas, ¿cómo justificaría? Entiendo que es necesaria una prueba de normalización, pero eso no prueba que esas primitivas "tengan sentido".
En resumen, ¿qué es lo que califica específicamente un lenguaje (y su sistema de tipos) como un sistema capaz de probar teoremas sobre sus propios términos?
Respuestas:
[Sigue la autopublicidad, pero creo que esto es relevante.]
Por supuesto, también puede asumir equivalencias, y hay varias formas diferentes de cuantificadores (con tipo / sin tipo, universal / existencial). Este mecanismo se puede utilizar para razonar sobre cualquier programa (no es necesario que se pruebe que finalicen o incluso que se tipeen). La única restricción es que los programas que se utilizan como pruebas deben ser probados por el sistema (la recurrencia general arbitraria conduce a una inconsistencia).
Aquí hay un par de referencias si quieres ver esto:
fuente