Programmes justes : logique de Hoare et invariants
Cours · algorithmique (école d'ingénieur), chapitre 11 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Objectifs du chapitre
- Donner un sens précis aux instructions d'un programme à l'aide des triplets de Hoare.
- Écrire une boucle à partir d'une propriété invariante : initialisation, progression, arrêt, terminaison.
- Commenter un programme par ses invariants.
- Appliquer la méthode à des problèmes classiques résolus en ou en .
Un programme qui « marche sur les exemples » n'est pas pour autant un programme juste. Les tests montrent la présence d'erreurs, jamais leur absence. Ce chapitre présente une façon de construire des programmes justes : on part de ce que le programme doit établir, on choisit une propriété qui reste vraie tout au long du calcul, et l'on écrit les instructions qui la préservent. Les commentaires des programmes ne décrivent alors plus ce que fait une instruction, mais ce qui est vrai après son exécution.
11.1 Assertions et triplets de Hoare
Une assertion est une propriété des variables d'un programme, qui est vraie ou fausse en un point donné de son exécution. Par exemple « » ou « ».
Soient et deux assertions et une instruction. Le triplet de Hoare signifie : si est vraie avant l'exécution de , et si se termine, alors est vraie après. est la précondition, la postcondition.
-
x = x + 1;est vrai. -
x = x + 1;est vrai. -
if (x < 0) x = -x;est vrai (aux dépassements de capacité près). -
x = x - 1;est faux : prendre .
C. A. R. Hoare (né en 1934, également inventeur du tri rapide) a proposé en 1969 des règles qui donnent la signification de chaque construction d'un langage de programmation. Les voici, pour le petit noyau de Java que nous utilisons.
11.1.1 L'affectation
Pour toute assertion :
x = E;
où est l'assertion dans laquelle chaque occurrence de est remplacée par l'expression .
La règle se lit à rebours : pour que soit vraie après x = E;, il faut et il suffit que , où l'on remplace par , soit vraie avant.
Quelle précondition garantit après s = s + T[k]; ? On remplace par :
C'est exactement « est la somme du -préfixe ».
11.1.2 La séquence et la conséquence
Séquence. Si et , alors .
Conséquence. Si , et , alors .
Montrons t = x; x = y; y = t; . On remonte depuis la postcondition, en appliquant la règle de l'affectation à chaque instruction, de la dernière à la première :
-
y = t;; -
x = y;; -
t = x;.
La précondition obtenue est exactement . La règle de la séquence permet de conclure.
11.1.3 La conditionnelle
Si et , alors
if (B) S1 else S2 .
Autrement dit, il faut vérifier chaque branche, en sachant dans laquelle on se trouve. C'est le raisonnement par cas que nous avons fait sans le dire dans toutes les équations de récurrence de la première partie.
11.1.4 La boucle
Si , alors
while (B) S .
L'assertion est un invariant de la boucle.
Cette règle est le cœur de la méthode. Si est vraie avant la boucle, et si chaque tour préserve , alors à la sortie de la boucle on sait deux choses : est vraie, et la condition est fausse. Le choix de est fait pour que ces deux faits réunis donnent le résultat attendu.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.