Preuve de correction de programme

Pour prouver la correction totale d'un programme, il faut montrer  
  1. que le programme termine pour toutes ses entrées valides (terminaison) et
  2. que lorsqu'il s'arrête il donne un résultat correct (correction partielle).

$correction = terminaison \land correction~ partielle$

Dans ce cours nous nous intéresserons uniquement à la preuve de la correction partielle des programme.

Les principes qui permettent de prouver la correction partielle d'un programme sont issus des travaux de Robert W. Floyd, C.A.R. Hoare et Edsger W. Dijkstra principalement entre 1969 et 1974.

Qu'est-ce qu'un programme correct ?

MP
C'est un programme qui fait ce qu'il est censé faire.

Homer
Mais comment exprimer ce qu'il est censé faire?

MP
En exprimant ce qu'on attend du résultat du programme sous la forme de propriétés.
  • Le code écrit en langage de programmation explique à la machine comment calculer.
  • Les propriétés sont exprimées dans un langage qui permet le raisonnement et la preuve. Ce langage c'est celui des mathématiques.

Illustration sur le calcul du quotient et du reste d'une division euclidienne

Rappel : Étant donné deux entiers naturels $A,B\in\mathbb{N}$, l'entier $A$ peut s'écrire sous la forme

\( A = B \times q + r ~~\textit{avec}~~ 0\leq r< B. \)

Algorithme de la division euclidienne : Considérons un programme de division euclidienne qui prend en paramètre deux entiers $A$ et $B$ et qui calcule les valeurs de $r$ et $q$ représentant respectivement le reste et le quotient de $A$ par $B$.

  r:=A ; q:=0 ;
  while(r >= B){
    r:=r-B ;
    q:=q+1 ;
  }
Si le programme est correct, en sortie les variables $r$ et $q$ doivent satisfaire l'équation $A = B \times q + r \textit{ avec } 0\leq r< B$
MP
C'est ce que nous allons démontrer ensemble. Nous allons voir une technique de preuve qui permet de garantir la correction d'un programme.
Cette branche de l'informatique qui vise à éradiquer les bugs se nomme « vérification de programmes ».

Homer
S'il vous plaît, ne prononcez plus jamais le mot "dém..." ou "pr...", \ca me donne mal à la tête.


Quizz

Dans ce cours on ne s'intéressera pas à la terminaison des programmes.
Mais si on voulait garantir la terminaison de l'algorithme de division euclidienne,
quelles les conditions devraient satisfaire les paramètres $A$ et $B$ ?



Représentation d'un programme par un automate de Von Neumann

Considérons l'algorithme DIV de division euclidienne qui prend en paramètre deux entiers $A$ et $B$ et qui calcule les valeurs des entiers $r$ et $q$ représentant respectivement le reste et le quotient de $A$ par $B$.

  r:=A ; q:=0 ;
  while(r >= B){
    r:=r-B ;
    q:=q+1 ;
  }

Mise sous forme d'automate


Construction de graphe de contrôle au format .dot

Il est assez aisé d'obtenir une version graphique du graphe de contrôle d'un programme (abbrégé en CFG, de l'anglais Control Flow Graph).

Considérons le programme :

P0;
while (C1) {
  if (C2)
  then P1
  else P2 ;
  P3
}

On décrit chacune des transitions au format .dot :

prog -> entry;
entry -> while [label = "P0"];
while -> if    [label = "C1"];
while -> exit  [label = "not C1"];
if -> then     [label = "C2"];
if -> else     [label = "not C2"];
then -> endif  [label = "P1"];
else -> endif  [label = "P2"];
endif -> while [label="P3"];

On peut redéfinir les noms des noeuds et leur apparence

node [shape=plaintext, fontname=comic, fontsize=18, fontcolor=blue];
  prog [label="automate"];

node [shape=circle, peripheries=1, style=filled, color=black, fillcolor=gray, fontcolor=black];
  entry [label="Q0"];
  while [label="Qw"];
  if    [label="Qif"];
  then  [label="Qt"];
  else  [label="Qe"];
  endif [label="Qfi"];
  exit  [label="Qs" ];

Description complète du CFG

On réorganise les informations précédentes et on l'enregistre dans un fichier .dot

digraph cfg{
// NAME
node [shape=plaintext, fontname=comic, fontsize=18, fontcolor=blue];
  prog;

// STATES
node [shape=circle, peripheries=1, style=filled, color=black, fillcolor=gray, fontcolor=black];
  entry;
  while;
  if;
  then;
  else;
  endif;
  exit;

// TRANSITIONS
  prog -> entry ;
  entry -> while     [label = "..............  "];
  while:e -> exit:w  [label = "..............  "];
  while -> if        [label = "..............  "];
  if -> then         [label = "..............  "];
  then -> endif      [label = "..............  "];
  if -> else         [label = "..............  "];
  else -> endif      [label = "..............  "];
  endif -> while     [label = "..............  "];
}

Visualisation avec Graphviz

L'outil graphviz permet de visualier le fichier .dot et d'exporter le graphique dans différents formats .pdf, .jpg.

MP
C'est avec cet outil que je génère les dessins d'automates. Installez le et essayez le.

CFG.dot
L'image produite par graphviz à partir de la description .dot


Les instructions essentielles et leur traduction en transitions d'automate

Pour l'instant nous avons utilisé uniquement deux types d'instructions :

  1. les branchements sous condition (ou branchement conditionnels)

    Ils peuvent tous être réalisés avec des transitions test qui portent la condition de branchement.
  2. les instructions d'affectations $variable := valeur$ qui modifient en mémoire la valeur de la variable.
    Elles sont traduites sous forme de transitions affectation qui peuvent comporter une ou plusieurs affectations (qui auront lieu en parallèle).

Il reste à voir deux instructions qui effectuent un saut inconditionnel.

L'instruction break

Elle interrompt la boucle et saute à l'état de sortie de la boucle.
Elle se traduit par une transition sans label qui relie l'état courant à l'état de sortie de la boucle (qui n'est pas nécessairement l'état de sortie du programme).

L'instruction return

Lorsqu'un programme doit rendre une valeur, on lui ajoute l'instruction "return..." qui a deux effets :
  1. elle interrompt le calcul (comme break)
  2. elle rend une valeur, stockée dans la variable $result$ prédéfinie par le compilateur.


Quizz : Vrai / Faux ?

Grâce à l'instruction return il est possible d'interrompre une boucle et de sauter directement dans l'état de sortie de l'automate.


Quizz : l'ordre des affectations est-il important ?

Les traductions proposées pour les 2 programmes suivants sont-elles correctes ?

P1 P2
x:=1 ; 
y:=x ;
x:=x+1 ;
y:=y+1 ;

MP
Lorsque deux affectations sont indépendantes, l'ordre dans lesquel les effectuer n'a pas d'importance et on peut même les effectuer en parallèle.
Il y a une dépendance entre deux affectations $x:=e_1$ et $y:=e_2$ lorsque la valeur de la partie droite ($e_1$ ou $e_2$) de l'une d'elle dépend de la variable ($x$ ou $y$) de l'autre. Dans ce cas l'ordre dans lequel on effectue les affectations a de l'importance et on ne doit pas regrouper les deux affectations sur la même transition.


Quizz : compilation = traduction de structure de contrôle en automates

Voici le graphe de flot de contrôle du programme

x:=1 ; y:=x+1 ; z:=y+1
GFC

Consigne : Dessinez le GFC associé à chacun des programmes ci-dessous

Pour vous aidez on donne (dans le désordre) la structure des différents GFCs ; il n'y en a que 3 et c'est normal.
GFC
GFC
GFC

Question : Combien en avez-vous dessiné dont vous êtes sûr ?

1? 2? 3? 4?



Invariants d'états

Invariants d'états

MP
Comment juger de la correction d'un programme ? selon quels critères ?

Pour prouver qu'un programme est correct, on doit énoncer les propriétés qu'il est censé respecter et les associer aux états de l'automate.

Exemple : Dans le cas de la division euclidienne, les propriétés qui nous intéressent sont :

MP
Observons ces propriétés au cours d'une exécution de l'automate DIV.

Exécution de l'automate et observation des propriétés

L'automate DIV est une version compilée de l'algorithme de division euclidienne.

Pour exécuter l'algorithme, on commence dans l'état $Q_0$ avec des valeurs pour les paramètres, par exemple $A = 8$ et $B = 3$.

On passe de l'état courant à un autre en empruntant une transition :

Exécution avec $A=8$ et $B=3$

condition propriété propriété
état ~~$q$~~ ~~$r$~~ $r< B$ $A=B \times q + r$ $0\leq r$
$Q_0$
$Q_1$ 0 8 F V V
$Q_2$ 0 8 F V V
$Q_1$ 1 5 F V V
$Q_2$ 1 5 F V V
$Q_1$ 2 2 V V V
$Q_s$ 2 2 V V V

Propriétés invariantes associées aux états de l'automate

On associe à chacun des états $Q_i$ de l'automate, une propriété $\psi_i$ dite invariante, au sens où

Définition  
la propriété $\psi_i$ est vraie à chaque fois que l'exécution du programme passe par l'état $Q_i$.

Exemple :

On associe à l'état de sortie $Q_s$ de l'automate DIV, la propriété $\psi_s$ attendue du programme

\( \psi_s : A = B \times q + r \land 0\leq r \land r< B \)

Cette propriété en sortie de programme traduit l'exigence que les valeurs de $q$ et $r$ calculées par le programme vérifient les contraintes qui relient le quotient et le reste de la division entière de $A$ par $B$.

Définition  
La propriété $\psi_s$ associée à l'état de sortie $Q_s$ définit le critère de correction du programme.
MP
Ce qui nous intéresse vraiment ce sont les propriétés en sortie de programme.

Edsger
Mais pour démontrer qu'elles sont satijsfaites nous aurons besoin de nous appuyer sur les propriétés des autres états au cours de l'exécution.

Bob
Et pour que notre raisonnement soit valable pour toutes les exécutions possibles du programme, il faut que les propriétés qui nous seront utiles ne dépendent pas du chemin pris par l'exécution.

Tony
Elles doivent être invariantes!

MP
Si on parvient à montrer que $\psi_s$ est un invariant de $Q_s$ alors on aura la garantie que, lorsque l'exécution du programme atteindra l'état de sortie, la propriété désirée sera vraie.

Homer
Et si on n'atteint jamais l'état de sortie ?


Quizz : valeurs des variables en $Q_0$ ?

Quelles sont les valeurs de $r$ et $q$ au point d'entrée du programme (état $Q_0$) ?


Quizz : Invariants des états de l'automate DIV

Exécution avec $A=8$ et $B=3$

condition propriété propriété
état $~q~$ $~r~$ $r<B$ $A =B \times q + r$ $0\leq r$
$Q_0$ ? ? ? ? ?
$Q_1$ 0 8 F V V
$Q_2$ 0 8 F V V
$Q_1$ 1 5 F V V
$Q_2$ 1 5 F V V
$Q_1$ 2 2 V V V
$Q_s$ 2 2 V V V

Consigne : Associez les propriétés aux états où elles sont invariantes, c'est à dire $vraies$ à toute étape de l'exécution.
  1. $Q_1, Q_2, Q_s$
  2. $r < B$
  3. $Q_0$
  4. $0 \leq r$

  1. $Q_1, Q_2, Q_s$
  2. $Q_s$
  3. aucun(e)
  4. $A = B * q + r$


Homer a posé une bonne question

Homer
Et si on n'atteint jamais l'état de sortie du programme ?

Si le programme boucle indéfiniment, est-ce que $\psi_s$ est un invariant de $Q_s$ ?

Justifiez votre réponse.

MP
Cette question fera l'objet d'un test ...



Principe de preuve de correction de programmes

Principe de preuve de correction de programmes

Objectif de la leçon

Une fois qu'on a découvert (soit à l'intuition, soit par un raisonnement en arrière),
des propriétés qui nous paraissent susceptibles d'être des invariants (à ce stade on les appelle des candidats),
on doit prouver que ce sont effectivement des invariants.

Comment prouver qu'une propriété est un invariant ?

Étant donné une transition $q \xrightarrow{inst} q'$ de l'automate et des candidats $\psi$ et $\psi'$ associés aux états $q$ et $q'$,
la notation sous forme de triplet de Hoare résume le lien entre $\psi$ et $\psi'$ via la transition $q \xrightarrow{inst} q'$.

Un triplet de Hoare  
\( \{~ \psi ~\} : q \xrightarrow{inst} q' : \{~ \psi' ~\} \)
se lit
si la propriété $\psi$ est vérifiée à l'état $q$ alors, après l'exécution des instructions de la transition, la propriété $\psi'$ est nécéssairement satisfaite en $q'$.

Principe de preuve d'invariants (Floyd-Hoare)

Un triplet de Hoare établit un lien de conséquence logique entre la propriété de l'état source $q$ et la propriété associée à l'état cible $q'$.
Tony
C'est moi qui ai inventé ça en 1969.

Bob
Je t'ai un petit peu aidé quand même avec mon article de 1967 "Assigning Meanings to Programs"

Une preuve de programme consiste à démontrer, transition par transition, que tous les liens de conséquence logique sont valides alors les propriétés associées aux états de l'automate formeront une chaîne de causalités logiques où chaque propriété garantit la suivante, depuis la propriété initiale du programme en $Q_0$ jusqu'à la propriété souhaitée en $Q_s$.

Calcul de plus faible précondition de Dijkstra

Edsger
Folks, reconnaissez que j'ai quand même considérablement simplifié votre méthode en automatisant le traitement des affectations.
Et je suis le seul à avoir un vrai nom d'informaticien qui contient $ijk$ les variables les plus utilisées en informatique.

En pratique on utilise la propriété cible, $\psi'$ en $q'$, pour déterminer $\psi$ en $q$
et on prend pour $\psi$ la plus faible condition précédente qui garantit que $\psi'$ sera vérifiée.
MP
Ça semble compliqué mais vous allez voir sur les exemples que c'est assez intuitif ;
à condition d'avoir la clarté d'esprit d'Edsger...


Quizz 1 : calcul de préconditions

Consigne : Donnez la précondition garantissant que la propriété après l'affectation soit satisfaite.


MP
Vous avez bien réfléchi ? Et bien vous vous êtes compliqué la vie pour rien, dirait Edsger.
Pour que la propriété $pair(x)$ soit vraie quand on remplace $x$ par une expression $e$ même très compliqué, il suffit que $pair(e)$ soit vraie. Il suffit donc de reprendre la même propriété $pair$ et de remplacer $x$ par la valeur qu'on lui affecte, $e$.

Voici la correction d'Edsger Dijkstra

Edsger
J'aurais tout simplement écrit :
  • $ \{~ pair(y) ~\} ~~ x:=y ~~ \{~ pair(x) ~\} $
  • $ \{~ pair(y+1) ~\} ~~ x:=y+1 ~~ \{~ pair(x) ~\} $
  • $ \{~ pair(x) ~\} ~~ y:=z ~~ \{~ pair(x) ~\} $, puijsque la variable $x$ n'est pas modifiée par l'affectation
  • $ \{~ pair(x+1) ~\} ~~ x:=x+1 ~~ \{~ pair(x) ~\} $

MP
Voyons si vous avez compris la simplicité du calcul de précondition de Dijkstra.


Consigne : Associez la précondition garantissant que la propriété après l'affectation soit satisfaite, avec la clarté d'esprit d'Edsger Dijkstra !


Généralisation de nos observations

Considérons des expressions mathématiques quelconque $e_1$ et $e_2$, et une propriété logique quelconque $\psi$ - qui peut contenir des fonctions, des opérateurs et des variables $x,y,...$.

Vous pouvez imaginer que

Précondition de Dijkstra

Pour que la propriété $\psi$ soit vraie quand il suffit de prendre pour précondition la propriété $\psi$, dans laquelle on remplace chaque occurence de $x$ par $e_1$ et chaque occurence $y$ par $e_2$.
MP
occurence est un mot savant pour dire « apparition », et au lieu de « remplacement », on préfère parler de substitution.

L'intérêt du calcul de Dijkstra c'est qu'il est valable quelle que soit la complexité de la fomule et des expressions. On peut le résumer ainsi

\( \{~ \psi[ x \leftarrow e_1, y \leftarrow e_2 ] ~\} ~~ x:=e_1, y:=e_2 ~~ \{~ \psi ~\} \)

où $formule ~ [ variable \leftarrow expression ]$ désigne l'opération de substitution qui remplace chaque occurence de la $variable$ par l'$expression$ dans la $formule$.

MP
C'est simple, à condition de ne pas se tromper dans les substitutions. C'est entièrement automatisable et un ordinateur ferait ça bien mieux qu'un humain.

Homer
L'ennui c'est que ce sont les humains qui les programment...


Quizz 3 : susbstitution

Consigne : Appliquez méthodiquement les substitutions pour retrouver le résultat correct.



MP
Maintenant qu'on maîtrise le calcul des préconditions de Dijkstra, on peut revenir à notre problème de départ

Que faut-il prouver pour valider un triplet ?

Supposons qu'on a choisi d'associer les candidats $\psi$ et $\psi'$ aux états $q$ et $q'$ reliés par une transition $q \xrightarrow{inst} q'$. Ce qui se résume sous la forme du triplet de Hoare.

\( \{~\psi~\} : q \xrightarrow{inst} q' : \{~\psi'~\} \)

MP
On souhaite démontrer que le choix de $\psi$, avant la transition, garantit la propriété $\psi'$ en $q'$.

Tony
$\psi'$ sera alors un invariant de $q'$

Edsger
À condition qu'on réussijsse à démontrer que $\psi$ est un invariant de $q$

Bob
Yeap! Les propriétés forment une chaîne de conséquences logiques le long d'un chemin d'exécution, chacune garantissant la suivante.

Le type de preuve diffère selon la nature de l'instruction $inst$. Examinons chacun des cas.

MP
Au passage on va justifier le fondement du calcul de précondition d'Edsger.

Dans le cas d'une transition d'affectation

\( \{~\psi~\}~q \xrightarrow{v:=e} q'~\{~\psi'~\} \)

il faut montrer que
si la propriété $\psi$ est vraie en $q$ pour les valeurs des variables dans la mémoire $M$,
la propriété $\psi'$ est vraie en $q'$ dans la mémoire en $M$ modifiée par l'affectation $v:=e$.
Ce qui revient à montrer l'implication :

\( (1) ~~ \psi ~\overset{?}{\Longrightarrow}~ \psi'[v\leftarrow e] \)

où $\psi'[v\leftarrow e]$ désigne la propriété $\psi'$ dans laquelle on a substitué (c'est à dire remplacé) toutes les occurences de la variable $v$ par $e$. On appelle $[v\leftarrow e]$ une substitution.

Le coup de génie de Dijsktra c'est d'avoir compris que
pour une transition affectation \( \{~\psi~\}~q \xrightarrow{v:=e} q'~\{~\psi'~\} \)
le meilleur choix pour $\psi$ en $q$, pour satisfaire l'implication (1)
c'est de prendre

\( \psi \overset{def}{=} \psi'[v\leftarrow e] \)

Edsger
Ainsi, l'implijcation (1) est trivialement vraie !

En effet,

Avec ce choix pour $\psi$,
l'implication $(1) ~~ \psi ~\overset{?}{\Longrightarrow}~ \psi'[v\leftarrow e]$ devient $\psi'[v\leftarrow e] \Longrightarrow \psi'[v\leftarrow e]$
qui est la forme $A \overset{?}{\Longrightarrow} A$, ce qui est trivialement vraie.

Dans le cas d'une transition test

\( \{~\psi~\} : q \xrightarrow{\textit{condition}} q' : \{~\psi'~\} \)

il faut montrer que
si la propriété $\psi$ est vraie en $q$ et qu'on passe la transition (ce qui signifie que la condition du test vaut $vrai$)
alors la propriété $\psi'$ est vraie en $q'$.

MP
Dans ce raisonnement la mémoire ne joue aucun rôle puisque l'évaluation d'une transition test ne modifie pas les variables : la mémoire $M$ est inchangée entre $q$ et $q'$.

Le raisonnement précédent s'écrit sous la forme d'une implication

\( (2) ~~ \psi \land condition ~\overset{?}{\Longrightarrow}~ \psi' \)

dont il faut prouver la validité.
Edsger
Cette fois-ci, ije n'ai aucune astuce à proposer pour aider à choisir $\psi$.

MP
À force de pratiquer j'en ai découvert quelques unes. Je vous les présenterai dans une prochaine leçon.
En attendant voyons si vos intuitions sont bonnes.


Quizz 4 : précondition de transition test

On considére des implications de la forme \( \{~ \psi ~\} \land condition \overset{?}{\Longrightarrow} \{~ \psi' ~\} \) issues de transitions test \( \{~ \psi ~\} : q \xrightarrow{condition} q' : \{~ \psi' ~\} \)

Consigne :

Choississez la plus faible condition $\psi$ en pointillés de sorte que l'implication devienne triviale.

Plus difficile :



Principe de preuve de correction de programmes

Principe de preuve de correction de programmes

Que faut-il prouver pour valider un triplet $\{~\psi~\} Q \xrightarrow{inst} Q'\{~ \psi' ~\}$ ?

Deux cas selon la nature de l'instruction $inst$ :

  1. Dans le cas d'une transition d'affectation

    \( \{~ \psi ~\} Q \xrightarrow{v:=e} Q' \{~ \psi' ~\} \)

    il faut montrer que
    si la propriété $\psi$ est vraie en $q$ pour les valeurs des variables dans la mémoire $M$,

    alors la propriété $\psi'$ est vraie en $q'$ dans la mémoire $M$ modifiée par l'affectation $v:=e$.
    Ce qui revient à montrer l'implication :

    \( \psi \Longrightarrow \psi'[v\leftarrow e] \)

    où $\psi'[v\leftarrow e]$ désigne la propriété $\psi'$ dans laquelle on a substitué (c'est à dire remplacé) toutes les occurences (c'est à dire apparitions) de la variable $v$ par l'expression $e$.

    Pour cette raison, on appelle $[v\leftarrow e]$ une substitution .

    Exemple de l'effet d'une substitution :

    \( \begin{array}{l} \{~ A = B \times q + r,~ 0\leq r ~\} [r\leftarrow (r-B)] \\=~ \{~ A = B \times q + (r-B),~ 0\leq(r-B) ~\} \end{array} \)

  2. Dans le cas d'une transition test

    \( \{~ \psi ~\} Q \xrightarrow{condition} Q' \{~ \psi' ~\} \)

    il faut montrer l'implication :

    \( \psi \land condition \Longrightarrow \psi' \)



Modèle de rédaction d'une preuve de correction partielle de programme

Application au cas de l'algorithme de division euclidienne

automate de la division euclidienne

Au départ on ne connaît que la propriété souhaitée à l'état de sortie $Q_s$ :

\( \psi_s : A = B \times q + r \land 0 \leq r < B \text{, on utilisera la notation ensembliste } \psi_s : \left\{\begin{array}{l} A = B \times q + r \\ 0 \leq r \\ r< B \end{array}\right\} \)

Preuve de correction partielle



Astuces classiques en preuve de programmes

Introduction d'une égalité

MP
Connaître une égalité $n=e$ est utile dans une preuve car cela permet de remplacer $n$ par $e$ (ou inversement $e$ par $n$), soit pour simplifier une expression, soit pour faire apparaitre la variable $n$ dans une expression qui parlait de $e$. Lorsqu'on découvre une égalité invariante dans un état, il faut la noter (et la prouver). Elle facilitera la preuve des autres invariants.

Il est fréquent que la condition de sortie de boucle d'un programme soit une inégalité arithmétique telle que $n \leq e$ où $n$ est un compteur entier et $e$ une expression. Lorsqu'on exécute le programme sur des valeurs concrètes il se peut qu'à la sortie de la boucle, le compteur $n$ soit en fait égal à l'expression $e$. Il est alors utile d'ajouter l'égalité $n=e$ à l'invariant de sortie de boucle afin de faciliter la preuve, mais bien sûr cela à une contre-partie car il faudra prouver l'égalité qu'on vient d'ajouter.

Prouver une égalité : Lorsque l'égalité $n=e$ est associée à l'état cible, $Q'$, d'une transition test de la forme

\( Q \xrightarrow{n\leq e} Q', \)

la plus faible condition en $Q$ qui permet de prouver l'égalité en $Q'$ est l'inégalité opposée $n\geq e$. En effet,

\( \begin{array}[t]{c}\underbrace{n\geq e}\\\psi\end{array} \land \begin{array}[t]{c}\underbrace{n\leq e}\\condition\end{array} \Longrightarrow \begin{array}[t]{c}\underbrace{n=e}\\\psi'\end{array} \)

Trouver l'invariant en tête de boucle

L'invariant clef d'une preuve de programme est celui associé au noeud qui contrôle la boucle, qu'on appele la tête de boucle, notons le $Q$. Les transitions tests qui décident s'il faut continuer ou interrompre la boucle sont attachées à ce noeud. C'est donc par ce noeud

On peut déduire de ces observations plusieurs contraintes sur la propriété $\psi$ associée à $Q$:

Principe de la balance équilibrée

Les remarques précédentes sont utiles pour découvrir les invariants en tête des boucles dans les algorithmes de calculs arithmétiques.

Exemple (1) la multiplication na\ive

L'algorithme cherche à calculer la valeur de $A\times B$ au moyen des variables $r$ et $n$,
en maintenant à chaque itération une égalité (à découvrir) \( (1)~~A\times B = r ... n \)

MP
On parle d'équilibrage de balance car la variable $r$ augmente à chaque itération tandis que la variable $n$ diminue de manière à maintenir l'équilibre entre les termes de gauche et de droite de l'égalité.

Exemple (2) l'exponentation naïve

Appliquez le même raisonnement que précédemment pour découvrir l'invariant en tête de boucle:
\( (2)~~A^B = r ... n \)

Exemple (3) l'exponentiation rapide

Appliquez le même raisonnement que précédemment pour découvrir l'invariant en tête de boucle:
\( (3)~~ A^B = r ... x ... n \)

On cherche un invariant de $Q$, donc une équation générale qui soit valide à chaque passage en $Q$. Il faut donc réussir à obtenir $A^B$ avec $r,x,n$ de sorte que

D'après $(i)$, il faut composer le terme $x^n$ pour obtenir $A^B$ dans le cas $(i)$ ; et dans le cas $(ii)$ ce terme devient $?^0$ qui vaut 1.
On a déjà déterminé une partie de l'équation $(3)~~ A^B = r ... x^n$. Il reste à trouver par quel opérateur remplacer les "..." mais ca ne devrait pas être trop difficile.

Les inégalités strictes sur les entiers

Une inégalité stricte entre entiers peut se réécrire sous la forme d'une inégalité large équivalente.

Exemple