¡Esta es una pregunta interesante! Como sugiere la respuesta de Anthony, uno puede usar los enfoques habituales para compilar un lenguaje funcional no dependiente, siempre que ya tenga un intérprete para evaluar los términos para la verificación de tipo .
Este es el enfoque adoptado por Edwin Brady. Ahora, esto es conceptualmente más simple, pero pierde las ventajas de velocidad de la compilación cuando se realiza la verificación de tipo. Esto se ha abordado de varias maneras.
Primero, uno puede implementar una máquina virtual que compila términos para codificar en bytes sobre la marcha para realizar la verificación de conversión. Esta es la idea detrás vm_compute
implementada en Coq por Benjamin Gregoire . Aparentemente también existe esta tesis de Dirk Kleeblatt sobre este tema exacto, pero desciende el código de máquina real en lugar de una máquina virtual.
En segundo lugar, uno puede generar código en un lenguaje más convencional que, después de la ejecución, verifica todas las conversiones necesarias para verificar un programa mecanografiado de forma dependiente. Esto significa que podemos usar Haskell, por ejemplo, para verificar el tipo de un módulo Agda. El código puede compilarse y ejecutarse, y si acepta, entonces se puede suponer que el código en el lenguaje de tipo dependiente está bien escrito (salvo la implementación y los errores del compilador). Escuché por primera vez este enfoque sugerido por Mathieu Boesflug .
∗
ocamlopt
o GHC :-) (Este es el enfoque de Coq y Agda, por cierto.)