42
Cours d'algorithmique 10 Cours d'algorithmique 10 / Intranet / Intranet 1 19 décembre 2006 19 décembre 2006 Cours d’Algorithmique Cours d’Algorithmique Logique de Hoare (fin) : Logique de Hoare (fin) : Les boucles et Les boucles et les invariants. les invariants.

Cours d’Algorithmique

  • Upload
    derica

  • View
    37

  • Download
    0

Embed Size (px)

DESCRIPTION

Cours d’Algorithmique. Logique de Hoare (fin) : Les boucles et les invariants. Les grandes lignes du cours. Trier et chercher, recherche textuelle Listes et arbres Le back-track Arbres équilibrés Récursivité et induction sur la structure Divide and conquer, algorithmes gloutons - PowerPoint PPT Presentation

Citation preview

Page 1: Cours d’Algorithmique

Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1119 décembre 200619 décembre 2006

Cours d’AlgorithmiqueCours d’Algorithmique

Logique de Hoare (fin) :Logique de Hoare (fin) :

Les boucles etLes boucles et

les invariants.les invariants.

Page 2: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 22

• Trier et chercher, recherche textuelleTrier et chercher, recherche textuelle• Listes et arbresListes et arbres• Le back-trackLe back-track• Arbres équilibrésArbres équilibrés• Récursivité et induction sur la structureRécursivité et induction sur la structure• Divide and conquer, algorithmes gloutonsDivide and conquer, algorithmes gloutons• Minimax, alpha-betaMinimax, alpha-beta• DérécursionDérécursion• Divers problèmes particuliersDivers problèmes particuliers• Logique de HoareLogique de Hoare• Programmation dynamiqueProgrammation dynamique• Complexité et calculabilitéComplexité et calculabilité

Les grandes lignes du coursLes grandes lignes du cours

Page 3: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 33

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

W H I L EW H I L E

e t l e se t l e s

I N V A R I A N T SI N V A R I A N T SD ED E

B O U C L EB O U C L E

Page 4: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 44

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• L’exemple qui nous sert à illustrer la notion L’exemple qui nous sert à illustrer la notion d’invariant :d’invariant :

– PRE : V , D PRE : V , D N N

– POST: POST: Q , R Q , R N N

telles V = Q * D + R telles V = Q * D + R et R < D .et R < D .

• C’est la spécification de la division euclidienne !C’est la spécification de la division euclidienne !

II

II

Page 5: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 55

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

Exemple : V = 17 , D = 5Exemple : V = 17 , D = 5

V = 17 , D = 5 , Q = 0V = 17 , D = 5 , Q = 0

Q <- 0 ;Q <- 0 ;

R <- V ;R <- V ;

while R >= Dwhile R >= D

Q <- Q + 1 ;Q <- Q + 1 ;

R <- R - DR <- R - D

V = 17 , D = 5 , Q = 0 , R = 17V = 17 , D = 5 , Q = 0 , R = 17

V = 17 , D = 5 , Q = 0 , R = 17V = 17 , D = 5 , Q = 0 , R = 17

V = 17 , D = 5 , Q = 1 , R = 17V = 17 , D = 5 , Q = 1 , R = 17

V = 17 , D = 5 , Q = 1 , R = 12V = 17 , D = 5 , Q = 1 , R = 12

V = 17 , D = 5 , Q = 1 , R = 12V = 17 , D = 5 , Q = 1 , R = 12

Y a-t-il quelque-chose de communY a-t-il quelque-chose de communentre les différentes itérations ?entre les différentes itérations ?

OUI : V = Q * D + ROUI : V = Q * D + R

V = 17 , D = 5 , Q = 2 , R = 12V = 17 , D = 5 , Q = 2 , R = 12

V = 17 , D = 5 , Q = 2 , R = 7V = 17 , D = 5 , Q = 2 , R = 7

Page 6: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 66

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

Exemple : V = 17 , D = 5Exemple : V = 17 , D = 5

V = 17 , D = 5 , Q = 0V = 17 , D = 5 , Q = 0

Q <- 0 ;Q <- 0 ;

R <- V ;R <- V ;

while R >= Dwhile R >= D

Q <- Q + 1 ;Q <- Q + 1 ;

R <- R - DR <- R - D

V = 17 , D = 5 , Q = 0 , R = 17V = 17 , D = 5 , Q = 0 , R = 17

Y a-t-il quelque-chose de communY a-t-il quelque-chose de communentre les différentes itérations ?entre les différentes itérations ?

OUI : V = Q * D + ROUI : V = Q * D + R

V = 17 , D = 5 , Q = 2 , R = 7V = 17 , D = 5 , Q = 2 , R = 7

V = 17 , D = 5 , Q = 3 , R = 7V = 17 , D = 5 , Q = 3 , R = 7

V = 17 , D = 5 , Q = 3 , R = 2V = 17 , D = 5 , Q = 3 , R = 2

A la fin :A la fin :

V = Q * D + RV = Q * D + Retet

R < DR < D

Page 7: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 77

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Les valeurs de Les valeurs de V , D , Q , RV , D , Q , R peuvent changer. peuvent changer.

• Mais la relation Mais la relation V = Q * D + RV = Q * D + R reste toujours vérifiée. reste toujours vérifiée.

• C’est ce qu’on appelle un « invariant » !C’est ce qu’on appelle un « invariant » !

• Un invariant est un prédicat qui :Un invariant est un prédicat qui :

– est vrai à chaque début de boucle,est vrai à chaque début de boucle,

– et à chaque fin de boucle,et à chaque fin de boucle,

– c’est-à-dire début de la boucle suivante.c’est-à-dire début de la boucle suivante. (Les tests ne font pas d’affectation !)(Les tests ne font pas d’affectation !)

Page 8: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 88

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Pour écrire un corps de boucle, il faut connaître Pour écrire un corps de boucle, il faut connaître l’invariant de la boucle !l’invariant de la boucle !

• Votre code sera exécuté par le « i  » tour de Votre code sera exécuté par le « i  » tour de boucle, quel que soit la valeur de « i ».boucle, quel que soit la valeur de « i ».

• Pour savoir ce que vous devez faire au « i  » tour Pour savoir ce que vous devez faire au « i  » tour de boucle, vous devez vous souvenir de ce que de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. vous avez fait pendant les « i – 1 » premiers tours.

• Ceci revient à connaître « l’invariant » !Ceci revient à connaître « l’invariant » !

ee

ee

Page 9: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 99

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Quel est l’invariant ?Quel est l’invariant ?

• Avant le « i  » tour de boucle, nous avons fait les tours de boucle de « 1 » à « i – 1 ».Avant le « i  » 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 ».Nous avons donc sommé dans « s » les valeurs de « 1 » à « i – 1 ».

• Invariant :Invariant : s = s = j j

s <- 0 ;s <- 0 ;i <- 1 ;i <- 1 ;

while ( i <= n ) do while ( i <= n ) do

s <- s + i ;s <- s + i ; i <- i + 1 i <- i + 1

ee

j = 1j = 1

i – 1i – 1

Page 10: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1010

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Règle pour le programme Règle pour le programme while C dowhile C do : :

• Nous dirons que « I » est l’invariant !Nous dirons que « I » est l’invariant !

• La condition La condition { I , C }{ I , C } { I } { I } vérifie que « I » est bien invariant ! ! !vérifie que « I » est bien invariant ! ! !

• La post-condition La post-condition { I{ I , , C } C } est évidente !est évidente !

• Il suffit alors que Il suffit alors que { I }{ I } soit vrai au début ! soit vrai au début !

{ I }{ I } while C dowhile C do { I{ I , , C } C }

{ I , C }{ I , C } { I }{ I }

Page 11: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1111

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Dans la pratique, nous avons une post-condition Dans la pratique, nous avons une post-condition QQ et le code et le code while C dowhile C do : :

• Quel prédicat « I » faut-il choisir comme invariant ?Quel prédicat « I » faut-il choisir comme invariant ?

• C’est l’utilisateur qui doit faire une proposition !C’est l’utilisateur qui doit faire une proposition !

• Nouvelle syntaxe :Nouvelle syntaxe : while C do while C do inv Iinv I

{ ??? }{ ??? } while C dowhile C do { Q }{ Q }

{ ??? , C }{ ??? , C } { ??? }{ ??? }

Page 12: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1212

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Règle pour le programme Règle pour le programme while C dowhile C do inv I inv I ::

• Nous devons prouver que I , Nous devons prouver que I , C => Q ! C => Q !

• Nous calculons la pré-condition « F » de { F } Nous calculons la pré-condition « F » de { F } { I } ! { I } !

• Nous prouvons que I , C => F !Nous prouvons que I , C => F !

• A ce moment, nous connaissons la pré-condition « I » !A ce moment, nous connaissons la pré-condition « I » !

{ F } { F } { I } { I }I , C => FI , C => F I , I , C => Q C => Q

{ I }{ I } while C dowhile C do inv I inv I { Q }{ Q }

Page 13: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1313

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Règle pour le programme Règle pour le programme while C dowhile C do inv I inv I ::

• Attention, il y a deux obligations de preuve !Attention, il y a deux obligations de preuve !

• Elles sont semi-automatisables.Elles sont semi-automatisables.

• Un prouveur peut ne pas trouver la preuve !Un prouveur peut ne pas trouver la preuve !

• Un prouveur ne saura jamais dire si elle n’existe pas ! ! !Un prouveur ne saura jamais dire si elle n’existe pas ! ! !

{ F } { F } { I } { I }I , C => FI , C => F I , I , C => Q C => Q

{ I }{ I } while C dowhile C do inv I inv I { Q }{ Q }

Page 14: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1414

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

U NU N

P R E M I E RP R E M I E R

E X E M P L EE X E M P L E

Page 15: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1515

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• POST :POST :

R <- V ;R <- V ;Q <- 0 ;Q <- 0 ;

while ( R >= D ) dowhile ( R >= D ) do

Q <- Q + 1 ;Q <- Q + 1 ; R <- R – DR <- R – D

inv Iinv I

Q = { V = D * Q + R , 0 <= R < D }Q = { V = D * Q + R , 0 <= R < D }

Page 16: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1616

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• POST :POST :

R <- V ;R <- V ;Q <- 0 ;Q <- 0 ;

while ( R >= D ) dowhile ( R >= D ) do

Q <- Q + 1 ;Q <- Q + 1 ; R <- R – DR <- R – D

inv Iinv I

Q = { V = D * Q + R , 0 <= R < D }Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D }= { V = D * Q + R , 0 <= R } et { R < D }

= { V = D * Q + R , 0 <= R }= { V = D * Q + R , 0 <= R }

Sans problème :Sans problème :

I , I , C => Q C => Q

Page 17: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1717

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• POST :POST :

R <- V ;R <- V ;Q <- 0 ;Q <- 0 ;

while ( R >= D ) dowhile ( R >= D ) do

Q <- Q + 1 ;Q <- Q + 1 ; R <- R – DR <- R – D

inv Iinv I

Q = { V = D * Q + R , 0 <= R < D }Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D }= { V = D * Q + R , 0 <= R } et { R < D }

= { V = D * Q + R , 0 <= R }= { V = D * Q + R , 0 <= R }

Sans problème :Sans problème :

I , I , C => Q C => Q

F = { V = D * Q + R , D <= R }F = { V = D * Q + R , D <= R }

{ V = D * Q + R , 0 <= R }{ V = D * Q + R , 0 <= R }

{ V = D * Q + R – D , 0 <= R – D }{ V = D * Q + R – D , 0 <= R – D }

Après simplification !Après simplification !

Page 18: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1818

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

{ F } { F } { I } { I } I , I , C => Q C => Q

{ I }{ I } while C dowhile C do inv I inv I { Q }{ Q }

I , C => FI , C => F

{ V = D * Q + R , 0 <= R } { V = D * Q + R , 0 <= R } et et { R >= D }{ R >= D }

!!!!!!!!!!!!=>=>

{ V = D * Q + R , D <= R }{ V = D * Q + R , D <= R }

Page 19: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 1919

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• POST :POST :

R <- V ;R <- V ;Q <- 0 ;Q <- 0 ;

while ( R >= D ) dowhile ( R >= D ) do

Q <- Q + 1 ;Q <- Q + 1 ; R <- R – DR <- R – D

inv Iinv I

Q = { V = D * Q + R , 0 <= R < D }Q = { V = D * Q + R , 0 <= R < D } = { V = D * Q + R , 0 <= R } et { R < D }= { V = D * Q + R , 0 <= R } et { R < D }

= { V = D * Q + R , 0 <= R }= { V = D * Q + R , 0 <= R }

Sans problème :Sans problème :

I , I , C => Q C => Q

F = { V = D * Q + R , D <= R }F = { V = D * Q + R , D <= R }

{ V = D * Q + R , 0 <= R }{ V = D * Q + R , 0 <= R }

{ V = D * Q + R – D , 0 <= R – D }{ V = D * Q + R – D , 0 <= R – D }

I = { V = D * Q + R , 0 <= R }I = { V = D * Q + R , 0 <= R }

Sans problème :Sans problème :

I , C => FI , C => F

{ V = D * 0 + R , 0 <= R }{ V = D * 0 + R , 0 <= R }

{ V = D * 0 + V , 0 <= V } = { V >= 0 }{ V = D * 0 + V , 0 <= V } = { V >= 0 }• PRE :PRE :

Page 20: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2020

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

U NU N

D E U X I E M ED E U X I E M E

E X E M P L EE X E M P L E

Page 21: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2121

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) }Q = { x = pgcd( a , b ) }

Page 22: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2222

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) } Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) }= { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 }= { pgcd( x , y ) = pgcd( a , b ) , y = 0 }

= { pgcd( x , y ) = pgcd( a , b ) }= { pgcd( x , y ) = pgcd( a , b ) }

Sans problème :Sans problème :

I , I , C => Q C => Q

Page 23: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2323

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) } Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) }= { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 }= { pgcd( x , y ) = pgcd( a , b ) , y = 0 }

= { pgcd( x , y ) = pgcd( a , b ) }= { pgcd( x , y ) = pgcd( a , b ) }

Sans problème :Sans problème :

I , I , C => Q C => Q

F = { pgcd( y , x % y ) = pgcd( a , b ) }F = { pgcd( y , x % y ) = pgcd( a , b ) }

{ pgcd( x , y ) = pgcd( a , b ) }{ pgcd( x , y ) = pgcd( a , b ) }

{ pgcd( m , y ) = pgcd( a , b ) }{ pgcd( m , y ) = pgcd( a , b ) }

{ pgcd( m , x%y ) = pgcd( a , b ) }{ pgcd( m , x%y ) = pgcd( a , b ) }

Page 24: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2424

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

II , , C C => => FF

{ pgcd( x , y ) = pgcd( a , b ) }{ pgcd( x , y ) = pgcd( a , b ) } et et { y <> 0 }{ y <> 0 }

??????=>=>

{ pgcd( y , x % y ) = pgcd( a , b ) }{ pgcd( y , x % y ) = pgcd( a , b ) }

? ? ?? ? ?

Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y )Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y )

Nous devons renforcer l’invariant :Nous devons renforcer l’invariant :

{ pgcd( x , y ) = pgcd( a , b ) , x >= y }{ pgcd( x , y ) = pgcd( a , b ) , x >= y }

Page 25: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2525

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) } Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) }= { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 }= { pgcd( x , y ) = pgcd( a , b ) , y = 0 }

= { pgcd( x , y ) = pgcd( a , b ) , x >= y }= { pgcd( x , y ) = pgcd( a , b ) , x >= y }

Sans problème :Sans problème :

I , I , C => Q C => Q

Page 26: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2626

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) } Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) }= { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 }= { pgcd( x , y ) = pgcd( a , b ) , y = 0 }

Sans problème :Sans problème :

I , I , C => Q C => Q

F = { pgcd( y , x % y ) = pgcd( a , b ) }F = { pgcd( y , x % y ) = pgcd( a , b ) }

{ pgcd( x , y ) = pgcd( a , b ) , x >= y }{ pgcd( x , y ) = pgcd( a , b ) , x >= y }

{ . . . , m >= y }{ . . . , m >= y }

{ . . . , m >= x % y }{ . . . , m >= x % y }

= { pgcd( x , y ) = pgcd( a , b ) , x >= y }= { pgcd( x , y ) = pgcd( a , b ) , x >= y }

Page 27: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2727

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

II , , C C => => FF

{ pgcd( x , y ) = pgcd( a , b ) , x >= y }{ pgcd( x , y ) = pgcd( a , b ) , x >= y } et et { y <> 0 }{ y <> 0 }

!!!!!!!!!!!!=>=>

{ pgcd( y , x % y ) = pgcd( a , b ) }{ pgcd( y , x % y ) = pgcd( a , b ) }

Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y )Maths : x >= y et y <> 0 => pgcd( x , y ) = pgcd( y , x % y )

Page 28: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2828

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

x <- a ;x <- a ;y <- b ;y <- b ;

while ( y <> 0 ) dowhile ( y <> 0 ) do

m <- y ;m <- y ; y <- x % y ;y <- x % y ; x <- mx <- m

inv Iinv I

• POST :POST :

Q = { x = pgcd( a , b ) } Q = { x = pgcd( a , b ) } = { pgcd( x , 0 ) = pgcd( a , b ) }= { pgcd( x , 0 ) = pgcd( a , b ) } = { pgcd( x , y ) = pgcd( a , b ) , y = 0 }= { pgcd( x , y ) = pgcd( a , b ) , y = 0 }

Sans problème :Sans problème :

I , I , C => Q C => Q

F = { pgcd( y , x % y ) = pgcd( a , b ) }F = { pgcd( y , x % y ) = pgcd( a , b ) }

{ pgcd( x , y ) = pgcd( a , b ) , x >= y }{ pgcd( x , y ) = pgcd( a , b ) , x >= y }

{ . . . , m >= y }{ . . . , m >= y }

{ . . . , m >= x % y }{ . . . , m >= x % y }

Sans problème :Sans problème :

I , C => FI , C => F

I = { pgcd( x , y ) = pgcd( a , b ) , x >= y }I = { pgcd( x , y ) = pgcd( a , b ) , x >= y }

{ pgcd( a , b ) = pgcd( a , b ) , a >= b } = { a >= b }{ pgcd( a , b ) = pgcd( a , b ) , a >= b } = { a >= b }• PRE :PRE :

= { pgcd( x , y ) = pgcd( a , b ) , x >= y }= { pgcd( x , y ) = pgcd( a , b ) , x >= y }

Page 29: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 2929

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

U NU N

T R O I S I E M ET R O I S I E M E

E X E M P L EE X E M P L E

Page 30: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3030

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- 0 ;s <- 0 ;c <- 1 ;c <- 1 ;

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c ;s <- s + c ; c <- c + 1c <- c + 1

inv Iinv I

• POST :POST :

i = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

Sans problème :Sans problème :

I , I , C => Q C => Q

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

i = 1i = 1

c – 1c – 1

Page 31: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3131

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- 0 ;s <- 0 ;c <- 1 ;c <- 1 ;

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c ;s <- s + c ; c <- c + 1c <- c + 1

inv Iinv I

• POST :POST :

i = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

Sans problème :Sans problème :

I , I , C => Q C => Q

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

i = 1i = 1

c – 1c – 1

F = { c <= n , s = F = { c <= n , s = i } i }

I = . . .I = . . .

i = 1i = 1

c – 1c – 1

Après simplification !Après simplification !

Page 32: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3232

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- 0 ;s <- 0 ;c <- 1 ;c <- 1 ;

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c ;s <- s + c ; c <- c + 1c <- c + 1

inv Iinv I

• POST :POST :

i = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

Sans problème :Sans problème :

I , I , C => Q C => Q

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

i = 1i = 1

c – 1c – 1

F = { c <= n , s = F = { c <= n , s = i } i }

I = . . .I = . . .

i = 1i = 1

c – 1c – 1Sans problème :Sans problème :

I , C => FI , C => F

Page 33: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3333

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- 0 ;s <- 0 ;c <- 1 ;c <- 1 ;

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c ;s <- s + c ; c <- c + 1c <- c + 1

inv Iinv I

• POST :POST :

i = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

Sans problème :Sans problème :

I , I , C => Q C => Q

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

i = 1i = 1

c – 1c – 1

F = { c <= n , s = F = { c <= n , s = i } i }

I = . . .I = . . .

i = 1i = 1

c – 1c – 1Sans problème :Sans problème :

I , C => FI , C => F

i = 1i = 1

c – 1c – 1I = { c <= n + 1 , s = I = { c <= n + 1 , s = i } i }

i = 1i = 1

1 – 11 – 1{ 1 <= n + 1 , 0 = { 1 <= n + 1 , 0 = i } i } = { n >= 0 } = { n >= 0 }• PRE :PRE :

Page 34: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3434

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- s <- 11 ; ;c <- c <- 2 2 ;;

while ( c <= n ) dowhile ( c <= n ) do

. . .. . .

i = 1i = 1

c – 1c – 1I = { c <= n + 1 , s = I = { c <= n + 1 , s = i } i }

i = 1i = 1

22 – 1 – 1{ { 22 <= n + 1 , <= n + 1 , 1 1 = = i } i } = { n >= 1 } = { n >= 1 }• PRE :PRE :

• Une autre initialisation :Une autre initialisation :

• POST :POST :

Q = { s = Q = { s = i } i }i = 1i = 1

nn

Page 35: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3535

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- s <- 66 ; ;c <- c <- 2 2 ;;

while ( c <= n ) dowhile ( c <= n ) do

. . .. . .

i = 1i = 1

c – 1c – 1I = { c <= n + 1 , s = I = { c <= n + 1 , s = i } i }

i = 1i = 1

22 – 1 – 1{ { 22 <= n + 1 , <= n + 1 , 6 6 = = i } i } = { n >= 1 , = { n >= 1 , 6 = 1 6 = 1 } } = { FAUX } = { FAUX }• PRE :PRE :

• Une mauvaise initialisation :Une mauvaise initialisation :

• POST :POST :

Q = { s = Q = { s = i } i }i = 1i = 1

nn

Page 36: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3636

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- s <- 66 ; ;c <- c <- 2 2 ;;

while ( c <= n ) dowhile ( c <= n ) do

. . .. . .

i = 1i = 1

c – 1c – 1I = { c <= n + 1 , s = I = { c <= n + 1 , s = i } i }

i = 1i = 1

22 – 1 – 1{ { 22 <= n + 1 , <= n + 1 , 6 6 = = i } i } = { n >= 1 , = { n >= 1 , 6 = 1 6 = 1 } } = { n >= 1 }= { n >= 1 }• PRE :PRE :

• Une mauvaise initialisation :Une mauvaise initialisation :

• POST :POST :

Q = { s = Q = { s = i } i }i = 1i = 1

nn

Page 37: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3737

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

s <- s <- 66 ; ;c <- c <- 2 2 ;;

while ( c <= n ) dowhile ( c <= n ) do

. . .. . .

i = 1i = 1

c – 1c – 1I = { c <= n + 1 , s = I = { c <= n + 1 , s = i } i }

i = 1i = 1

22 – 1 – 1{ { 22 <= n + 1 , <= n + 1 , 6 6 = = i } i } = { n >= 1 , = { n >= 1 , 6 = 1 6 = 1 } } = { n >= 3 }= { n >= 3 }• PRE :PRE :

• Une mauvaise initialisation :Une mauvaise initialisation :

• POST :POST :

Q = { s = Q = { s = i } i }i = 1i = 1

nn

Page 38: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3838

• POST :POST :

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Un mauvais invariant :Un mauvais invariant :

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

. . .. . .

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c + 3 ;s <- s + c + 3 ; c <- c + 1c <- c + 1

inv Iinv Ii = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

i = 1i = 1

c – 1c – 1

Sans problème :Sans problème :

I , I , C => Q C => Q

Page 39: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 3939

• POST :POST :

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Un mauvais invariant :Un mauvais invariant :

Q = { s = Q = { s = i } i } = { s = = { s = i , c <= n + 1 , c > n } i , c <= n + 1 , c > n }i = 1i = 1

nn

. . .. . .

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c + 3 ;s <- s + c + 3 ; c <- c + 1c <- c + 1

inv Iinv Ii = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = i } i }

i = 1i = 1

c – 1c – 1

I = . . .I = . . .

F = { c <= n , s + 3 = F = { c <= n , s + 3 = i } i }i = 1i = 1

c – 1c – 1

Après simplification !Après simplification !

Sans problème :Sans problème :

I , I , C => Q C => Q

Page 40: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 4040

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

II , , C C => => FF

{ c <= n + 1 , s = { c <= n + 1 , s = i } i } et et { c <= n }{ c <= n }

NONNON=>=>

{ c <= n + 1 , s + 3 = { c <= n + 1 , s + 3 = i } i }i = 1i = 1

c – 1c – 1

i = 1i = 1

c – 1c – 1

////

Sinon, nous aurions 3 = 0 !Sinon, nous aurions 3 = 0 !

Page 41: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 4141

• POST :POST :

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Un mauvais invariant :Un mauvais invariant :

Q = { s = Q = { s = (i + 3) } (i + 3) } = { s = = { s = (i + 3) , c <= n + 1 , (i + 3) , c <= n + 1 , c > n }c > n }i = 1i = 1

nn

. . .. . .

while ( c <= n ) dowhile ( c <= n ) do

s <- s + c + 3 ;s <- s + c + 3 ; c <- c + 1c <- c + 1

inv Iinv Ii = 1i = 1

c – 1c – 1= { c <= n + 1 , s = = { c <= n + 1 , s = (i + 3) } (i + 3) }

i = 1i = 1

c – 1c – 1

Sans problème :Sans problème :

I , I , C => Q C => Q

I = . . .I = . . .

F = { c <= n , s = F = { c <= n , s = (i + 3) } (i + 3) }i = 1i = 1

c – 1c – 1

Après simplification !Après simplification !

Sans problème :Sans problème :

I , C => FI , C => F

Page 42: Cours d’Algorithmique

19 décembre 200619 décembre 2006 Cours d'algorithmique 10 / IntranetCours d'algorithmique 10 / Intranet 4242

Logique de HoareLogique de Hoare----------------------------------------------------------------------------------------------------------------------------------

• Attention :Attention :

• Tout ceci n’empêche pas un programme de boucler !Tout ceci n’empêche pas un programme de boucler !

• Nous affirmons seulement queNous affirmons seulement que

– si le programme s’arrête,si le programme s’arrête,

– alors il rend le résultat indiqué !alors il rend le résultat indiqué !