EXERCICE : Montrer que le programme puissance
se termine et affiche comme résultat an (avec la convention 00
= 1).
PROGRAMME puissance VAR a,n,r : entier DÉBUT LIRE a,n SI n < O et a = O ALORS AFFICHER résultat indéfini SINON r := 1 TANT QUE n < O FAIRE r := r / a n := n+1 FIN TANTQUE TANT QUE n > O FAIRE r := r * a n := n-1 FIN TANTQUE AFFICHER r FIN SI FIN
CORRECTION
Preuve de terminaison
Les problèmes pour cette preuve sont localisés dans les deux boucles tant que.
Pour entrer dans la 1er boucle il faut n<0 (et a
0). La valeur de n est incrémentée à chaque passage dans cette boucle. La condition de continuité est n<0, comme n finira par s'annuler, on sortira en temps fini de cette boucle. Quand on sort de la la 1er boucle on a n=0.
Pour d'entrer dans la seconde boucle il faut n>0. De la même manière que précédement, on va sortir de cette boucle avec n=0.
(iii)En conclusion soit on passe dans une de ces boucles (on avait alors n
0 à l'origine), en sortie (niveau afficher r) on a n=0, soit on passe dans aucune des 2 boucles et n=0 à l'origine. Dans tous les cas on sort en temps fini du programme.
Preuve de propriété
On considère la propriété
I(a,q,n,r):aq=an*r
où q est la valeur initiale de n. On montre qu'elle est toujours vraie.On remarque que la variable a est invariante . On note P(i) la propriété I précédente en fonction de l'itération i:
P(i): aq=ani*ri
Il s'agit de vérifier que
i
N, P(i) est vraie. On procéde par récurrence.
Initialement, n0=q et r0=1 donc P(0) est vraie.
Soit i
N supposons P( i). Il y a 3 cas (envisagé plus haut voir (iii)) :
ni>0
Nous allons dans la seconde boucle. On a ni+1=ni-1 et ri+1=ri*a. On en déduit
P(i+1)=ani+1*ri+1=ani-1*ri*a=ani*ri=P(i)
Donc P(i+1) est vraie.
ni<0
Même chose.
ni=0
Par hypothèse de récurrence P(i) est vraie, donc aq=ani*ri=1*ri. Puisque ni=0, on ne réalise aucune des 2 boucles et donc on affiche ri=1.