![]()
Précédent : Études de langages de programmation
Remonter : Fondements scientifiques Suivant :
Vers un
nouveau système de
Participants : Yves Bertot, Yann Coscoy, Joëlle
Despeyroux, Guillaume Gillard, Olivier Pons, Loïc Pottier,
Laurence Rideau, Laurent Théry.
Mots clés : fiabilité du logiciel, sémantique, sémantique naturelle, Coq .
Les techniques de preuve assistée par ordinateur interviennent dans nos recherches de trois manières différentes. D'abord, le développement d'une interface homme-machine pour un système de preuve interactif est un champ d'application pour nos outils de manipulation interactive d'arbres. Deuxièmement, il existe maintenant plusieurs techniques pour développer en même temps des programmes et la preuve que ces programmes respectent une spécification : il est naturel pour nous d'étudier aussi ce style de programmation, où l'on manipule simultanément les programmes et leurs spécifications. Enfin, la preuve est un prolongement naturel de notre étude de la sémantique des langages de programmation : une fois que l'on a défini formellement un langage de programmation, il est normal d'utiliser cette définition formelle pour raisonner sur le langage.
Les formules mathématiques et les commandes manipulées dans les systèmes interactifs de preuve sont des objets structurés comme des programmes. Il est donc possible de construire un environnement d'aide à la preuve en utilisant naturellement l'ensemble des outils déjà développés pour les environnements de programmation. Les systèmes de preuves présentent tout de même quelques caractéristiques spécifiques :
Au centre de plusieurs outils développés dans ce contexte se trouve la notion de position ou d'occurrence. En effet, lorsque l'on utilise la souris sur la représentation structurée des formules mathématiques, il est nécessaire de donner un sens à la position sélectionnée dans la structure affichée. On est alors amené à construire des outils proches de compilateurs, mais dont la donnée en entrée est non seulement une donnée structurée mais aussi une ou plusieurs positions valides dans cette donnée. L'exemple le mieux connu est l'outil de preuve par sélection.
Un autre thème important pour notre travail est le calcul des dépendances entre les différentes données présentes à l'écran. Ce calcul permet d'améliorer les commandes de retour en arrière et de faciliter la mise au point de spécifications. Enfin, le dernier grand thème de ce travail a trait à l'explication en langue naturelle des objets du système de preuve qui représentent les raisonnements mathématiques. C'est le propre de la théorie des types de représenter la construction d'une preuve par la construction d'un terme dans un lambda-calcul typé particulier que l'on peut interpréter. Dans ce travail, il est important de savoir abstraire les détails inutiles, en laissant le lecteur se concentrer sur les étapes significatives.
Le formalisme de description sémantique que nous utilisons, la sémantique naturelle, se représente très facilement dans les systèmes de preuve, surtout dans les systèmes de théorie des types avec types inductifs, comme le système COQ. Les preuves en COQ qui font intervenir des programmes et des spécifications sémantiques font donc partie de nos champs d'investigation.
Nous disposons d'un outil pour compiler la description de syntaxe abstraite d'un langage de programmation et une spécification de sémantique naturelle en des fichiers de définitions pour le système COQ.
La sémantique naturelle est mieux adaptée pour prouver des propriétés des langages de programmation ou d'outils sur ces langages que pour prouver des propriétés de programmes particuliers. Ainsi, on pourra spécifier en sémantique naturelle l'interprète du langage et un outil de vérification des types. Dans ce cas, on prouvera le théorème de conservation des types : le type d'une expression est le même que le type de sa valeur après évaluation. En quelque sorte, ce théorème exprime que les deux spécifications sémantiques sont cohérentes. De cette manière, nous avons validé des compilateurs, des vérificateurs de type ou des évaluateurs partiels pour de petits langages académiques. Une direction de recherche ouverte est de comprendre comment les techniques utilisées pourront s'adapter aussi à des langages réels.
En théorie, la spécification de la sémantique dynamique d'un langage de programmation suffit pour effectuer des preuves sur les programmes écrits dans ce langage. Ce type d'effort n'est, en fait, pas praticable. Pour prouver directement la validité d'un programme fixé par rapport à une spécification, il vaut mieux utiliser une sémantique orientée vers la preuve de programme, comme la logique de Hoare, où l'on peut annoter des programmes impératifs avec leurs propriétés, exprimées soit en logique du premier ordre, soit avec le calcul des constructions. Dans ce dernier cas le type des fonctions peut représenter la spécification de ces fonctions, exprimée dans une logique d'ordre supérieur.
Nous étudions le développement de programmes validés vis-à-vis d'une spécification en utilisant, d'une part directement la méthode B (une méthode basée sur la logique de Hoare), d'autre part le calcul des constructions. En particulier, nous nous intéressons aux algorithmes utilisés en calcul formel. Ces algorithmes sont particulièrement intéressants à étudier car leur validité repose sur des propriétés mathématiques non triviales. Dans notre principale expérience, l'effort pour prouver les propriétés mathématiques est en fait plus important que l'effort pour prouver l'algorithme lui-même, avec un rapport de 1 à 4.