Title: CSI 3525, S
1Sémantique axiomatique
- Assignations
- Composition dinstructions
- Linstruction "if-else"
- Linstruction "while"
- Rétrécissement et élargissement
- Arrêt
- Linstruction "if"
2 Vérification dun programme
- La vérification des programmes est faite en deux
étapes - Lassociation dune formule à chaque étape du
programme. - La démonstration que le résultat finale est la
conséquence logique des conditions initiales,
après être passé par les étapes du programme.
3Quest-ce que la sémantique axiomatique?
- La sémantique axiomatique des assignations,
instructions composés, instructions
conditionnelles et instructions itératives fut
développée par le professeur C. A. R. Hoare. - Les éléments de base sont les formules pour
lassignation et la condition. - Leffet des autres instructions est décrit par la
règle dinférence qui combine les formules
dassignations et de conditions (tout comme les
instructions sont elle même des combinaisons
dassignations et de conditions).
4Lassignation
- Soit ? une formule contenant la variable v.
- ? v ? e est alors définie comme la formule
obtenue à partir de ? quand toutes les
occurrences de la variable v sont remplacées par
lexpression e.
5Remplacement, un exemple
- Avant le remplacement
- ? ? h gt 0 h lt n n gt 0
- h ? 0 ? 0 gt 0 0 lt n n gt 0
- Après le replacement
6Autre exemple
- ? ? m min(ai pour 1 lt i lt k1)
- k1 lt N
- ?k ? k1 ? m min(ai pour 1 lt i lt (k1) 1)
- (k1)1 lt N
- ? m min(ai pour 1 lt i lt k) k lt N
7Laxiome pour lassignation
- ?v ? e v e ?
- Exemple
- 0 gt 0 0 lt n n gt 0
- x 0
- x gt 0 x lt n n gt 0
8Deux exercices
??? z z 1 z lt N a gt b
a a b ???
9Composition dinstructions
- Supposons que
- ? S ?
- et
- ? S ?
- Alors, on conclu que
- ? S S ?
- En autre mots
- ? S ? S ?
10Un exemple
- x 0 f 1
- while (x ! n)
- x x 1
- f f x
-
- Nous voulons prouver
- f x! x x 1f f x
- f x!
11Le factoriel
- Appliquons la règle dinférence pour la
composition. - ? est f x!
- ? est f x!
- S est x x 1
- S est f f x
12Le factoriel (2)
- Nous cherchons le ? pour lequel
- f x! x x 1
- ?
- f f x f x!
- Observons que f x! ? f ((x 1) 1)!
- Et donc f (x 1)! x ? x 1 ? f x!
- f x! x x 1 f (x 1)!
?
?
S
13Le factoriel (3)
- Maintenant, observons que
- f (x 1)! ? f x (x 1)! x x!
- Donc, nous avons
- f x! f ? f x ? f (x 1)!
- Et ainsi
- f (x 1)! f f x f x!
- QED
?
?
S
14Linstruction "if-else"
- Supposons que
- ? ? S ?
- et
- ? ? ? S ?
- Alors, on conclu que
- ? if ( ? ) S else S ?
- Peu importe le cas choisi par linstruction
if-else, le résultat est la même formule ?.
Donc linstruction if-else en entier résulte en
la formule ?.
15"if-else", un exemple
- Linstruction
- if ( a lt 0 ) b -a else b a
- Rend la formule b abs(a) vrai.
- Plus spécifiquement
- trueif ( a lt 0 ) b -a else b a b
abs(a) - ? est true
- ? est b abs(a)
- ? est a lt 0
- S est b -a
- S est b a
16"if-else", un exemple (2)
- Considerons chaque cas. Premièrement, si ? est
vrai - true a lt 0 ? a lt 0 ? a abs(a)
- Alors, daprès laxiome de lassignation
- a abs(a) b -a b abs(a)
- De la même façon, si ? ? est vrai
- true ? a lt 0 ? a ? 0 ? a abs(a)
- Alors
- a abs(a) b a b abs(a)
17"if-else", un exemple (3)
- Donc S et S résultent en
- b abs(a)
- Nous avons donc prouvé
- trueif ( a lt 0 ) b -a else b a b
abs(a) - En autre mots, cette expression conditionnelle
trouve abs(a). Elle fait avec aucune
précondition "true" signifie quil ny a aucune
restriction sur les valeurs initiales de a et b.
18Linstruction "while"
- Un invariant de boucle est une condition qui est
satisfaite immédiatement avant le début dune
boucle, demeure vrai lors de son exécution, et
est toujours satisfaite à la sortie de la boucle.
- Supposons que
- ? ? S ?
- Cest à dire, S préserve ? (linvariant de
boucle) - Alors, on conclu que
- ? while ( ? ) S ? ? ?
- En autant que la boucle se termine (quelle nest
pas infini).
19Le factoriel (encore)
- x 0 f 1
- while ( x ! n )
- x x 1
- f f x
-
- On sait que n 0. Après les instructions
- x 0 f 1
- ce qui implique que f x! (1 0!)
- Nous avons déjà démontré que
- f x! x x 1 f f x f x!
20Le factoriel (encore) (2)
- Maintenant, ? est f x! ? est x ! n ?
? est x n - En utilisant la règle dinférence pour les
boucles "while" - f x!
- while ( x ! n )
- x x 1
- f f x
-
- f x! x n
21Le factoriel (encore) (3)
- Alors après la boucle, on a
- f x! x n ? f n!
- Ainsi
- true x 0 f 1 f x!
- et
- f x! while ( x ! n )
- x x 1
- f f x
-
- f n!
22Le factoriel (encore) (4)
- Donc, nous avons montré que la boucle détermine f
n!, avec aucune précondition sur les valeurs
initiales de f et n, tant que n 0. - Ainsi, avec laxiome de la composition
- true x 0 f 1
- while ( x ! n )
- x x 1
- f f x
-
- f n!
- Donc, le programme calcule le factoriel de n.
23Le factoriel (encore) (5)
- Le résonnement est le suivant pour la boucle une
variable est ajustée rendant linvariant
temporairement faux, mais un autre ajustement est
fait qui rétablie linvariant. Donc linvariant
est vérifié à la fin de la boucle. - f x! x x 1 f (x 1)!
- Linvariant est maintenant temporairement faux
- f (x 1)! f f x f x!
- Linvariant est maintenant rétablie
- Ce raisonnement nest pas valide pour les boucles
infiniela condition ? ? ? nest pas atteinte,
et la situation est indéterminée suivant la
boucle.
24Rétrécissement et élargissement
- Supposons que
- ? ? ?
- et
- ? S ?
- Alors, on conclu que
- ? S ?
- Supposons que
- ? S ?
- et
- ? ? ?
- Alors, on conclu que
- ? S ?
Ces règles peuvent permettre de rétrécir une
précondition, ou délargir une postcondition.
25Rétrécissement et élargissement, un exemple
- Nous avons vu que n! est calculé pour tout ngt0,
avec true comme précondition (le calcul réussit
toujours) - Donc, selon laxiome du rétrécissement, le calcul
de n! réussira également pour n 5.
26Autre exemple
- N gt 1 ?
- N gt 1 1 1 a1 a1 i 1 s
a1 - N gt 1 i 1 s a1 ?
- N gt 1 s a1 ai ? INVARIANT
- while ( i ! N )
- N gt 1 s a1 ai i ! N
- i i 1
- N gt 1 s a1 ai1 i 1 ! N
- s s ai
- N gt 1 s a1 ai
-
- N gt 1 s a1 ai i N ?
- N gt 1 s a1 aN
27Autre exemple (2)
- Nous avons montré que ce programme calcul la
somme de a1, ..., aN. - La précondition N gt 1 est seulement nécessaire
pour démontrer la terminaison.
28Arrêt
- Les preuves précédentes sont seulement
partiellement correcte. - Il reste a démontrer que les boucles se
terminent. - Une preuve correcte doit également montrer que
toutes les boucles auront toujours un nombre fini
ditérations. - On peut montrer quune boucle se terminera en
montrant que chaque itération nous rapproche de
la condition darrêt.
29Encore le factoriel
- Initialement, x 0.
- Chaque itération incrémente x de 1, donc, on
passe par les nombres 0, 1, 2, ... - n gt 0 sera nécessairement un de ces nombres
- Ce raisonnement ne fonctionnerait pas pour n lt 0,
et la condition darrêt ne serait pas atteinte
pour ces valeurs.
30Une fonction décroissante
- Une boucle termine quand une fonction des
variables du programme atteint 0 lors de
lexécution de la boucle. - Pour le factoriel, la fonction pourrait être
n x. La valeur de la fonction est initialement
n et diminue de 1 à chaque itération. - Pour la somme, on peut choisir N i.
31Multiplication par des additions successives
- B gt 0 B B 0 0 ? POUR LARRÊT
- b B p 0
- b B p 0 ? p A (B b) ?
INVARIANT - while ( b ! 0 )
- p p A
- p A (B (b 1))
- b b - 1
- p A (B b)
-
- p A (B b) b 0 ?
- p A B
- La boucle termine, puisque la valeur de b atteint
0.
32Exemple
- Montrons que
- p a a b b p
- échange les valeurs de a et b
- a A b B
- p a a b b p
- b A a B
- Les étapes de la preuve
- a A b B p a
- p A b B a b
- p A a B b p
- b A a B
33Exemple
Quel est leffet de la suite dinstruction
suivante sur les variables entières x, y
34Exemple (suite)
- x X y Y ?
- x y X Y y Y x x y
- x X Y y Y ?
- x X Y x - y X y x - y
- x X Y y X ?
- x - y Y y X x x - y
- x Y y X
35Le plus grand commun diviseur
- X gt 0 Y gt 0
- a X b Y
- ? ? que devrait-être linvariant?
- while ( a ! b ) ? a ! b
- if ( a gt b ) ? a ! b a gt b
- a a - b
- else ? a ! b ? (a gt b)
- b b - a
-
- ? ? (a ! b)
- PGCD( X, Y ) a
36PGCD (2)
- On aura besoin de ces propriétés des pgcd
- PGCD( n m, m ) PGCD( n, m )
- PGCD( n, m n ) PGCD( n, m )
- La première étape (de façon très formelle)
- X gt 0 Y gt 0 ?
- X gt 0 Y gt 0 X X Y Y
- a X b Y
- a gt 0 b gt 0 a X b Y
37PGCD (3)
- Quand la boucle termine, on a a b PGCD(
a, b ) aOn voudra probablement donc cette
condition dans linvariant - a b PGCD( X, Y ) PGCD( a, b )
- Au début de la boucle
- a gt 0 b gt 0 a X b Y ?
- a gt 0 b gt 0 PGCD( X, Y ) PGCD( a, b )
- Donc linvariant sera
- a gt 0 b gt 0 PGCD( X, Y ) PGCD( a, b )
38PGCD (4)
- On veut prouver que
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
a ! b - while ......
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
- La condition finale sera donc
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b) a
b - Ce qui implique
- PGCD( X, Y ) a
39PGCD (5)
- La boucle consiste en une instruction
conditionnelle. - La preuve sera faite si on démontre
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
a ! b - if ( a gt b )
- a a - b
- else
- b b - a
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
40PGCD (6)
- Considérons le cas a gt b
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b) a
! b a gt b ? - a b gt 0 b gt 0 PGCD(X, Y) PGCD(a
b, b) - a a - b
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
41PGCD (7)
- Maintenant, le cas ? a gt b.
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
a ! b ? (a gt b) ? - a gt 0 b a gt 0 PGCD(X, Y) PGCD(a, b
a) - b b - a
- a gt 0 b gt 0 PGCD(X, Y) PGCD(a, b)
42PGCD (8)
- Les deux cas du if-else emmènent la même
condition finale. Il reste seulement à montrer
que la boucle termine. - On montre que max( a, b ) diminue à chaque
itération de la boucle. - Soit a A, b B au début dune itération.
- Supposons dabord que a gt b
- max( a, b ) A,
- donc a b lt A, b lt A,
- donc max( a b, b ) lt A.
43PGCD (9)
- Et si a lt b
- max( a, b ) B,
- b a lt B, a lt B,
- donc max( a, b a ) lt B.
- Puisque a gt 0 et b gt 0, max( a, b ) gt 0.
- Donc la diminution de a et b ne peut pas se
poursuivre indéfiniment. - QED
44Linstruction "if"
- Supposons que
- ? ? S ?
- et
- ? ? ? ? ?
- Alors, on conclu que
- ? if ( ? ) S ?
45Un exemple de "if"
- Démontrons que
- N gt 0
- k 1 m a1
- while ( k ! N )
- k k 1
- if ( ak lt m ) m ak
-
- m min( 1 lt i i lt N ai )
46Minimum (1)
- Le fait que la boucle se termine est évidant
- N k vers zéro.
- Linvariant de la boucle à la kième itération,
après avoir inspecté a1, ..., ak, on sait que m
min( 1 lt i i lt k ai ). - Initialement, on a
- N gt 0 k 1 m a1
- k 1 m a1 ?
- k 1 m min( 1 lt i i lt k ai )
47Minimum (2)
- Nous devons donc démontrer
- m min( 1 lt i i lt k ai ) k ! N
- k k 1
- if ( ak lt m ) m ak
- m min( 1 lt i i lt k ai )
48Minimum (3)
- m min( 1 lt i i lt k ai ) k ! N
? - m min( 1 lt i i lt (k 1) 1 ai )
(k 1) 1 ! N - k k 1
- m min( 1 lt i i lt k 1 ai ) k 1
! N - Notons que k 1 ! N assure lexistence de ak.
49Minimum (4)
- Il reste à démontrer
- m min( 1 lt i i lt k 1 ai ) k 1
! N - if ( ak lt m ) m ak
- m min( 1 lt i i lt k ai )
- On utilisera le fait que
- min( 1 lt i i lt k ai ) min2( min( 1 lt i
i lt k 1 ai ), ak )
50Minimum (5)
- Considérons les deux cas de lexpression
conditionnelle. - Premièrement, ?(ak lt m).
- m min(1 lt i i lt k 1 ai ) k 1 ! N
?(ak lt m) ? - m min2(min( 1 lt i i lt k 1 ai ), ak )
? - m min(1 lt i i lt k ai )
51Minimum (6)
- Deuxièmement, ak lt m.
- m min(1 lt i i lt k 1 ai ) k 1 !
N ak lt m ? - ak min2( min( 1 lt i i lt k 1 ai ), ak
) ? - ak min(1 lt i i lt k ai )
- m ak
- m min(1 lt i i lt k ai )
- Donc la boucle préserve la condition
- m min( 1 lt i i lt k ai )
52Minimum (7)
- La boucle en entier fonctionne donc ainsi
- m min( 1 lt i i lt k ai )
- while ( k ! N )
- k k 1 if ( ak lt m ) ak m
-
- m min( 1 lt i i lt k ai ) k N ?
- m min( 1 lt i i lt N ai )
- Nous avons montré que le programme trouve le
minimum parmi N nombres, si N gt 0. - QED
53Encore une boucle "while"
Exemples
- B gt 0 ? POUR LA TERMINAISON
- b 1 p A
- while ( b ! B )
- b b 1
- p p A
-
- ???
54Exemples
Encore une boucle "while (2)
- B gt 0 1 1 A A ? POUR LA
TERMINAISON - b 1 p A
- b 1 p A ? p A b ?
INVARIANT - while ( b ! B )
- b b 1
- p A (b - 1)
- p p A
- p A b
-
- p A b b B ?
- p A B
- La boucle se termine la valeur B - b devient 0.
55Un autre example avec "if"
Exemples
- N gt 0 ? POUR LA TERMINAISON
- k 1
- while ( k ! N )
- if ( Ak gt Ak1 )
- p Ak Ak Ak1 Ak1 p
- k k 1
-
- ???
56Un autre example avec "if (2)
Exemples
- N gt 0 ? FOR TERMINATION
- k 1
- Ak max( 1 lt i i lt k Ai ) ?
INVARIANT - while ( k ! N )
- Ak max( 1 lt i i lt k Ai ) k
! N - if ( Ak gt Ak1 )
- p Ak Ak Ak1 Ak1 p
- Ak1 max( 1 lt i i lt k1 Ai )
- k k 1
- Ak max( 1 lt i i lt k Ai )
-
- Ak max( 1 lt i i lt k Ai ) k N ?
- AN max( 1 lt i i lt N Ai )
57Examples
Un autre example avec "if (3)
- Ak max( 1 lt i i lt k Ai ) k ! N
- Cas 1 Ak gt Ak1
- Ak max( 1 lt i i lt k Ai ) k ! N
Ak gt Ak1 - p Ak p gt Ak1
- Ak Ak1 p gt Ak
- Ak1 p Ak1 gt Ak
- Ak1 max( 1 lt i i lt k1 Ai )
- Cas 2 Ak lt Ak1
- Ak max( 1 lt i i lt k Ai ) k ! N
Ak lt Ak1 ? - Ak1 max( 1 lt i i lt k1 Ai )