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?