Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours dAlgorithmique Logique de Hoare (fin) : Les boucles et les invariants.
19 décembre 2006Cours d'algorithmique 10 / Intranet2 Trier et chercher, recherche textuelle Trier et chercher, recherche textuelle Listes et arbres Listes et arbres Le back-track Le back-track Arbres équilibrés Arbres équilibrés Récursivité et induction sur la structure Récursivité et induction sur la structure Divide and conquer, algorithmes gloutons Divide and conquer, algorithmes gloutons Minimax, alpha-beta Minimax, alpha-beta Dérécursion Dérécursion Divers problèmes particuliers Divers problèmes particuliers Logique de Hoare Logique de Hoare Programmation dynamique Programmation dynamique Complexité et calculabilité Complexité et calculabilité Les grandes lignes du cours
19 décembre 2006Cours d'algorithmique 10 / Intranet3 Logique de Hoare Rappel : Rappel : { PRE } programme { POST } { PRE } programme { POST } Ceci signifie que Ceci signifie que – si les pré-conditions sont vérifiées par les arguments, – alors les post-conditions seront vérifiées par les résultats.
19 décembre 2006Cours d'algorithmique 10 / Intranet4 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » !
19 décembre 2006Cours d'algorithmique 10 / Intranet5 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Q
19 décembre 2006Cours d'algorithmique 10 / Intranet6 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Calculons la plus faible condition F telle que { F } { Q } ! Calculons la plus faible condition F telle que { F } { Q } ! Q
19 décembre 2006Cours d'algorithmique 10 / Intranet7 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Calculons la plus faible condition F telle que { F } { Q } ! Calculons la plus faible condition F telle que { F } { Q } ! F Q
19 décembre 2006Cours d'algorithmique 10 / Intranet8 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Calculons la plus faible condition F telle que { F } { Q } ! Calculons la plus faible condition F telle que { F } { Q } ! Nous comparons avec le cahier des charges ! ! ! Nous comparons avec le cahier des charges ! ! ! F Q
19 décembre 2006Cours d'algorithmique 10 / Intranet9 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Calculons la plus faible condition F telle que { F } { Q } ! Calculons la plus faible condition F telle que { F } { Q } ! Nous comparons avec le cahier des charges ! ! ! Nous comparons avec le cahier des charges ! ! ! Cahier des charges F PRE Q = POST
19 décembre 2006Cours d'algorithmique 10 / Intranet10 Logique de Hoare La démarche complète : La démarche complète : – Soit la post-condition « Q » ! Soit le programme « » ! Calculons la plus faible condition F telle que { F } { Q } ! Calculons la plus faible condition F telle que { F } { Q } ! Nous comparons avec le cahier des charges ! ! ! Nous comparons avec le cahier des charges ! ! ! Et nous vérifions que PRE => F !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Et nous vérifions que PRE => F !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Cahier des charges Q = POST F PRE
19 décembre 2006Cours d'algorithmique 10 / Intranet11 Logique de Hoare Trois règles qui sont toujours vraies : Trois règles qui sont toujours vraies : PRE-STRENGTH : PRE-STRENGTH : POST-WEAK : POST-WEAK : CONJUNCTION : CONJUNCTION : P => Q { Q } { R } { P } { R } Q => R { P } { Q } { P } { R } { P } { Q } 1 1 { P } { Q } 2 2 { P, P } { Q, Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet12 Logique de Hoare Les programmes : Les programmes : – skip – x < - e – – – if C then else – if C then else – while C do – while C do
19 décembre 2006Cours d'algorithmique 10 / Intranet13 Logique de Hoare Règle pour le programme skip : Règle pour le programme skip : { P } skip { P }
19 décembre 2006Cours d'algorithmique 10 / Intranet14 Logique de Hoare Règle pour le programme ; : Règle pour le programme ; : { P } { Q } { Q } { R } 12 { P } ; { R }
19 décembre 2006Cours d'algorithmique 10 / Intranet15 Logique de Hoare Règle pour le programme x < - e : Règle pour le programme x < - e : { P[ x < - e ] } x < - e { P }
19 décembre 2006Cours d'algorithmique 10 / Intranet16 Logique de Hoare Règles pour le programme if C then else : Règles pour le programme if C then else : { P, C } { Q } { P } if C then else { Q } { P, C } { Q } 1
19 décembre 2006Cours d'algorithmique 10 / Intranet17 Logique de Hoare Règles pour le programme if C then else : Règles pour le programme if C then else : { P, C } { Q } { P } if C then else { Q } { P, C } { Q } 1 { F } { Q } 1 1 { F, C } ou { F, C } if C then else { Q } 1 2 { F } { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet18 Logique de Hoare Toutes ces règles sont complètement automatisables ! Toutes ces règles sont complètement automatisables !
19 décembre 2006Cours d'algorithmique 10 / Intranet19 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 2006Cours d'algorithmique 10 / Intranet20 Logique de Hoare Lexemple qui nous sert à illustrer la notion dinvariant : Lexemple qui nous sert à illustrer la notion dinvariant : – PRE : V, D N – POST: Q, R N telles V = Q * D + R et R < D. Cest la spécification de la division euclidienne ! Cest la spécification de la division euclidienne ! I I
19 décembre 2006Cours d'algorithmique 10 / Intranet21 Logique de Hoare Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D
19 décembre 2006Cours d'algorithmique 10 / Intranet22 Logique de Hoare Exemple : V = 17, D = 5 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D
19 décembre 2006Cours d'algorithmique 10 / Intranet23 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D
19 décembre 2006Cours d'algorithmique 10 / Intranet24 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17
19 décembre 2006Cours d'algorithmique 10 / Intranet25 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17
19 décembre 2006Cours d'algorithmique 10 / Intranet26 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17
19 décembre 2006Cours d'algorithmique 10 / Intranet27 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12
19 décembre 2006Cours d'algorithmique 10 / Intranet28 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12
19 décembre 2006Cours d'algorithmique 10 / Intranet29 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 V = 17, D = 5, Q = 2, R = 12
19 décembre 2006Cours d'algorithmique 10 / Intranet30 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet31 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet32 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet33 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet34 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet35 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet36 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet37 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet38 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet39 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7
19 décembre 2006Cours d'algorithmique 10 / Intranet40 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet41 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet42 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet43 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet44 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 V = 17, D = 5, Q = 1, R = 12 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 12 V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet45 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet46 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2
19 décembre 2006Cours d'algorithmique 10 / Intranet47 Logique de Hoare Exemple : V = 17, D = 5 V = 17, D = 5, Q = 0 Q <- 0 ; R <- V ; while R >= D Q <- Q + 1 ; Q <- Q + 1 ; R <- R - D R <- R - D V = 17, D = 5, Q = 0, R = 17 Y a-t-il quelque-chose de commun entre les différentes itérations ? OUI : V = Q * D + R V = 17, D = 5, Q = 2, R = 7 V = 17, D = 5, Q = 3, R = 7 V = 17, D = 5, Q = 3, R = 2 A la fin : V = Q * D + R et R < D
19 décembre 2006Cours d'algorithmique 10 / Intranet48 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée.
19 décembre 2006Cours d'algorithmique 10 / Intranet49 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée. Cest ce quon appelle un « invariant » ! Cest ce quon appelle un « invariant » !
19 décembre 2006Cours d'algorithmique 10 / Intranet50 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée. Cest ce quon appelle un « invariant » ! Cest ce quon appelle un « invariant » ! Un invariant est un prédicat qui : Un invariant est un prédicat qui :
19 décembre 2006Cours d'algorithmique 10 / Intranet51 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée. Cest ce quon appelle un « invariant » ! Cest ce quon appelle un « invariant » ! Un invariant est un prédicat qui : Un invariant est un prédicat qui : – est vrai à chaque début de boucle,
19 décembre 2006Cours d'algorithmique 10 / Intranet52 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée. Cest ce quon appelle un « invariant » ! Cest ce quon appelle un « invariant » ! Un invariant est un prédicat qui : Un invariant est un prédicat qui : – est vrai à chaque début de boucle, – et à chaque fin de boucle,
19 décembre 2006Cours d'algorithmique 10 / Intranet53 Logique de Hoare Les valeurs de V, D, Q, R peuvent changer. Les valeurs de V, D, Q, R peuvent changer. Mais la relation V = Q * D + R reste toujours vérifiée. Mais la relation V = Q * D + R reste toujours vérifiée. Cest ce quon appelle un « invariant » ! Cest ce quon appelle un « invariant » ! Un invariant est un prédicat qui : Un invariant est un prédicat qui : – est vrai à chaque début de boucle, – et à chaque fin de boucle, – cest-à-dire début de la boucle suivante. (Les tests ne font pas daffectation !) (Les tests ne font pas daffectation !)
19 décembre 2006Cours d'algorithmique 10 / Intranet54 Logique de Hoare Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Pour écrire un corps de boucle, il faut connaître linvariant de la boucle !
19 décembre 2006Cours d'algorithmique 10 / Intranet55 Logique de Hoare Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». e
19 décembre 2006Cours d'algorithmique 10 / Intranet56 Logique de Hoare Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». Pour savoir ce que vous devez faire au « i » tour de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. Pour savoir ce que vous devez faire au « i » tour de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. e e
19 décembre 2006Cours d'algorithmique 10 / Intranet57 Logique de Hoare Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Pour écrire un corps de boucle, il faut connaître linvariant de la boucle ! Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». Votre code sera exécuté par le « i » tour de boucle, quel que soit la valeur de « i ». Pour savoir ce que vous devez faire au « i » tour de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. Pour savoir ce que vous devez faire au « i » tour de boucle, vous devez vous souvenir de ce que vous avez fait pendant les « i – 1 » premiers tours. Ceci revient à connaître « linvariant » ! Ceci revient à connaître « linvariant » ! e e
19 décembre 2006Cours d'algorithmique 10 / Intranet58 Logique de Hoare Quel est linvariant ? Quel est linvariant ? s <- 0 ; i <- 1 ; while ( i <= n ) do s <- s + i ; s <- s + i ; i <- i + 1 i <- i + 1
19 décembre 2006Cours d'algorithmique 10 / Intranet59 Logique de Hoare Quel est linvariant ? Quel est linvariant ? 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 ». s <- 0 ; i <- 1 ; while ( i <= n ) do s <- s + i ; s <- s + i ; i <- i + 1 i <- i + 1 e
19 décembre 2006Cours d'algorithmique 10 / Intranet60 Logique de Hoare Quel est linvariant ? Quel est linvariant ? 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 ». s <- 0 ; i <- 1 ; while ( i <= n ) do s <- s + i ; s <- s + i ; i <- i + 1 i <- i + 1 e
19 décembre 2006Cours d'algorithmique 10 / Intranet61 Logique de Hoare Quel est linvariant ? Quel est linvariant ? 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 : s = j Invariant : s = j s <- 0 ; i <- 1 ; while ( i <= n ) do s <- s + i ; s <- s + i ; i <- i + 1 i <- i + 1 e j = 1 i – 1
19 décembre 2006Cours d'algorithmique 10 / Intranet62 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do :
19 décembre 2006Cours d'algorithmique 10 / Intranet63 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do : { I } while C do { I, C } { I, C } { I }
19 décembre 2006Cours d'algorithmique 10 / Intranet64 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do : Nous dirons que « I » est linvariant ! Nous dirons que « I » est linvariant ! { I } while C do { I, C } { I, C } { I }
19 décembre 2006Cours d'algorithmique 10 / Intranet65 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do : Nous dirons que « I » est linvariant ! Nous dirons que « I » est linvariant ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! { I } while C do { I, C } { I, C } { I }
19 décembre 2006Cours d'algorithmique 10 / Intranet66 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do : Nous dirons que « I » est linvariant ! Nous dirons que « I » est linvariant ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! La post-condition { I, C } est évidente ! La post-condition { I, C } est évidente ! { I } while C do { I, C } { I, C } { I }
19 décembre 2006Cours d'algorithmique 10 / Intranet67 Logique de Hoare Règle pour le programme while C do : Règle pour le programme while C do : Nous dirons que « I » est linvariant ! Nous dirons que « I » est linvariant ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! La condition { I, C } { I } vérifie que « I » est bien invariant ! ! ! La post-condition { I, C } est évidente ! La post-condition { I, C } est évidente ! Il suffit alors que { I } soit vrai au début ! Il suffit alors que { I } soit vrai au début ! { I } while C do { I, C } { I, C } { I }
19 décembre 2006Cours d'algorithmique 10 / Intranet68 Logique de Hoare Dans la pratique, nous avons une post-condition Q et le code while C do : Dans la pratique, nous avons une post-condition Q et le code while C do : { ??? } while C do { Q } { ???, C } { ??? }
19 décembre 2006Cours d'algorithmique 10 / Intranet69 Logique de Hoare Dans la pratique, nous avons une post-condition Q et le code while C do : Dans la pratique, nous avons une post-condition Q et le code while C do : Quel prédicat « I » faut-il choisir comme invariant ? Quel prédicat « I » faut-il choisir comme invariant ? { ??? } while C do { Q } { ???, C } { ??? }
19 décembre 2006Cours d'algorithmique 10 / Intranet70 Logique de Hoare Dans la pratique, nous avons une post-condition Q et le code while C do : Dans la pratique, nous avons une post-condition Q et le code while C do : Quel prédicat « I » faut-il choisir comme invariant ? Quel prédicat « I » faut-il choisir comme invariant ? Cest lutilisateur qui doit faire une proposition ! Cest lutilisateur qui doit faire une proposition ! { ??? } while C do { Q } { ???, C } { ??? }
19 décembre 2006Cours d'algorithmique 10 / Intranet71 Logique de Hoare Dans la pratique, nous avons une post-condition Q et le code while C do : Dans la pratique, nous avons une post-condition Q et le code while C do : Quel prédicat « I » faut-il choisir comme invariant ? Quel prédicat « I » faut-il choisir comme invariant ? Cest lutilisateur qui doit faire une proposition ! Cest lutilisateur qui doit faire une proposition ! Nouvelle syntaxe : while C do inv I Nouvelle syntaxe : while C do inv I { ??? } while C do { Q } { ???, C } { ??? }
19 décembre 2006Cours d'algorithmique 10 / Intranet72 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : {... } while C do inv I { Q }...
19 décembre 2006Cours d'algorithmique 10 / Intranet73 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : Nous devons prouver que I, C => Q ! Nous devons prouver que I, C => Q !... I, C => Q {... } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet74 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : Nous devons prouver que I, C => Q ! Nous devons prouver que I, C => Q ! Nous calculons la pré-condition « F » de { F } { I } ! Nous calculons la pré-condition « F » de { F } { I } ! { F } { I }... I, C => Q {... } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet75 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : Nous devons prouver que I, C => Q ! Nous devons prouver que I, C => Q ! Nous calculons la pré-condition « F » de { F } { I } ! Nous calculons la pré-condition « F » de { F } { I } ! Nous prouvons que I, C => F ! Nous prouvons que I, C => F ! { F } { I } I, C => F I, C => Q {... } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet76 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : Nous devons prouver que I, C => Q ! Nous devons prouver que I, C => Q ! Nous calculons la pré-condition « F » de { F } { I } ! Nous calculons la pré-condition « F » de { F } { 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 } { I } I, C => F I, C => Q { I } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet77 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do inv I : Attention, il y a deux obligations de preuve ! Attention, il y a deux obligations de preuve ! { F } { I } I, C => F I, C => Q { I } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet78 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do 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. { F } { I } I, C => F I, C => Q { I } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet79 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do 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 ! { F } { I } I, C => F I, C => Q { I } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet80 Logique de Hoare Règle pour le programme while C do inv I : Règle pour le programme while C do 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 nexiste pas ! ! ! Un prouveur ne saura jamais dire si elle nexiste pas ! ! ! { F } { I } I, C => F I, C => Q { I } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet81 Logique de Hoare U N P R E M I E R E X E M P L E
19 décembre 2006Cours d'algorithmique 10 / Intranet82 Logique de Hoare R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I
19 décembre 2006Cours d'algorithmique 10 / Intranet83 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I Q = { V = D * Q + R, 0 <= R < D }
19 décembre 2006Cours d'algorithmique 10 / Intranet84 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 }
19 décembre 2006Cours d'algorithmique 10 / Intranet85 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } C C C
19 décembre 2006Cours d'algorithmique 10 / Intranet86 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 }
19 décembre 2006Cours d'algorithmique 10 / Intranet87 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet88 Logique de Hoare I, C => Q { I ?? } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet89 Logique de Hoare { F } { I }... I, C => Q { I ?? } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet90 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F ? ? ?
19 décembre 2006Cours d'algorithmique 10 / Intranet91 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F ? ? ? { V = D * Q + R, 0 <= R }
19 décembre 2006Cours d'algorithmique 10 / Intranet92 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F ? ? ? { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D }
19 décembre 2006Cours d'algorithmique 10 / Intranet93 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * ( Q + 1 ) + R – D, 0 <= R – D } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D }
19 décembre 2006Cours d'algorithmique 10 / Intranet94 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } Après simplification !
19 décembre 2006Cours d'algorithmique 10 / Intranet95 Logique de Hoare { F } { I }... I, C => Q { I ?? } while C do inv I { Q }
19 décembre 2006Cours d'algorithmique 10 / Intranet96 Logique de Hoare { F } { I } I, C => Q { I ?? } while C do inv I { Q } I, C => F
19 décembre 2006Cours d'algorithmique 10 / Intranet97 Logique de Hoare { F } { I } I, C => Q { I ?? } while C do inv I { Q } I, C => F { V = D * Q + R, 0 = D }
19 décembre 2006Cours d'algorithmique 10 / Intranet98 Logique de Hoare { F } { I } I, C => Q { I ?? } while C do inv I { Q } I, C => F { V = D * Q + R, 0 = D } ???=> { V = D * Q + R, D <= R }
19 décembre 2006Cours d'algorithmique 10 / Intranet99 Logique de Hoare { F } { I } I, C => Q { I ?? } while C do inv I { Q } I, C => F { V = D * Q + R, 0 = D } ???=> { V = D * Q + R, D <= R }
19 décembre 2006Cours d'algorithmique 10 / Intranet100 Logique de Hoare { F } { I } I, C => Q { I } while C do inv I { Q } I, C => F { V = D * Q + R, 0 = D } !!!!!!=> { V = D * Q + R, D <= R }
19 décembre 2006Cours d'algorithmique 10 / Intranet101 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } I = { V = D * Q + R, 0 <= R } Sans problème : I, C => F
19 décembre 2006Cours d'algorithmique 10 / Intranet102 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } I = { V = D * Q + R, 0 <= R } Sans problème : I, C => F { V = D * 0 + R, 0 <= R }
19 décembre 2006Cours d'algorithmique 10 / Intranet103 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } I = { V = D * Q + R, 0 <= R } Sans problème : I, C => F { V = D * 0 + R, 0 <= R } { V = D * 0 + V, 0 <= V } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet104 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } I = { V = D * Q + R, 0 <= R } Sans problème : I, C => F { V = D * 0 + R, 0 <= R } { V = D * 0 + V, 0 = 0 } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet105 Logique de Hoare POST : POST : R <- V ; Q <- 0 ; while ( R >= D ) do Q <- Q + 1 ; Q <- Q + 1 ; R <- R – D R <- R – D inv I inv I 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 } Sans problème : I, C => Q F = { V = D * Q + R, D <= R } { V = D * Q + R, 0 <= R } { V = D * Q + R – D, 0 <= R – D } I = { V = D * Q + R, 0 <= R } Sans problème : I, C => F { V = D * 0 + R, 0 <= R } { V = D * 0 + V, 0 = 0 } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet106 Logique de Hoare U N D E U X I E M E E X E M P L E
19 décembre 2006Cours d'algorithmique 10 / Intranet107 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I
19 décembre 2006Cours d'algorithmique 10 / Intranet108 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet109 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = pgcd( a, b ) } = { pgcd( x, 0 ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet110 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 }
19 décembre 2006Cours d'algorithmique 10 / Intranet111 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 } C C C
19 décembre 2006Cours d'algorithmique 10 / Intranet112 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet113 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet114 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q F ? ? ?
19 décembre 2006Cours d'algorithmique 10 / Intranet115 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q F ? ? ? { pgcd( x, y ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet116 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q F ? ? ? { pgcd( x, y ) = pgcd( a, b ) } { pgcd( m, y ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet117 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q F ? ? ? { pgcd( x, y ) = pgcd( a, b ) } { pgcd( m, y ) = pgcd( a, b ) } { pgcd( m, x%y ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet118 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 ) } Sans problème : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ) } { pgcd( m, y ) = pgcd( a, b ) } { pgcd( m, x%y ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet119 Logique de Hoare I, C => F
19 décembre 2006Cours d'algorithmique 10 / Intranet120 Logique de Hoare I, C => F { pgcd( x, y ) = pgcd( a, b ) } et { y <> 0 } ???=> { pgcd( y, x % y ) = pgcd( a, b ) }
19 décembre 2006Cours d'algorithmique 10 / Intranet121 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 )
19 décembre 2006Cours d'algorithmique 10 / Intranet122 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 )
19 décembre 2006Cours d'algorithmique 10 / Intranet123 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 )
19 décembre 2006Cours d'algorithmique 10 / Intranet124 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 linvariant : { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet125 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 } Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet126 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q { pgcd( x, y ) = pgcd( a, b ), x >= y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet127 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet128 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet129 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ), y >= x % y } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet130 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ), y >= x % y } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } OK ! = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet131 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet132 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 2006Cours d'algorithmique 10 / Intranet133 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 2006Cours d'algorithmique 10 / Intranet134 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } Sans problème : I, C => F I = { pgcd( x, y ) = pgcd( a, b ), x >= y } = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet135 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } Sans problème : I, C => F I = { pgcd( x, y ) = pgcd( a, b ), x >= y } { pgcd( a, b ) = pgcd( a, b ), a >= b } PRE : PRE : = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet136 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } Sans problème : I, C => F I = { pgcd( x, y ) = pgcd( a, b ), x >= y } { pgcd( a, b ) = pgcd( a, b ), a >= b } = { a >= b } PRE : PRE : = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet137 Logique de Hoare x <- a ; y <- b ; while ( y <> 0 ) do m <- y ; m <- y ; y <- x % y ; y <- x % y ; x <- m x <- m inv I inv I POST : POST : Q = { x = 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 : I, C => Q F = { pgcd( y, x % y ) = pgcd( a, b ) } { pgcd( x, y ) = pgcd( a, b ), x >= y } {..., m >= y } {..., m >= x % y } Sans problème : I, C => F I = { pgcd( x, y ) = pgcd( a, b ), x >= y } { pgcd( a, b ) = pgcd( a, b ), a >= b } = { a >= b } PRE : PRE : = { pgcd( x, y ) = pgcd( a, b ), x >= y }
19 décembre 2006Cours d'algorithmique 10 / Intranet138 Logique de Hoare U N T R O I S I E M E E X E M P L E
19 décembre 2006Cours d'algorithmique 10 / Intranet139 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I
19 décembre 2006Cours d'algorithmique 10 / Intranet140 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet141 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : Q = { s = i } = { s = i, c = n + 1 } i = 1 n c – 1
19 décembre 2006Cours d'algorithmique 10 / Intranet142 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : Q = { s = i } = { s = i, c n } i = 1 n c – 1
19 décembre 2006Cours d'algorithmique 10 / Intranet143 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : Q = { s = i } = { s = i, c n } i = 1 n c – 1 C C C
19 décembre 2006Cours d'algorithmique 10 / Intranet144 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1
19 décembre 2006Cours d'algorithmique 10 / Intranet145 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c + 1 <= n + 1, s + c = i } I =... i = 1 c + 1– 1
19 décembre 2006Cours d'algorithmique 10 / Intranet146 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s + c = i } I =... i = 1 c Après simplification !
19 décembre 2006Cours d'algorithmique 10 / Intranet147 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Après simplification !
19 décembre 2006Cours d'algorithmique 10 / Intranet148 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Sans problème : I, C => F
19 décembre 2006Cours d'algorithmique 10 / Intranet149 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Sans problème : I, C => F i = 1 c – 1 I = { c <= n + 1, s = i }
19 décembre 2006Cours d'algorithmique 10 / Intranet150 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Sans problème : I, C => F i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 1 – 1 { 1 <= n + 1, 0 = i } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet151 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Sans problème : I, C => F i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 1 – 1 { 1 = 0 } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet152 Logique de Hoare s <- 0 ; c <- 1 ; while ( c <= n ) do s <- s + c ; s <- s + c ; c <- c + 1 c <- c + 1 inv I inv I POST : POST : i = 1 c – 1 = { c <= n + 1, s = i } Sans problème : I, C => Q Q = { s = i } = { s = i, c n } i = 1 n c – 1 F = { c <= n, s = i } I =... i = 1 c – 1 Sans problème : I, C => F i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 1 – 1 { 1 = 0 } PRE : PRE :
19 décembre 2006Cours d'algorithmique 10 / Intranet153 Logique de Hoare Une autre initialisation : Une autre initialisation :
19 décembre 2006Cours d'algorithmique 10 / Intranet154 POST : POST : Logique de Hoare s <- 1 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } Une autre initialisation : Une autre initialisation : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet155 Logique de Hoare s <- 1 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 <= n + 1, 1 = i } PRE : PRE : Une autre initialisation : Une autre initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet156 Logique de Hoare s <- 1 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1 } PRE : PRE : Une autre initialisation : Une autre initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet157 Logique de Hoare s <- 1 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1 } PRE : PRE : Une autre initialisation : Une autre initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet158 Logique de Hoare Une mauvaise initialisation : Une mauvaise initialisation :
19 décembre 2006Cours d'algorithmique 10 / Intranet159 POST : POST : Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } Une mauvaise initialisation : Une mauvaise initialisation : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet160 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 <= n + 1, 6 = i } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet161 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet162 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { FAUX } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet163 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { FAUX } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet164 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { FAUX } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet165 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { n >= 1 } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet166 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { n >= 1 } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet167 Logique de Hoare s <- 6 ; c <- 2 ; while ( c <= n ) do i = 1 c – 1 I = { c <= n + 1, s = i } i = 1 2 – 1 { 2 = 1, 6 = 1 } = { n >= 3 } PRE : PRE : Une mauvaise initialisation : Une mauvaise initialisation : POST : POST : Q = { s = i } i = 1 n
19 décembre 2006Cours d'algorithmique 10 / Intranet168 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = i } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1
19 décembre 2006Cours d'algorithmique 10 / Intranet169 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = i } = { s = i, c n } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1 inv I inv I i = 1 c – 1 = { c <= n + 1, s = i } i = 1 c – 1 Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet170 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = i } = { s = i, c n } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1 inv I inv I i = 1 c – 1 = { c <= n + 1, s = i } i = 1 c – 1 I =... F = { c + 1 <= n + 1, s + c + 3 = i } i = 1 c + 1– 1 Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet171 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = i } = { s = i, c n } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1 inv I inv I i = 1 c – 1 = { c <= n + 1, s = i } i = 1 c – 1 I =... F = { c <= n, s + 3 = i } i = 1 c – 1 Après simplification ! Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet172 Logique de Hoare I, C => F { c <= n + 1, s = i } et { c <= n } ???????=> { c <= n + 1, s + 3 = i } i = 1 c – 1 i = 1 c – 1
19 décembre 2006Cours d'algorithmique 10 / Intranet173 Logique de Hoare I, C => F { c <= n + 1, s = i } et { c <= n } NON=> { c <= n + 1, s + 3 = i } i = 1 c – 1 i = 1 c – 1 // Sinon, nous aurions 3 = 0 !
19 décembre 2006Cours d'algorithmique 10 / Intranet174 Logique de Hoare I, C => F { c <= n + 1, s = i } et { c <= n } NON=> { c <= n + 1, s + 3 = i + 3 } i = 1 c – 1 i = 1 c – 1 //
19 décembre 2006Cours d'algorithmique 10 / Intranet175 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = (i + 3) } = { s = (i + 3), c <= n + 1, c > n } c > n } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1 inv I inv I i = 1 c – 1 = { c <= n + 1, s = (i + 3) } i = 1 c – 1 Sans problème : I, C => Q
19 décembre 2006Cours d'algorithmique 10 / Intranet176 POST : POST : Logique de Hoare Un mauvais invariant : Un mauvais invariant : Q = { s = (i + 3) } = { s = (i + 3), c <= n + 1, c > n } c > n } i = 1 n... while ( c <= n ) do s <- s + c + 3 ; s <- s + c + 3 ; c <- c + 1 c <- c + 1 inv I inv I i = 1 c – 1 = { c <= n + 1, s = (i + 3) } i = 1 c – 1 Sans problème : I, C => Q I =... F = { c <= n, s = (i + 3) } i = 1 c – 1 Après simplification ! Sans problème : I, C => F
19 décembre 2006Cours d'algorithmique 10 / Intranet177 Logique de Hoare Attention : Attention : Tout ceci nempêche pas un programme de boucler ! Tout ceci nempêche pas un programme de boucler !
19 décembre 2006Cours d'algorithmique 10 / Intranet178 Logique de Hoare Attention : Attention : Tout ceci nempêche pas un programme de boucler ! Tout ceci nempêche pas un programme de boucler ! Nous affirmons seulement que Nous affirmons seulement que – si le programme sarrête, – alors il rend le résultat indiqué !
19 décembre 2006Cours d'algorithmique 10 / Intranet179 Synthèse Logique de Hoare (fin) : Les boucles et les invariants.
19 décembre 2006Cours d'algorithmique 10 / Intranet180 m E r C i e T b O n N e J o U r N é E ! ! ! n O u B l I e Z p A s D e p R é P a R e R v O s T D ! ! !