Un objetivo importante de los métodos formales es demostrar la corrección de los sistemas, ya sea por medios automatizados o dirigidos por humanos. Sin embargo, parece que incluso si puede proporcionar una prueba de corrección, es posible que NO pueda garantizar que el sistema no falle. Por ejemplo:
- La especificación puede no modelar el sistema correctamente, o un sistema de producción puede ser demasiado complicado para modelar, o el sistema puede ser inherentemente defectuoso debido a requisitos contradictorios. ¿Qué técnicas se conocen para probar si una especificación tiene algún sentido?
- ¡El proceso de prueba también puede ser defectuoso! ¿Quién sabe que esas reglas de inferencia son correctas y legítimas? Además, las pruebas pueden ser muy grandes, y ¿cómo sabemos que no contienen errores? Este es el corazón de la crítica en "Procesos sociales y pruebas de teoremas y programas" de de Millo, Lipton y Perlis. ¿Cómo responden los investigadores de métodos formales modernos a esta crítica?
- En tiempo de ejecución, hay muchos eventos y factores no deterministas que pueden afectar seriamente el sistema. Por ejemplo, los rayos cósmicos pueden alterar la RAM de maneras impredecibles y, en general, no tenemos garantías de que el hardware no sufrirá fallas bizantinas, que Lamport ha demostrado que son muy difíciles de resistir. ¡Entonces la corrección del sistema estático no garantiza que el sistema no falle! ¿Hay alguna técnica conocida para explicar la falibilidad del hardware real?
- En la actualidad, las pruebas son la herramienta más importante que tenemos para establecer que el software funciona. Parece que debería ser una herramienta complementaria con métodos formales. Sin embargo, principalmente veo investigaciones que se centran en métodos formales o pruebas. ¿Qué se sabe sobre combinar los dos?