Um objetivo importante dos métodos formais é provar a correção dos sistemas, por meios automatizados ou direcionados ao homem. No entanto, parece que, mesmo que você possa fornecer uma prova de correção, NÃO poderá garantir que o sistema não falhará. Por exemplo:
- A especificação pode não modelar o sistema corretamente, ou um sistema de produção pode ser muito complicado para modelar ou o sistema pode ter falhas inerentes devido a requisitos contraditórios. Que técnicas são conhecidas para testar se uma especificação faz algum sentido?
- O processo de prova também pode falhar! Quem sabe que essas regras de inferência são corretas e legítimas? Além disso, as provas podem ser muito grandes, e como sabemos que elas não contêm erros? Este é o coração da crítica nos "Processos sociais e provas de teoremas e programas" de De Millo, Lipton e Perlis. Como os pesquisadores de métodos formais modernos respondem a essa crítica?
- No tempo de execução, existem muitos eventos e fatores não determinísticos que podem afetar seriamente o sistema. Por exemplo, os raios cósmicos podem alterar a RAM de maneiras imprevisíveis e, geralmente, não temos garantias de que o hardware não sofra falhas bizantinas, o que Lamport provou ser muito difícil de ser robusto. Portanto, a correção do sistema estático não garante que o sistema não falhe! Existem técnicas conhecidas para explicar a falibilidade de hardware real?
- Atualmente, o teste é a ferramenta mais importante que temos para estabelecer que o software funciona. Parece que deveria ser uma ferramenta complementar com métodos formais. No entanto, vejo principalmente pesquisas focadas em métodos ou testes formais. O que se sabe sobre a combinação dos dois?