Adloun

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

Définition 11.1Assertion

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 « ».

Définition 11.2Triplet de Hoare

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.

Exemple 11.3quelques triplets
  • 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

Proposition 11.4Règle de 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.

Exemple 11.5calculer une précondition

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

Proposition 11.6Règles de la séquence et de la conséquence

Séquence. Si et , alors .

Conséquence. Si , et , alors .

Exemple 11.7échanger deux variables

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

Proposition 11.8Règle de 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

Proposition 11.9Règle de 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 cours

En accès libre, sans inscription.

Exercices corrigés de ce chapitre

Lire la suite du cours →