Je pense que la réponse à la première question est qu’en général, c’est trop de travail avec les outils actuels. Pour en comprendre le sens, je suggère d'essayer de prouver l'exactitude de Bubble Sort dans Coq (ou, si vous préférez, un peu plus de défi, utilisez Tri rapide). Je ne pense pas qu'il soit raisonnable de s'attendre à ce que les programmeurs écrivent des programmes vérifiés tant que prouver l'exactitude de tels algorithmes de base est si difficile et prend beaucoup de temps.
Cette question revient à demander pourquoi les mathématiciens n'écrivent pas de preuves formelles vérifiables par des vérificateurs de épreuves. Écrire un programme avec une preuve formelle d’exactitude signifie prouver un théorème mathématique sur le code écrit, et la réponse à cette question s’applique également à votre question.
Cela ne signifie pas qu'il n'y a pas eu de cas réussis de programmes vérifiés. Je sais qu'il existe des groupes qui prouvent le bien-fondé de systèmes tels que l'hyperviseur de Microsoft . Un cas connexe est le compilateur C vérifié de Microsoft . Mais en général, les outils actuels ont besoin de beaucoup de développement (y compris leurs aspects SE et HCI) avant de devenir utiles pour les programmeurs généraux (et les mathématiciens).
En ce qui concerne le dernier paragraphe de la réponse de Neel sur la croissance de la taille du programme pour les langues ne comportant que des fonctions totales, il est en fait facile de prouver encore plus (si j'ai bien compris). Il est raisonnable de s’attendre à ce que la syntaxe de tout langage de programmation soit identique à celle de l’ensemble des fonctions calculables. Ainsi, pour tout langage de programmation où tous les programmes sont complets, il existe une fonction totale calculable qui ne peut être calculée par aucun programme ( de toute taille) dans cette langue.
Pour la deuxième question, j'ai déjà répondu à une question similaire sur le blog de Scott. Fondamentalement, si la classe de complexité a une belle caractérisation et peut être représentée de manière calculable (c'est-à-dire ce que c'est), nous pouvons alors prouver que certaines représentations des problèmes de la classe de complexité sont manifestement totales dans une théorie très faible correspondant à la classe de complexité. L’idée de base est que les fonctions prouvables de la théorie contiennent toutes les et un problème qui est A C 0AC0AC0-complete pour la classe de complexité, elle contient donc tous les problèmes de la classe de complexité et peut prouver la totalité de ces programmes. La relation entre les preuves et la théorie de la complexité est étudiée dans la complexité des preuves, voir le livre récent de SA Cook et P. Nguyen " Fondements logiques de la complexité de la preuve " si vous êtes intéressé. (Un brouillon de 2008 est disponible.) La réponse de base est donc que pour beaucoup de classes "Provably C = C".
Ce n'est pas vrai en général car il existe des classes de complexité sémantique qui ne possèdent pas de caractérisation syntaxique, par exemple des fonctions calculables totales. Si, par récursif, vous entendez des fonctions récursives totales, alors les deux ne sont pas égaux et l'ensemble des fonctions calculables qui sont vraisemblablement totales dans une théorie est bien étudié dans la littérature sur la théorie de la preuve et sont appelées les fonctions prouvables totales de la théorie. Par exemple: les fonctions prouvables de sont des fonctions récursives ϵ 0 (ou des fonctions équivalentes dans le système T de Godel ), les fonctions prouvables dePAϵ0T sont fonctionnelles dans le système F de Girard, les fonctions prouvables de totalPA2F sont des fonctions récursives primitives, ....IΣ1
Mais il ne me semble pas que cela signifie beaucoup dans le contexte de la vérification de programme, car il existe également des programmes qui calculent par extension la même fonction, mais nous ne pouvons pas prouver que les deux programmes calculent la même fonction, c'est-à-dire que les programmes sont par extension égaux mais non intentionnellement. (Cela ressemble à l’Étoile du matin et à l’Étoile du soir.) En outre, il est facile de modifier un programme total vérifiable pour en obtenir un dont la théorie est incapable de prouver sa totalité.
Je pense que les deux questions sont liées. L'objectif est d'obtenir un programme vérifié. Un programme vérifié signifie que le programme satisfait à une description, qui est un énoncé mathématique. Une solution consiste à écrire un programme dans un langage de programmation, puis à en prouver les propriétés, comme il satisfait à la description, ce qui est la pratique la plus courante. Une autre option consiste à essayer de prouver l'énoncé mathématique décrivant le problème à l'aide de moyens restreints, puis à en extraire un programme vérifié. Par exemple, si nous prouvons dans la théorie correspondant à que pour un nombre donné n, il existe une suite de nombres premiers dont le produit est égal à n , alors nous pouvons extraire un PPnnPalgorithme de factorisation à partir de la preuve. (Il existe également des chercheurs qui tentent d’automatiser autant que possible la première approche, mais la vérification des propriétés non triviales intéressantes des programmes est difficile en termes de calcul et ne peut pas être entièrement vérifiée sans faux positifs et négatifs.)