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

Slides:



Advertisements
Présentations similaires
Présentation générale Marc Gengler
Advertisements

Introduction à l’Algorithmique
Calculs de complexité d'algorithmes
Les Structures de contrôles itératives
Cours d’Algorithmique
Cours d’Algorithmique
Cours d’Algorithmique
Cours d’Algorithmique
Cours d'algorithmique 9 - Intranet 1 12 décembre 2006 Cours dAlgorithmique Logique de Hoare (début) : Principes et constructions élémentaires.
Cours d’Algorithmique
Problème des 4 couleurs, graphes planaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
18 octobre 2007Cours de compilation 7 - Intranet1 Cours de compilation Génération de code Optimisation de code.
Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut.
Cours d’Algorithmique
Cours d’Algorithmique
Cours d'algorithmique 9 - Intranet 1 12 décembre 2006 Cours dAlgorithmique Logique de Hoare (début) : Principes et constructions élémentaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 4 - Intranet 1 16 novembre 2006 Cours dAlgorithmique Lalgorithme alpha-beta. Sous-arbres alpha et beta dun arbre minimax et propriétés.
Cours d’Algorithmique
Cours d'algorithmique 11 / Intranet 1 9 janvier 2006 Cours dAlgorithmique N P - complétude.
Cours d'algorithmique 5 - Intranet 1 17/21 novembre 2006 Cours dAlgorithmique Divide and Conquer : principes et applications. Calculabilité.Complexité.
18 octobre 2007Cours de compilation 7 - Intranet1 Cours de compilation Génération de code Optimisation de code.
21 septembre 2007Cours de compilation 2 - Intranet1 Cours de compilation Evaluation partielle etcompilation.
Analyse syntaxique (intro)
Cours d'algorithmique 8 - Intranet 1 4 décembre 2006 Cours dAlgorithmique Dérécursion (fin) : Équivalences entre programmes récursifs et programmes itératifs.
24 septembre 2007Cours de compilation 4 - Intranet1 Cours de compilation Techniques danalyse descendantes.
Cours d’Algorithmique
Cours d'algorithmique 5 - Intranet 1 17/21 novembre 2006 Cours dAlgorithmique Divide and Conquer : principes et applications. Calculabilité.Complexité.
Version du 22 juin Un outil danalyse statique (synthèse de propriétés) de preuve de propriétés de logiciels écrits en langage C ANSI, utilisé dans.
Cours d’Algorithmique
Cours d'algorithmique 2 - Intranet 1 8 novembre 2006 Cours dAlgorithmique Listes, piles et files. Arbres. Types de données abstraits. Implantations.
Cours d’Algorithmique
Points importants de la semaine Les commentaires. Les variables. Les instructions conditionnelles. Les instructions itératives (les boucles).
Calcul et programmation au lycée avec Scilab
Récursivité.
Enseignement de spécialité en S
Cours d’Algorithmique
Les dates Recherche d’un algorithme pour déterminer si une année est bissextile ou non.
Les algorithmes: complexité et notation asymptotique
Sémantique axiomatique
Problème des 4 couleurs, graphes planaires.
Quelques applications.
Quelques graphes particuliers.
Cours de graphes Les arbres et arborescences.
16 mars 2007Cours de graphes 7 - Intranet1 Cours de graphes Problèmes NP-complets. Réductions polynômiales.
Bases de la programmation en C++ 1 Les enchaînementsdinstruction Séquentiels. Exécutions dinstructions les unes à la suite des autres. Instructions séparées.
Points importants de la semaine Les constantes. Les boucles. Les opérateurs relationnels Les opérateurs logiques.
P. Van Roy, LINF LINF1251: Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
1 CSI3525: Concepts des Languages de Programmation Notes # 4: Description Semantique des Languages.
CSI3525: Concepts des Languages de Programmation
STRUCTURES DE DONNÉES Maxime CROCHEMORE
Partie II Sémantique.
Cours de graphes Marc Gengler Alexandra Bac Sébastien Fournier
21 février 2006Cours de graphes 2 - Intranet1 Cours de graphes Les plus courts chemins, les chemins les plus légers : à laide de la vague, à laide de la.
Cours de graphes 6 - Intranet
23 février 2007Cours de graphes 4 - Intranet1 Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut. Algos de Ford-Fulkerson et Edmonds-Karp.
Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par.
Structures alternative et répétitive
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
Paradigmes des Langages de Programmation
Algorithmique Les structures Rappel L'enchaînement séquentiel
O-notation 1. Introduction 2. O-notation 3. Opérations 3.1 Somme 3.2 Produit 4. Règles générales 5. Exemple 6.Analyse des algorithmes récursifs 6.1 Dilatation.
INTRODUCTION.
1 Algorithmique et programmation en Itérations (boucles) Types numériques simples (suite)
Algorithmique et programmation en
Algorithmes de tri et de recherche
Programmation procédurale preuves D. Preuves Preuves sur les R-algorithmes. Règle de l'appel (Hoare). Exemple Preuves sur les B-algorithmes (Floyd) Automatisation.
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours d’Algorithmique Logique de Hoare (fin) : Les boucles et les invariants.
Relation Bezout: au+bv= ab Calcul de u et v
Transcription de la présentation:

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 ! ! !