Correction de Programmes H. Wertz1 Correction de Programmes Soit lorganigramme suivant : M 0, M,N Ent. Nat. J = I N invariante de boucle I = M condition de terminaison J = M N assertion de corretion Exécution réelle : p.ex.: M=3 et N=5 Exécution symbolique : M=m et N=n
Correction de Programmes H. Wertz2 Comment trouver une Invariante Nombre de fois lexécution traverse 2 Valeur de IValeur de J N 32 2 N ……… ……… M+1M M N J = I N Boucle M-fois exécutée
Correction de Programmes H. Wertz3 La preuve de correction (partielle) Démontrons par induction sur le nombre dexécution du point 2 que J = I N 1.Si ==1 alors I=0 et J=0 donc: J=I N=0 N 2.Supposons J n =I n N pas : I n+1 =I n +1 et J n+1 =J n +N alors : J n+1 =I n N + N (par hypothèse) =(I n +1) N =I n+1 N
Correction de Programmes H. Wertz4 La preuve de terminaison Il faut démontrer que si M 0 alors I=M après un nombre fini de pas Induction vers le haut sur I=m : faut démontrer que si M 0 avec 0 m M alors exécution arrive à 2 avec I=M 1) base : si m=0 alors I=0 et M=0 implique I=M 2) pas : I=m, 0 m M au point 2 montrons que lexécution arrive à 2 avec I=m+1 : si I=m, 0 m M non(I=M) une exécution de la boucle I=m+1 Fin de la preuve de J=I N et de la terminaison du programme
Correction de Programmes H. Wertz5 Calcul du Quotient et Reste 0<=J1, 1<=J2 (assertion dentrée) J1=IQ J2 + IR et 0<=IR<J2 (terminaison) J1=IQ*J2 + IR (invariante)
Correction de Programmes H. Wertz6 linvariante du programme 2 donc: IR = J1-IQ J2 donc : J1 = IQ J2 + IR nombre de fois lexécution traverse 2 Valeur de IQValeur de IR 10J1 21J1 – J2 32 J1 – 2 J2 43 J1 – 3 J2 ……… M+1M J1 – M J2
Correction de Programmes H. Wertz7 Preuve de correction du programme 2 Pour démontrer que J1=IQ J2+IR (au point 2) 1)base: IQ=0, IR=J1 2)Après 1 exécution de la boucle : IQ n+1 J2+IR n+1 =(IQ n +1) J2+IR n -J2 = J1 Puisquil ny a pas de modification sur le chmein 2 – 6 la correction est démontrée
Correction de Programmes H. Wertz8 Preuve de terminaison Condition de Terminaison : 0<=IR<J2 1)Démontrer 0<=IR a)IR=J1 et 0<=J1 b)0 = J2 alors IR n+1 =IR n -J2 0<=IR n – J2 = IR n+1 2) Démontrer IR<J2 puisque 1<=J2 et IR n+1 :=IR n -J2 alors IR n+1 <IR n
Correction de Programmes H. Wertz9 Sur la Terminaison (1) F(I) I + 1 soit I 0 >M et prog termine à n=1 Sinon, supposons quaprès n 0 exéc. le prog. termine, on a alors: 1)I>M et I I 0 +n 0 -1 (puisque F(I)- 1 I) Donc : M M-I )Et: n 0 M-I 0 +2 ( puisque dernière exec ) 1)&2) I I 0 +(M-I 0 +2)-1= M+1 Par induction : M< I 0 +n 0 -1 et I I 0 +n 0 -1 Après une exécution on a : I I 0 +n = I+n 0 > I 0 +n 0 -1
Correction de Programmes H. Wertz10 Sur la Terminaison (2) I-1 G(I) Soit I 0 < M alors à n=1 le prog. Termine Sinon, supposons quaprès n 0 exéc. le prog. termine, on a alors: Puisque G(I) I -1 I I 0 – (n 0 – 1) = I 0 – n I<M I 0 – n < M n 0 > I 0 –M+1 pour n 0 = I 0 –M+2 on a : I I 0 I 0 + M = M 1
Correction de Programmes H. Wertz11 3 ième programme exemple N, M 0 J = M N J=(M I)N nIJ 0M0 1M-1N 2M-2N+N=2N 3M-32N+N=3N 4M-43N+N=4N ……… mM-mmNmN J = (M – I) N
Correction de Programmes H. Wertz12 Preuve de la correction du 3 ième programme Preuve par induction sur le nombre de passages en point 2 Base : n=1 I=M (M-M) N = 0 = J = 0 M Pas : I n+1 = I n – 1 J n+1 = J n + N = (M – I n ) N + N( fertilisation ) = (M – I n + 1) N = (M – (I n – 1)) N = (M I n+1 ) N
Correction de Programmes H. Wertz13 Preuve de la terminaison du 3 ième programme Procédons par induction décroissante : M = 0 I = 0 arrêt du programme Soit I = m, 0 < m M Faut démontrer quaprès 1 exécution I = m – 1 Si I n = m non(I n = 0), donc une exécution de la boucle I n+1 := I n – 1 = m – 1 (puisque m > 0 m – 1 0)
Correction de Programmes H. Wertz14 3 ième programme exemple (avec erreur 1) Base : n=1 I=M (M-M) N = 0 = J = 0 M Pas : marche aussi prévu : I n = 1 J n = (M – I n ) N (en 5) J n = M N mais : (en 5) J n = (M – I n ) N = (M – 1) N M N
Correction de Programmes H. Wertz15 3 ième programme exemple (avec erreur 2) nIJ 0M1 1M-1N+1 2M-22N+1 3M-33N+1 4M-44N+1 ……… mM-mmN+1 Autre invariante : J=(M-I)N+1 et : J n = (M – I n ) N+1 = MN+1 MN
Correction de Programmes H. Wertz16 3 ième programme exemple (avec erreur 3) invariante : J=(M I+1)N Base : n=1 I=M (M-M+1)*N = N = J Pas : marche aussi I n = 1 J n = (M – I n +1) N J n = M N = (M – 1 + 1) N = MN = J Maintenant : M = 0 I 0 = 0 J 0 = N I 0 1 donc I 1 = 1, I 2 = 2, etc boucle infinie marche pour tout M > 0 et boucle pour M=0
Correction de Programmes H. Wertz17 un dernier exemple linvariante : nIJ 1I0I0 J0J0 2 I 0 1 J0+2J0+2 3 I 0 2 J0+4J0+4 4 I 0 3 J0+6J0+6 J = J 0 +2 ( I 0 I) u lassertion de sortie : J = J I 0
Correction de Programmes H. Wertz18 preuve de la correction base : n = 1: I = I 0, J = J 0 = J (I 0 I 0 ) hypothèse : J n = J 0 +2 (I 0 I n ) pas : J n+1 = J n + 2 I n+1 = I n 1 = J (I 0 I n ) + 2 = J I 0 I n + 2 = J (I 0 I n + 1) = J (I 0 I n 1)) = J (I 0 I n+1 ) I n = 0 J n = J (I 0 I n ) = J 0 + 2I 0
Correction de Programmes H. Wertz19 Exercices trouvez linvariante, démontrez la correction et la terminaison Sortie: J = M N Entrée: M,N 1 Entrée: M 1 Sortie: J=M!
Correction de Programmes H. Wertz20 et maintenant ? 2 1
Correction de Programmes H. Wertz21 Exemple de boucles imbriquées Entrée: X[1:M,1:N] Sortie: P = max(X) 1 I M P=X[1,1]si I=1 sinon max(X[1:I 1,1:N]) 1 I M 1 J N si I=1et J=1 alors P=X[1,1] sinon P=max(X[1:I 1,1:N] X[I,1:J 1])
Correction de Programmes H. Wertz22 Exemple de boucles imbriquées (suite) Pour démontrer la correction partielle du programme il faut démontrer chacun des chemins ci-dessous : 1.1 – – 4 – 6 – – – 7 – – 4 – – 8