Vous êtes sur la page 1sur 5

1ère NSI Invariant de boucle

1. Lire dans le manuel les pages 121 à 123 puis 135 à 137
Travail personnel
2. Chercher les exercices 132-133-134 p 138 (correction en fin de manuel)

1. Spécification et mise au point


A retenir !
 Il est essentiel de documenter ses programmes (surtout les fonctions)
o Commentaires
o Spécifications claires dans la chaîne de documentation (docstring)
 Une précondition
o Est une condition qui doit être vraie (« vérifiée ») avant d’appeler la fonction
o Peut être testée par une assertion (avec assert)
 Les tests :
o Ils sont nécessaires pour identifier d’éventuels problèmes : on doit en préparer un
jeu suffisamment complet, et les relancer tous en cas de modification de la fonction.
o Mais ils ne suffisent pas à assurer que la fonction renvoie toujours le résultat
attendu !

Exemples tirés du «  sujet zéro  »


2. Invariant de boucle
a. Définition
On vient de rappeler que des tests, même très nombreux, ne suffisent pas à prouver qu’un
programme est correct dans 100% des cas.
Pour prouver qu’un algorithme est correct, on fera plutôt une « démonstration »
(comme en mathématiques)

 INITIALISATION  : vrai avant la boucle


En particulier, quand l’algorithme utilise
 CONSERVATION  : s’il est vrai au début d’un tour de boucle,
une boucle, on utilise un invariant de il est encore vrai au début du tour suivant
boucle, c’est-à-dire une propriété qui  TERMINAISON  : à la fin de la boucle, il donne une propriété
vérifie les trois caractéristiques suivantes : utile qui aide à prouver la correction de l’algorithme

b. Exemple de la division euclidienne


La division euclidienne est une opération qui consiste à chercher « combien de fois au maximum un
nombre entier b est contenu dans un autre entier a », et aussi « combien il reste une fois qu’on a ôté
ce nombre maximum de fois ». On peut donc la voir comme une suite de soustractions, permettant
de trouver deux entiers q et r tels que a=b × q+r et 0 ≤ r <b

25 par 4 8 par 15 60 par 12


25 – 4 = 21 on continue
21 – 4 = 17 on continue
17 – 4 = 13 on continue
13 – 4 = 9 on continue
9–4=5 on continue
5–4=1 STOP : pourquoi ?
…………………………

Résultat renvoyé : q = et r = Résultat renvoyé : q = et r = Résultat renvoyé : q = et r =

Algorithme de division euclidienne On va choisir ici comme premier invariant de


VARIABLES  : a et b ……………………….. boucle l’égalité « naturellement » donnée par
…………………………………….. la définition de la division euclidienne :
DÉBUT
q = ……………… ( P1 ) :a=b ×q +r
r = …………
Tant que ……………………….. : INITIALISATION  : avant la boucle, est-ce que
……………………………….. ( P1 )
……………………………….. est vraie ? …………………………………………….
Fin Tant Que ……………………………………………………………………..
Renvoyer …………….
FIN  CONSERVATION  : supposons que ( P ) est vraie
1

au début d’un tour de boucle : est-elle encore


vraie à la fin de ce tour de boucle ?............................ ……………………………………………………….
……………………………………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………
TERMINAISON  : Quand la boucle s’achève, que peut-on déduire de notre invariant de boucle  ? Est-ce
utile ?
…………………………………………………………………………………………………………………………………………………..

Est-ce suffisant pour prouver que q et r sont bien le quotient et le reste tels qu’ils sont définis dans la
division euclidienne ? ……………………………………………………………………………………………………………….

On pose alors un second invariant de boucle : ( P2 ) :0 ≤ r< b

INITIALISATION  : avant la boucle, est-ce que ( P2 ) est vraie ? …………………………………………………………..

CONSERVATION  : supposons que ( P2 ) est vraie au début d’un tour de boucle : est-elle encore vraie à la
fin de ce tour de boucle ?........................................................................................................................
……………………………………………………….……………………………………………………………………………………………………

TERMINAISON  : Quand la boucle s’achève, que peut-on déduire de notre invariant de boucle  ? Est-ce
utile ?
…………………………………………………………………………………………………………………………………………………..
…………………………………………………………………………………………………………………………………………………………….

Conclusion :
Avec ces deux invariants de boucle, RAPPEL SUR LES VARIANTS DE BOUCLE :
on prouve que l’algorithme proposé est  Ils permettent de montrer que l’algorithme se
correct, c’est-à-dire qu’il renvoie bien le TERMINE même si on a une boucle non bornée.
quotient et le reste tels que définis dans la  Un variant de boucle est un nombre entier,
division euclidienne. positif, qui décroît à chaque tour de boucle.

Quand on programmera l’algorithme dans un langage, on


 Quel variant peut-on proposer ici ? …………..
vérifiera son fonctionnement par des tests : cela servira à
détecter d’éventuelles erreurs de programmation, mais ………………………………………………………………………….
pas de conception car là, on a déjà prouvé que la
conception est correcte !

3. Application : correction du tri par insertion


Dans cette dernière partie, nous allons prouver la correction de l’algorithme « tri par insertion »
grâce à un invariant de boucle.

VARIABLES
t : tableau d'entiers Rappel  : en langage naturel, les indices vont de 1 à longueur(t)
i, j : nombres entiers Représentent des indices du tableau
x : nombre entier Représente une valeur du tableau (la «  carte  » à placer)

DEBUT
j←2 Au début  : la partie gauche contient déjà 1 carte  : on commence à la 2ème
tant que j <= longueur(t): Boucle 1  : on prend chaque «  carte  » encore non-triée successivement
i ← j-1 La carte juste avant est la + à droite de la partie déjà triée => la + grande
x ← t[j] Carte à placer
tant que i>0 et que t[i] > x: Boucle 2  Le regard balaye de droite à gauche en cherchant la bonne
t[i+1] ← t[i] place
i ← i-1 Décalage de chaque case vers la droite
fin tant que
t[i+1] ← x Fin de la boucle 2  : on a trouvé la bonne place pour la carte x
j ← j+1 On insère la carte à la bonne place
fin tant que On passe à la carte suivante dans la partie non-triée
FIN Fin boucle 1
On peut se représenter mentalement le tableau t en 2 parties :

 Une partie qui contient les éléments d'index 1 à j-1 (le j correspond à la variable j dans l'algorithme ci-
dessus). Nous noterons cette partie du tableau t [1 … j−1]
 Une seconde partie qui contient le reste du tableau t (index j à n si le tableau t comporte n élément)

Nous allons chercher un invariant sur un exemple : t = [27, 10, 12, 8, 11]

j=¿ 2 t = [27, 10, 12, 8, 11] t [ 1 … j−1 ]=¿


j=¿ t=¿ t [ 1 … j−1 ]=¿
j=¿ t=¿ t [ 1 … j−1 ]=¿
j=¿ t=¿ t [ 1 … j−1 ]=¿

Que peut-on dire du tableau t [ 1 … j−1 ] à chaque tour de la boucle 1 ? ………………………………………….

On va donc poser : ( P ) :…………………………………………………………………………………

Il faut maintenant prouver que ( P) est bel et bien un invariant de boucle.


INITIALISATION  : avant la boucle, est-ce que ( P ) est vrai ? …………………………………………………………..

CONSERVATION  : supposons que ( P ) est vrai au début d’un tour de boucle : est-il encore vraie à la fin
de ce tour de boucle ?........................................................................................................................
……………………………………………………….……………………………………………………………………………………………………
……………………………………………………….……………………………………………………………………………………………………
……………………………………………………….
…………………………………………………………………………………………………………………………………………………………….
……………………………………………………………………………………………………
……………………………………………………….……………………………………………………………………………………………………
……………………………………………………….
…………………………………………………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………………………………………………….
……………………………………………………………………………………………………
……………………………………………………….……………………………………………………………………………………………………
……………………………………………………….……………………………………………………………………………………………………

TERMINAISON  : Quand la boucle s’achève, que peut-on déduire de notre invariant de boucle  ? Est-ce
utile ?
…………………………………………………………………………………………………………………………………………………..
…………………………………………………………………………………………………………………………………………………………….

4. A vous
Chercher de même un invariant pour le tri par sélection, puis faire la démonstration en 3 étapes afin
de prouver la correction de ce tri.

Vous aimerez peut-être aussi