Les questions que vous posez sont en fait assez différentes.
Cependant, je ne sais pas dans quelle mesure cela s'applique aux programmes du monde réel comme les systèmes d'exploitation. Ces types de programmes ont-ils besoin de toute la force de l'exhaustivité de Turing?
Il faut extrêmement peu de temps pour qu'un modèle de calcul soit complet. Par exemple, différents modèles avec compteurs peuvent simuler des machines de Turing. Si vous pensez que votre logiciel nécessite plus de deux compteurs que vous pouvez manipuler arbitrairement, vous utilisez un langage complet de Turing. Bien que les entiers machine soient bornés a priori, les structures de données allouées en tas ne le sont généralement pas. Si votre logiciel a besoin de listes, d'arbres et d'autres données allouées dynamiquement, vous utilisez un langage complet de Turing.
Existe-t-il des modèles de calcul plus simples (tels que PR) dans lesquels ces applications pourraient être écrites? Si oui, dans quelle mesure cela permet-il de déterminer la justesse du programme?
Il est important de reconnaître que nous ne voulons pas vérifier les propriétés arbitraires de notre logiciel. La vérification de propriétés très spécifiques et étroites (pas de débordements de tampon, pas de déréférences de pointeur nul, pas de boucles infinies, etc.) améliore énormément la qualité et l'utilisabilité du logiciel. En théorie, de tels problèmes sont encore indécidables. En pratique, se concentrer sur des propriétés spécifiques nous permet de découvrir dans nos programmes une structure que nous pouvons souvent exploiter pour résoudre le problème.
En particulier, vous pouvez modifier votre question d'origine en
Existe-t-il une abstraction de mon logiciel que je peux analyser efficacement dans un modèle complet non Turing?
Une abstraction est un modèle qui inclut le comportement du logiciel d'origine et éventuellement de nombreux comportements supplémentaires. Il existe des modèles tels que les machines à guichet unique ou les systèmes de refoulement qui ne sont pas complets et que nous pouvons analyser. L'approche standard de la vérification de programme avec des outils automatisés consiste à construire une abstraction dans un tel modèle et à la vérifier algorithmiquement.
Il existe des applications où les gens se soucient des propriétés sophistiquées de leur matériel ou de leurs logiciels. Les entreprises de matériel informatique souhaitent que leurs puces implémentent correctement des algorithmes arithmétiques, les entreprises automobiles et avioniques souhaitent des logiciels certes corrects. Si c'est si important, il vaut mieux utiliser un être humain (formé).