La question est assez large. Pour y répondre dans un espace raisonnable je ferai de nombreuses simplifications excessives.
Entendons-nous sur la terminologie. Un programme est correct lorsqu'il implique sa spécification. Cette vague déclaration est rendue précise à bien des égards, en épinglant exactement ce qu'est un programme et ce qui est exactement une spécification. Par exemple, dans la vérification des modèles, le programme est une structure Kripke et la spécification est souvent une formule LTL . Ou, le programme pourrait être une liste d'instructions PowerPC et la spécification pourrait être un ensemble d' assertions Hoare-Floyd écrites, disons, dans une logique de premier ordre. Il existe de très nombreuses variantes possibles. Il est tentant de conclure que dans un cas (structure Kripke) nous ne vérifions pas un programme réel, tandis que dans le second cas (liste d'instructions PowerPC) nous le faisons. Cependant, il est important de réaliser que nous examinons vraiment des modèles mathématiques dans les deux cas, et c'est parfaitement bien. (La situation est assez similaire à la physique où, par exemple, la mécanique classique est un modèle mathématique de la réalité.)
La plupart des formalisations distinguent la syntaxe et la sémantique d'un programme; c'est-à-dire, comment il est représenté et qu'est-ce que cela signifie. La sémantique d'un programme est ce qui compte du point de vue de la vérification du programme. Mais, il est bien sûr important d'avoir une manière claire d'attribuer des significations aux (représentations syntaxiques des) programmes. Deux méthodes populaires sont les suivantes:
- (petite étape) sémantique opérationnelle : Cela ressemble beaucoup à la définition d'un langage de programmation en lui écrivant un interpréteur. Pour cela, vous devez dire quel est l' état , et il est affecté par chaque déclaration dans la langue. (Vous vous demandez peut-être dans quelle langue vous écrivez l'interprète, mais je vais prétendre que vous ne l'êtes pas.)
- sémantique axiomatique : Ici, chaque type d'instruction est accompagné d'un schéma axiomatique . Donc, à peu près, chaque fois qu'une instruction particulière de ce type est utilisée, cela se traduit par la possibilité d'utiliser certains axiomes. Par exemple, l'affectation est fournie avec le schéma ; l'affectation particulière est accompagnée de l'axiome si nous instancions le schéma avec . { P [ x / e ] }x : = ex : = x + 1 { x + 1 = 1 }{ P[ x / e ] }x : = e{ P}x : = x + 1P = ( x = 1 ){ x + 1 = 1 }x : = x + 1{ x = 1 }P=(x=1)
(Il y en a d'autres. Je me sens particulièrement mal d'avoir omis la sémantique dénotationnelle, mais cette réponse est déjà longue.) Le code machine plus la sémantique opérationnelle est assez proche de ce que la plupart des gens appellent un «vrai programme». Voici un papier séminal, qui se trouve utiliser la sémantique opérationnelle pour un sous-ensemble du code machine DEC Alpha:
Pourquoi voudriez-vous jamais utiliser une sémantique de niveau supérieur, comme celle sémantique axiomatique? Lorsque vous ne souhaitez pas que votre preuve d'exactitude dépende du matériel sur lequel vous exécutez. L'approche consiste alors à prouver l'exactitude d'un algorithme par rapport à une sémantique de haut niveau pratique, puis à prouver que la sémantique sonne par rapport à une sémantique de niveau inférieur qui est plus proche des machines réelles.
En résumé, je pourrais penser à trois raisons qui ont conduit à votre question:
- Vous n'avez vu que des sémantiques de haut niveau qui ne ressemblent pas à ce que vous appelez un programme, et vous vous demandez s'il y en a de bas niveau. La réponse est oui.
- Vous vous demandez comment vous prouvez qu'un modèle correspond à la réalité. Comme en physique, non. Il vous suffit de trouver de meilleurs modèles et de les comparer à la réalité.
- Vous n'avez pas vu la distinction entre la syntaxe et la sémantique, et diverses façons d'attribuer des significations aux programmes. Deux questions précédentes énumèrent quelques livres.
Cette réponse essaie simplement d'identifier trois façons différentes dont j'ai compris la question. Aller en profondeur dans l' un de ces points nécessiterait beaucoup d'espace.