Un obiettivo importante dei metodi formali è dimostrare la correttezza dei sistemi, sia con mezzi automatizzati che diretti all'uomo. Tuttavia, sembra che anche se è possibile fornire una prova di correttezza, NON si può essere in grado di garantire che il sistema non fallirà. Per esempio:
- Le specifiche potrebbero non modellare correttamente il sistema oppure un sistema di produzione potrebbe essere troppo complicato da modellare oppure il sistema potrebbe essere intrinsecamente difettoso a causa di requisiti contraddittori. Quali tecniche sono note per verificare se una specifica ha un senso del tutto?
- Anche il processo di prova può essere imperfetto! Chi sa che quelle regole di inferenza sono corrette e legittime? Inoltre, le prove possono essere molto grandi e come facciamo a sapere che non contengono errori? Questo è il cuore della critica in "Processi sociali e prove di teoremi e programmi" di Millo, Lipton e Perlis. In che modo i ricercatori sui metodi formali moderni rispondono a questa critica?
- In fase di esecuzione, ci sono molti eventi e fattori non deterministici che possono influenzare seriamente il sistema. Ad esempio, i raggi cosmici possono alterare la RAM in modi imprevedibili e, più in generale, non abbiamo garanzie che l'hardware non subisca guasti bizantini, contro i quali Lamport ha dimostrato di essere molto difficile da sostenere. Quindi la correttezza del sistema statico non garantisce che il sistema non fallisca! Esistono tecniche note per spiegare la fallibilità dell'hardware reale?
- Al momento, i test sono lo strumento più importante che abbiamo per stabilire che il software funziona. Sembra che dovrebbe essere uno strumento complementare con metodi formali. Tuttavia, vedo principalmente ricerche incentrate su metodi formali o test. Cosa si sa sulla combinazione dei due?