Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parFleurette Hebert Modifié depuis plus de 11 années
1
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours dAlgorithmique Logique de Hoare (fin) : Les boucles et les invariants.
2
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
3
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.
4
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 « » !
5
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
6
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
7
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
8
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
9
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
10
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
11
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 } 1 1 2 2
12
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 2 1 1 2
13
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 }
14
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 } 12 1 2
15
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 }
16
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 } 21 1 2 2 { P, C } { Q } 1
17
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 } 21 1 2 2 { P, C } { Q } 1 { F } { Q } 1 1 { F, C } ou { F, C } if C then else { Q } 1 2 { F } { Q } 2 2 21
18
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
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
20
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
21
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
22
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
23
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
24
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
25
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
26
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
27
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
28
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
29
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
30
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
31
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
32
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
33
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
34
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
35
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
36
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
37
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
38
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
39
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
40
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
41
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
42
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
43
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
44
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
45
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
46
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
47
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
48
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.
49
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 » !
50
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 :
51
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,
52
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,
53
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 !)
54
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 !
55
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
56
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
57
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
58
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
59
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
60
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
61
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
62
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 :
63
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 }
64
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 }
65
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 }
66
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 }
67
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 }
68
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 } { ??? }
69
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 } { ??? }
70
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 } { ??? }
71
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 } { ??? }
72
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 }...
73
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 }
74
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 }
75
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 }
76
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 }
77
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 }
78
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 }
79
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 }
80
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 }
81
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
82
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
83
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 }
84
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 }
85
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
86
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 }
87
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
88
19 décembre 2006Cours d'algorithmique 10 / Intranet88 Logique de Hoare -----------------------------------------------------------------... I, C => Q { I ?? } while C do inv I { Q }
89
19 décembre 2006Cours d'algorithmique 10 / Intranet89 Logique de Hoare ----------------------------------------------------------------- { F } { I }... I, C => Q { I ?? } while C do inv I { Q }
90
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 ? ? ?
91
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 }
92
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 }
93
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 }
94
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 !
95
19 décembre 2006Cours d'algorithmique 10 / Intranet95 Logique de Hoare ----------------------------------------------------------------- { F } { I }... I, C => Q { I ?? } while C do inv I { Q }
96
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
97
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 }
98
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 }
99
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 }
100
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 }
101
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
102
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 }
103
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 :
104
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 :
105
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 :
106
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
107
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
108
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 ) }
109
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 ) }
110
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 }
111
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
112
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 ) }
113
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
114
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 ? ? ?
115
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 ) }
116
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 ) }
117
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 ) }
118
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 ) }
119
19 décembre 2006Cours d'algorithmique 10 / Intranet119 Logique de Hoare ----------------------------------------------------------------- I, C => F
120
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 ) }
121
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 )
122
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 )
123
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 )
124
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 }
125
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
126
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 }
127
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 }
128
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 }
129
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 }
130
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 }
131
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 }
132
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 )
133
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 )
134
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 }
135
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 }
136
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 }
137
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 }
138
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
139
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
140
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
141
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
142
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
143
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
144
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
145
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
146
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 !
147
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 !
148
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
149
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 }
150
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 :
151
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 :
152
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 :
153
19 décembre 2006Cours d'algorithmique 10 / Intranet153 Logique de Hoare ----------------------------------------------------------------- Une autre initialisation : Une autre initialisation :
154
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
155
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
156
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
157
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
158
19 décembre 2006Cours d'algorithmique 10 / Intranet158 Logique de Hoare ----------------------------------------------------------------- Une mauvaise initialisation : Une mauvaise initialisation :
159
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
160
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
161
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
162
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
163
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
164
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
165
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
166
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
167
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
168
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
169
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
170
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
171
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
172
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
173
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 !
174
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 //
175
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
176
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
177
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 !
178
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é !
179
19 décembre 2006Cours d'algorithmique 10 / Intranet179 Synthèse ----------------------------------------------------------------- Logique de Hoare (fin) : Les boucles et les invariants.
180
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 ! ! !
Présentations similaires
© 2025 SlidePlayer.fr Inc.
All rights reserved.