Cours dAlgorithmique Logique de Hoare fin Les boucles
Cours d’Algorithmique Logique de Hoare (fin) : Les boucles et les invariants. 19 décembre 2006 Cours d'algorithmique 10 / Intranet 1
Les grandes lignes du cours • Trier et cher, recherche textuelle • Listes et arbres • Le back-track • Arbres équilibrés • Récursivité et induction sur la structure • Divide and conquer, algorithmes gloutons • Minimax, alpha-beta • Dérécursion • Divers problèmes particuliers • Logique de Hoare • Programmation dynamique • Complexité et calculabilité 19 décembre 2006 Cours d'algorithmique 10 / Intranet 2
Logique de Hoare -------------------------------- W H I L E e t l e s I N V A R I A N T S D E B O U C L E 19 décembre 2006 Cours d'algorithmique 10 / Intranet 3
Logique de Hoare -------------------------------- • L’exemple qui nous sert à illustrer la notion d’invariant : – PRE : V , D e IN – POST: Q , R e IN telles V = Q * D + R et R < D. • C’est la spécification de la division euclidienne ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 4
Logique de Hoare -------------------------------- Exemple : V = 17 , D = 5 Q <- 0 ; V = 17 , D = 5 , Q = 0 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R R <- V ; V = 17 , D = 5 , Q = 0 , R = 17 while R >= D V = 17 , D = 5 , Q = 0 , R = 17 V = 17 , D = 5 , Q = 1 , R = 12 Q <- Q + 1 ; V = 17 , D = 5 , Q = 1 , R = 17 V = 17 , D = 5 , Q = 2 , R = 12 R <- R - D V = 17 , D = 5 , Q = 1 , R = 12 19 décembre 2006 V = 17 , D = 5 , Q = 2 , R = 7 Cours d'algorithmique 10 / Intranet 5
Logique de Hoare -------------------------------- Exemple : V = 17 , D = 5 Q <- 0 ; V = 17 , D = 5 , Q = 0 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R R <- V ; V = 17 , D = 5 , Q = 0 , R = 17 while R >= D V = 17 , D = 5 , Q = 2 , R = 7 A la fin : Q <- Q + 1 ; V = 17 , D = 5 , Q = 3 , R = 7 R <- R - D V = 17 , D = 5 , Q = 3 , R = 2 19 décembre 2006 V = Q*D+R et R < D Cours d'algorithmique 10 / Intranet 6
Logique de Hoare -------------------------------- • Les valeurs de V , D , Q , R peuvent changer. • Mais la relation V = Q * D + R reste toujours vérifiée. • C’est ce qu’on appelle un « invariant » ! • Un invariant est un prédicat qui : – est vrai à chaque début de boucle, – et à chaque fin de boucle, – c’est-à-dire début de la boucle suivante. (Les tests ne font pas d’affectation !) 19 décembre 2006 Cours d'algorithmique 10 / Intranet 7
Logique de Hoare -------------------------------- • Pour écrire un corps de boucle, il faut connaître l’invariant de la boucle ! • Votre code sera exécuté par le « i » e tour de boucle, quel que soit la valeur de « i » . • Pour savoir ce que vous devez faire au « i » etour de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. • Ceci revient à connaître « l’invariant » ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 8
Logique de Hoare -------------------------------- • Quel est l’invariant ? s <- 0 ; i <- 1 ; while ( i <= n ) do s <- s + i ; i <- i + 1 • Avant le « i e» tour de boucle, nous avons fait les tours de boucle de « 1 » à « i – 1 » . • Nous avons donc sommé dans « s » les valeurs de « 1 » à « i – 1 » . i– 1 • Invariant : s = S j 19 décembre 2006 j=1 Cours d'algorithmique 10 / Intranet 9
Logique de Hoare -------------------------------- • Règle pour le programme while C do g : {I, C}g {I} { I } while C do g {I, ùC} • Nous dirons que « I » est l’invariant ! • La condition { I , C } g { I } vérifie que « I » est bien invariant ! ! ! • La post-condition { I , ù C } est évidente ! • Il suffit alors que { I } soit vrai au début ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 10
Logique de Hoare -------------------------------- • Dans la pratique, nous avons une post-condition Q et le code while C do g : { ? ? ? , C } g { ? ? ? } while C do g {Q} • Quel prédicat « I » faut-il choisir comme invariant ? • C’est l’utilisateur qui doit faire une proposition ! • Nouvelle syntaxe : while C do g inv I 19 décembre 2006 Cours d'algorithmique 10 / Intranet 11
Logique de Hoare -------------------------------- • Règle pour le programme while C do g inv I : I , C => F {F} g {I} { I } while C do I , ù C => Q g inv I { Q } • Nous devons prouver que I , ù C => Q ! • Nous calculons la pré-condition « F » de { F } g { I } ! • Nous prouvons que I , C => F ! • A ce moment, nous connaissons la pré-condition « I » ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 12
Logique de Hoare -------------------------------- • Règle pour le programme while C do g inv I : I , C => F {F} g {I} { I } while C do I , ù C => Q g inv I { Q } • Attention, il y a deux obligations de preuve ! • Elles sont semi-automatisables. • Un prouveur peut ne pas trouver la preuve ! • Un prouveur ne saura jamais dire si elle n’existe pas ! ! ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 13
Logique de Hoare -------------------------------- UN PREMIER EXEMPLE 19 décembre 2006 Cours d'algorithmique 10 / Intranet 14
Logique de Hoare --------------------------------R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; R <- R – D inv I • POST : Q = { V = D * Q + R , 0 <= R < D } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 15
Logique de Hoare --------------------------------R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; R <- R – D Sans problème : I , ù C => Q inv I = { V = D * Q + R , 0 <= R } • POST : Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 16
Logique de Hoare --------------------------------R <- V ; Q <- 0 ; while ( R >= D ) do Après simplification ! F = { V = D * Q + R , D <= R } Q <- Q + 1 ; R <- R – D Sans problème : I , ù C => Q { V = D * Q + R – D , 0 <= R – D } { V = D * Q + R , 0 <= R } inv I = { V = D * Q + R , 0 <= R } • POST : Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 17
Logique de Hoare -------------------------------- I , C => F {F} g {I} { I } while C do I , ù C => Q g inv I { Q } { V = D * Q + R , 0 <= R } et { R >= D } !!!!!! => { V = D * Q + R , D <= R } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 18
Logique de Hoare ---------------------- • PRE : { V = D ----------* 0 + V , 0 <= V } = { V >= 0 } R <- V ; Q <- 0 ; { V = D * 0 + R , 0 <= R } I = { V = D * Q + R , 0 <= R } while ( R >= D ) do Sans problème : I , C => F Sans problème : I , ù C => Q F = { V = D * Q + R , D <= R } Q <- Q + 1 ; R <- R – D { V = D * Q + R – D , 0 <= R – D } { V = D * Q + R , 0 <= R } inv I = { V = D * Q + R , 0 <= R } • POST : Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 19
Logique de Hoare -------------------------------- UN DEUXIEME EXEMPLE 19 décembre 2006 Cours d'algorithmique 10 / Intranet 20
Logique de Hoare --------------------------------x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; y <- x % y ; x <- m • POST : inv I Q = { x = pgcd( a , b ) } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 21
Logique de Hoare --------------------------------x <- a ; y <- b ; while ( y <> 0 ) do Sans problème : m <- y ; y <- x % y ; x <- m I , ù C => Q • POST : = { pgcd( x , y ) = pgcd( a , b ) } inv I Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 22
Logique de Hoare --------------------------------x <- a ; y <- b ; while ( y <> 0 ) do F = { pgcd( y , x % y ) = pgcd( a , b ) } Sans problème : I , ù C => Q • POST : m <- y ; y <- x % y ; x <- m { pgcd( m , x%y ) = pgcd( a , b ) } { pgcd( m , y ) = pgcd( a , b ) } { pgcd( x , y ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) } inv I Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 23
Logique de Hoare --------------------------------I , C => F { pgcd( x , y ) = pgcd( a , b ) } et { y <> 0 } ? ? ? => { pgcd( y , x % y ) = pgcd( a , b ) } Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y ) Nous devons renforcer l’invariant : { pgcd( x , y ) = pgcd( a , b ) , x >= y } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 24
Logique de Hoare --------------------------------x <- a ; y <- b ; while ( y <> 0 ) do Sans problème : m <- y ; y <- x % y ; x <- m I , ù C => Q • POST : = { pgcd( x , y ) = pgcd( a , b ) , x >= y } inv I Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 25
Logique de Hoare --------------------------------x <- a ; y <- b ; while ( y <> 0 ) do F = { pgcd( y , x % y ) = pgcd( a , b ) } Sans problème : I , ù C => Q • POST : m <- y ; y <- x % y ; x <- m {. . . , m >= x % y } {. . . , m >= y } { pgcd( x , y ) = pgcd( a , b ) , x >= y } = { pgcd( x , y ) = pgcd( a , b ) , x >= y } inv I Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 26
Logique de Hoare --------------------------------I , C => F { pgcd( x , y ) = pgcd( a , b ) , x >= y } et { y <> 0 } !!!!!! => { pgcd( y , x % y ) = pgcd( a , b ) } Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y ) 19 décembre 2006 Cours d'algorithmique 10 / Intranet 27
Logique de Hoare -------------------------------- • PRE : { pgcd( a , b ) = pgcd( a , b ) , a >= b } = { a >= b } x <- a ; y <- b ; I = { pgcd( x , y ) = pgcd( a , b ) , x >= y } while ( y <> 0 ) do Sans problème : I , C => F Sans problème : I , ù C => Q • POST : F = { pgcd( y , x % y ) = pgcd( a , b ) } m <- y ; y <- x % y ; x <- m {. . . , m >= x % y } {. . . , m >= y } { pgcd( x , y ) = pgcd( a , b ) , x >= y } = { pgcd( x , y ) = pgcd( a , b ) , x >= y } inv I Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 } 19 décembre 2006 Cours d'algorithmique 10 / Intranet 28
Logique de Hoare -------------------------------- UN TROISIEME EXEMPLE 19 décembre 2006 Cours d'algorithmique 10 / Intranet 29
Logique de Hoare --------------------------------s <- 0 ; c <- 1 ; while ( c <= n ) do Sans problème : s <- s + c ; c <- c + 1 c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S i } i=1 n c– 1 • POST : Q = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 30
Logique de Hoare --------------------------------s <- 0 ; c <- 1 ; Après simplification ! while ( c <= n ) do c– 1 F = { c <= n , s = S i } i=1 s <- s + c ; c <- c + 1 Sans problème : I =. . . c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S i } i=1 n c– 1 • POST : Q = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 31
Logique de Hoare --------------------------------s <- 0 ; c <- 1 ; while ( c <= n ) do c– 1 Sans problème : F = { c <= n , s = S i } i=1 I , C => F s <- s + c ; c <- c + 1 Sans problème : I =. . . c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S i } i=1 n c– 1 • POST : Q = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 32
Logique de Hoare ----------------------1– 1 ---------- • PRE : { 1 <= n + 1 , 0 = S i } = { n >= 0 } i=1 s <- 0 ; c <- 1 ; c– 1 I = { c <= n + 1 , s = S i } i=1 while ( c <= n ) do c– 1 Sans problème : F = { c <= n , s = S i } i=1 I , C => F s <- s + c ; c <- c + 1 Sans problème : I =. . . c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S i } i=1 n c– 1 • POST : Q = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 33
Logique de Hoare -------------------------------- • Une autre initialisation : • PRE : 2– 1 { 2 <= n + 1 , 1 = S i } = { n >= 1 } i=1 s <- 1 ; c <- 2 ; c– 1 I = { c <= n + 1 , s = S i } i=1 while ( c <= n ) do. . . n • POST : Q = { s = S i } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 34
Logique de Hoare -------------------------------- • Une mauvaise initialisation : • PRE : 2– 1 { 2 <= n + 1 , 6 = S i } = { n >= 1 , 6 = 1 } = { FAUX } i=1 s <- 6 ; c <- 2 ; c– 1 I = { c <= n + 1 , s = S i } i=1 while ( c <= n ) do. . . n • POST : Q = { s = S i } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 35
Logique de Hoare -------------------------------- • Une mauvaise initialisation : • PRE : 2– 1 { 2 <= n + 1 , 6 = S i } = { n >= 1 , 6 = 1 } = { n >= 1 i=1 s <- 6 ; c <- 2 ; c– 1 I = { c <= n + 1 , s = S i } i=1 while ( c <= n ) do. . . n • POST : Q = { s = S i } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 36
Logique de Hoare -------------------------------- • Une mauvaise initialisation : • PRE : 2– 1 { 2 <= n + 1 , 6 = S i } = { n >= 1 , 6 = 1 } = { n >= 3 i=1 s <- 6 ; c <- 2 ; c– 1 I = { c <= n + 1 , s = S i } i=1 while ( c <= n ) do. . . n • POST : Q = { s = S i } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 37
Logique de Hoare -------------------------------- • Un mauvais invariant : . . . while ( c <= n ) do Sans problème : s <- s + c + 3 ; c <- c + 1 c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S i } i=1 n c– 1 • POST : Q = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 19 décembre 2006 Cours d'algorithmique 10 / Intranet 38
Logique de Hoare -------------------------------- • Un mauvais invariant : . . . Après simplification ! while ( c <= n ) do Sans problème : I , ù C => Q • POST : Q 19 décembre 2006 c– 1 F = { c <= n , s + 3 = S i } i=1 s <- s + c + 3 ; c <- c + 1 I =. . . c– 1 = { c <= n + 1 , s = S i } inv I i=1 n c– 1 = { s = S i } = { s = S i , c <= n + 1 , c > n } i=1 Cours d'algorithmique 10 / Intranet 39
Logique de Hoare --------------------------------I , C => F c– 1 { c <= n + 1 , s = S i } et { c <= n } i=1 NON => // c– 1 { c <= n + 1 , s + 3 = S i } i=1 Sinon, nous aurions 3 = 0 ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 40
Logique de Hoare -------------------------------- • Un mauvais invariant : . . . Après simplification ! while ( c <= n ) do c– 1 Sans problème : F = { c <= n , s = S (i + 3) } i=1 I , C => F s <- s + c + 3 ; c <- c + 1 Sans problème : I =. . . c– 1 I , ù C => Q inv I = { c <= n + 1 , s = S (i + 3) } n c– 1 i=1 • POST : Q = { s = S (i + 3) } = { s = S (i + 3) , c <= n + 1 , i=1 c>n} 19 décembre 2006 Cours d'algorithmique 10 / Intranet 41
Logique de Hoare -------------------------------- • Attention : • Tout ceci n’empêche pas un programme de boucler ! • Nous affirmons seulement que – si le programme s’arrête, – alors il rend le résultat indiqué ! 19 décembre 2006 Cours d'algorithmique 10 / Intranet 42
- Slides: 42