Le domande che fai sono in realtà abbastanza diverse.
Tuttavia, non sono sicuro fino a che punto questo si applichi ai programmi operativi come i programmi del mondo reale. Questi tipi di programmi necessitano della piena forza della completezza di Turing?
Ci vuole davvero poco perché un modello di calcolo sia completo di Turing. Ad esempio, vari modelli con contatori possono simulare le macchine di Turing. Se ritieni che il tuo software richieda più di due contatori che puoi manipolare arbitrariamente, stai usando un linguaggio completo Turing. Sebbene i numeri interi di macchina siano limitati ad apriori, le strutture dati allocate in heap di solito non lo sono. Se il tuo software necessita di elenchi, alberi e altri dati allocati dinamicamente, stai utilizzando un linguaggio completo Turing.
Esistono modelli più semplici di calcolo (come PR) in cui è possibile scrivere queste applicazioni? In tal caso, in che misura ciò consente la decidibilità della correttezza del programma?
È importante riconoscere che non vogliamo controllare le proprietà arbitrarie del nostro software. Il controllo di proprietà molto specifiche e ristrette (nessun overflow del buffer, nessuna dereferenza con puntatore nullo, nessun loop infinito, ecc.) Migliora immensamente la qualità e l'usabilità del software. In teoria, tali problemi sono ancora indecidibili. In pratica, concentrarsi su proprietà specifiche ci consente di scoprire la struttura dei nostri programmi che spesso possiamo sfruttare per risolvere il problema.
In particolare, è possibile modificare la domanda originale in
Esiste un'astrazione del mio software che posso analizzare in modo efficiente in un modello completo senza Turing?
Un'astrazione è un modello che include il comportamento del software originale e probabilmente molti altri comportamenti. Esistono modelli come macchine a un contatore o sistemi pushdown che non sono completi di Turing e che possiamo analizzare. L'approccio standard nella verifica del programma con strumenti automatizzati consiste nel costruire un'astrazione in un tale modello e verificarlo algoritmicamente.
Ci sono applicazioni in cui le persone si preoccupano delle proprietà sofisticate del loro hardware o software. Le aziende produttrici di hardware desiderano che i loro chip implementino correttamente algoritmi aritmetici, le aziende automobilistiche e avioniche desiderano software correttamente certi. Se è così importante, è meglio usare un essere umano (addestrato).