On remarque que le rôle de la séquence d’instructions S0 est de rétablir cet invariant de
boucle. Avec ce code, on vérifié l’invariant à chaque itération.
! Chaque boucle a son invariant de boucle, même pour les boucles imbriquées !
2) Fin d’une boucle :
Lorsque l’on crée une boucle, il faut vérifier qu’elle se termine réellement à un moment.
Pour vérifier cela, il faut vérifier que chaque instruction élémentaire et chaque boucle se
termine réellement.
Lorsqu’on utilise l’itérateur « for … in … », il n’y a aucun problème. A chaque itération,
l’indice augmente. Tant que le problème qu’il faut traiter contient un nombre fini d’éléments,
la boucle se termine toujours. En Python, il est donc plus sûr et plus simple d’utiliser un
itérateur tel que « for … in … » plutôt que l’instruction « while ». Il est en effet plus clair de
voir que la boucle s’arrêtera avec un itérateur.
Reprenons comme exemple le problème du « bubble sort » écrit plus haut :
Il y a deux boucles dans cet algorithme.
•La première boucle avec l’itérateur « for … in … » se termine forcément puisque
l’indice i augmente d’une unité à chaque itération. L’indice « upto » étant fini, l’indice
i fini par atteindre la valeur « upto – 1 ». La boucle se termine alors.
•Il est plus difficile de prouver que la deuxième boucle se termine. Pour le prouver, il
suffit de montrer que « iMaxChanged » est toujours plus petit que « upto ». Si le
tableau est trié, iMaxChanged = 0, et donc n = 0, ce qui implique que la boucle
s’arrête. Tant que le tableau n’est pas totalement trié, on a 1 ≤ i < upto, et donc toute
nouvelle valeur de i est inférieure à n-1. La valeur de n diminue donc à chaque
itération et fini par être nulle, ce qui arrête la boucle puisque le gardien est falsifié.
! Quand on travaille avec une boucle, il est toujours plus simple de d’abord
réfléchir à partir d’un dessin !