¿Puede un sistema de tipos servir como asistente de prueba para funciones extranjeras?

9

Dado que:

  1. Un lenguaje con sistemas de tipos muy expresivos (por ejemplo, Idris ) también puede tener mecanismos de escape como interfaces de funciones foráneas / unsafePerformIO.
  2. Hay asistentes de prueba que pueden usarse para probar algunas propiedades de un programa escrito en un lenguaje que no tiene un sistema de tipos capaz de expresar esas propiedades.
  3. La correspondencia de Curry-Howard muestra que una implementación verificada con éxito de una función con un tipo dado es una prueba de lo que ese tipo expresa.

¿Se pueden expresar pruebas no triviales de alguna propiedad del código de idioma extranjero en el sistema de tipos del idioma nativo?

Por ejemplo, imagine que tengo una función C llamada stable_qsort que clasifica los números de una manera terriblemente inteligente y eficiente mientras mantiene el orden de elementos ya iguales, y un programa Idris que llama stable_qsort a través de su FFI, pero no confío en esto relativamente oscuro Función C. ¿Podría probar que la función no reordena elementos iguales, para todas las entradas, en mi código Idris en lugar de usar un asistente de prueba separado?

dukereg
fuente

Respuestas:

10

Larga historia corta: no, no puedes. Una función extranjera es como una caja negra y el tipo que le atribuye es una promesa que hace: en la correspondencia de Curry-Howard que correspondería a agregar un axioma a su teoría.

Dicho esto, hay formas. En Coq, por ejemplo, hay varias formalizaciones del estándar C (por ejemplo , el trabajo de Robbert Krebbers ). Debido a que tiene una representación explícita de los programas en C y su semántica, puede escribir su código directamente en el asistente de prueba y luego es posible probar algunas de sus propiedades.

gallais
fuente