• Aucun résultat trouvé

4mai2017 JudicaëlCourant Preuvedeprogrammes

N/A
N/A
Protected

Academic year: 2022

Partager "4mai2017 JudicaëlCourant Preuvedeprogrammes"

Copied!
98
0
0

Texte intégral

(1)

Introduction Logique de Hoare Exemples Conclusion

Preuve de programmes

Judicaël Courant

Lycée La Martinière-Monplaisir, Lyon

4 mai 2017

(2)

Introduction Logique de Hoare Exemples Conclusion

Une phrase sibylline

Les invariants de boucles sont introduits pour s’assurer de la correction des segments itératifs.

But de cet exposé

Donner un peu de contexte

Montrer la mise en œuvre sur quelques exemples

(3)

Introduction Logique de Hoare Exemples Conclusion

Une phrase sibylline

Les invariants de boucles sont introduits pour s’assurer de la correction des segments itératifs.

Programme officiel du tronc commun

But de cet exposé

Donner un peu de contexte

Montrer la mise en œuvre sur quelques exemples

(4)

Une phrase sibylline

Les invariants de boucles sont introduits pour s’assurer de la correction des segments itératifs.

Programme officiel du tronc commun

But de cet exposé

Donner un peu de contexte

Montrer la mise en œuvre sur quelques exemples

(5)

Introduction Logique de Hoare Exemples Conclusion

Plan

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(6)

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(7)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine

Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(8)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(9)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes

Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(10)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

pendant 7h à 2 jours, quelques morts Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(11)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(12)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(13)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(14)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?)

NORAD, 1980 détecte une attaque soviétique

(15)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(16)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US

(17)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Quelques bugs célèbres

Bank of Queensland, 2010 terminaux en panne une semaine Mars Climate Orbiter, 1999 3×108 $

Knight Capital, 2012 107 $ par minute pendant 45 minutes Vol 501 Ariane 5, 1996 5×108

Bug de l’an 2000 3×1011 $ dans le monde

FirstEnergy, 2013 coupure électrique pour5×107 personnes, pendant 7h à 2 jours, quelques morts

Therac 25, 1985-1987 5 morts avérées

Ambulances de Londres, 2017 panne 5h (20-30 morts ?) Toyota, 2010 102 morts ?

Satellite soviétique, 1983 détecte une attaque US NORAD, 1980 détecte une attaque soviétique

(18)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Bugs : tous les autres

Ce n’est qu’une petite partie…

500 postes d’agrégés d’informatique : 109 € pour 40 ans de carrière + la retraite.

(19)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Bugs : tous les autres

Ce n’est qu’une petite partie…

… de la partie émergée de l’iceberg des problèmes de sûreté

Il y a aussi les problèmes de sécurité.

500 postes d’agrégés d’informatique : 109 € pour 40 ans de carrière + la retraite.

(20)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Bugs : tous les autres

Ce n’est qu’une petite partie…

… de la partie émergée de l’iceberg des problèmes de sûreté Il y a aussi les problèmes de sécurité.

(21)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Bugs : tous les autres

Ce n’est qu’une petite partie…

… de la partie émergée de l’iceberg des problèmes de sûreté Il y a aussi les problèmes de sécurité.

500 postes d’agrégés d’informatique : 109 € pour 40 ans de carrière + la retraite.

(22)

Comment lutter contre les bugs

Pratiques d’ingénierie classique :

Faire appel à des ingénieurs compétents : dans le domaine concerné

et eninformatique Rigueur dans la conception Tests

(23)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Différence entre informatique et ingénierie classique

Écroulement d’un édifice Il est souvent possible

d’anticiper (dégradation progressive)

de rectifier avant la catastrophe (diagnostic possible)

d’éviter une catastrophe d’ampleur (simultanéité improbable)

Écroulement de systèmes informatique Généralement :

pas de signe avant-coureur

écroulement simultané à grande échelle possible

(24)

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(25)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Besoin de plus que des tests

Les tests sont

Nécessaires : ils permettent de trouver des bugs

Insuffisants : ils ne peuvent montrer l’absence de bugs

(26)

Besoin de plus que des tests

Les tests sont

Nécessaires : ils permettent de trouver des bugs Insuffisants : ils ne peuvent montrer l’absence de bugs

(27)

Introduction Logique de Hoare Exemples Conclusion

Motivation : correction des programmes Méthodes formelles

Que sont les méthodes formelles ?

Outils mathématiques/logiques pour démontrerla correction d’un logiciel

Principalement appliquées aux logiciels critiques Automatisées à des degrés divers

(28)

Une classe de méthodes formelles

Sémantique axiomatique Combinaison :

d’un langage pour décrire le comportement des programmes de règles de raisonnement

Logique de Hoare

Une sémantique axiomatique pour les programmes impératifs.

(29)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(30)

Un mini-langage impératif

instructions :

i ::=whilee doi boucle

|ife theni1 elsei2 conditionnelle

|v :=e affectation

|i1; i2 séquence

expressions :

e ::=v variable

|e1op e2 application d’une opération

|0|1 |2 |. . . constantes entières

op∈ {+,−,×,/,%, <, >,≤,≥,=}

(31)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Triplets de Hoare

Définition (Triplet de Hoare) Triplet{P}i{Q}, où :

P formule mathématique (précondition) i instruction

Q formule mathématique (postcondition)

Définition (Correction partielle)

{P}i{Q} validesi pour toute valeur initiale des variables vérifiant P et telle que l’exécution dei termine, la valeur des variables à la fin de l’exécution vérifieQ.

(32)

Règles de la logique de Hoare

On va se donner des règles de raisonnement (règles d’inférence) permettant de déduire des triplets de Hoare.

On les introduit par des exemples.

(33)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(34)

Échange de variables

Le programme suivant échange le contenu des variablesaet b : t :=a; a:=b; b :=t

Modélisation par un triplet de Hoare

Dire que le programme est correct, c’est dire que le triplet de Hoare suivant est valide

(ab

)

t:=a; a:=b; b :=t

(ba

)

(35)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Montrons la correction

De droite à gauche, on va montrer :

t=α a=β

b:=t

b=α a=β

t=α b=β

a:=b

t=α a=β

a=α b=β

t:=a

t=α b=β

D’où

(ab

)

t :=a; a:=b; b :=t

(ba

)

On obtient ces triplets par la règle d’affectation On les combine grâce à larègle de séquence

(36)

Règle d’affectation

Chacun de ces triplets, par exemple

(ta

) b :=t

(ba

)

est obtenu par la règle d’affectation.

Règle d’affectation

Pour toute formuleP, variablex et expression e, on peut utiliser l’axiome{P[e/x]}x:=e{P}, ce qu’on note

{P[e/x]}x:=e{P}

Exemples

{e+ 3>0}x:=e{x+ 3>0}

{x+ 1>0}x:=x+ 1{x >0}

(37)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Règle de la séquence

On a obtenu des triplets

{P1}t:=a{P2} {P2}a:=b{P3} {P3}b :=t{P4} On peut en déduire{P1}t:=a; a:=b; b :=t{P4} par la règle de la séquence.

Règle de la séquence

Des triplets{P}i1{Q} et {Q}i2{R}, on peut déduire le triplet {P}i1;i2{R}, ce qu’on note par la règle :

{P}i1{Q} {Q}i2{R} {P}i1;i2{R}

(38)

Conditionnelle

Montrons

{−2≤x ≤ −2}ifx<0 theny :=x+3 elsey := 5−x{1≤y ≤5}

Règle de la conditionnelle

{bP}i1{Q} {¬bP}i2{Q} {P}ifb theni1 elsei2{Q} Il suffit de montrer

{(−2≤x<2)∧(x<0)}y :=x+ 3{1≤y≤5}

et {(−2≤x ≤2)∧ ¬(x <0)}y := 5−x{1≤y ≤5}

(39)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Conditionnelle (suite)

Il suffit donc de montrer

{(−2≤x<2)∧(x<0)}y :=x+ 3{1≤y≤5}

et {(−2≤x ≤2)∧ ¬(x <0)}y := 5−x{1≤y ≤5}

Avec la règle de la séquence, on obtient respectivement : {1≤x+ 3≤5}y:=x+ 3{1≤y ≤5}

{1≤5−x≤5}y:= 5−x{1≤y ≤5}

Besoin d’une nouvelle règle : larègle d’affaiblissement.

(40)

Affaiblissement

Règle d’affaiblissement

{P0}i{Q0} PP0 Q0Q {P}i{Q}

Ici, on a bien :

[(−2≤x <2)∧(x <0)]⇒(1≤x+ 3≤5) [(−2≤x ≤2)∧ ¬(x<0)]⇒(1≤5−x≤5)

(41)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Boucle

Montrons

{n = 15}whilen>0 don:=n−3{n= 0}

Règle de la boucle

{bP}i{P} {P}whileb doibP} (P appelé invariant de la boucle)

Attention:

{n = 15∧n>0}n :=n−3{n = 15} n’est pas valide.

{n ≥0∧n >0}n:=n−3{n≥0} non plus.

Trouver un invariant n’est pas nécessairement facile.

(42)

Un invariant qui convient

Invariant de la boucle : n ≥0

et n multiple de 3.

En effet, on a successivement

{n ∈3N∧n >0}n:=n−3{n ∈3N} affectation {n∈3N}whilen>0 don :=n−3{n ≤0∧n ∈3N} boucle {n = 15}whilen>0 don:=n−3{n = 0} affaiblissement

(43)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(44)

Correction

Théorème

Les règles données permettent uniquement de dériver des triplets valides.

(45)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Complétude

Théorème

Les règles données sont suffisantes pour dériver tous les triplets valides.

(46)

Plus faible précondition

Théorème

Pour tout programmei, et toute postconditionQ, il existe une plus faible préconditionP telle que {P}i{Q} soit valide.

Elle est notéewp(i,Q). On a :

1 {wp(i,Q)}i{Q} valide

2 et pour toute proposition P0,{P0}i{Q}est valide si et seulement si P0 ⇒wp(i,Q)

De plus, on peut calculerwp(i,Q) de façon effective.

Remarque

Permet théoriquement de ramener mécaniquement la preuve de programme à celle d’une implication mathématique.

(47)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

En pratique

Les préconditions calculées sont naturelles, sauf pour les boucles : wp(whilee doi,Q)est presque la paraphrase

si on exécutewhilee doi, alors on aura Q aucun intérêt pour démontrer la correction du programme.

(48)

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(49)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Programmes annotés

On annote les boucles explicitement avec des invariants : On n’écrit plus

whilee doi mais whilee invariant P doi

Règle de la boucle

{bP}i{P}

{P}whileb invariant P doibP}

(50)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Correction partielle / correction totale

Vrai ou faux ?

{x>0}whilex >0invariant x >0 dox:=x{¬(x>0)∧(x>0)}

On aimerait modéliser la correction totale.

Correction totale = correction partielle + terminaison

(51)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Correction partielle / correction totale

Vrai ou faux ?

{x>0}whilex >0invariant x >0 dox:=x{¬(x>0)∧(x>0)}

C’est un triplet de Hoare valide

On n’a modélisé que la correction partielle. On aimerait modéliser la correction totale.

Correction totale = correction partielle + terminaison

(52)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Correction partielle / correction totale

Vrai ou faux ?

{x>0}whilex >0invariant x >0 dox:=x{¬(x>0)∧(x>0)}

C’est un triplet de Hoare valide

On n’a modélisé que la correction partielle.

(53)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Correction partielle / correction totale

Vrai ou faux ?

{x>0}whilex >0invariant x >0 dox:=x{¬(x>0)∧(x>0)}

C’est un triplet de Hoare valide

On n’a modélisé que la correction partielle.

On aimerait modéliser la correction totale.

Correction totale = correction partielle + terminaison

(54)

Correction partielle / correction totale

Vrai ou faux ?

{x>0}whilex >0invariant x >0 dox:=x{¬(x>0)∧(x>0)}

C’est un triplet de Hoare valide

On n’a modélisé que la correction partielle.

On aimerait modéliser la correction totale.

Correction totale = correction partielle + terminaison

(55)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Correction totale

Jusqu’ici{P}i{Q}signifiait

Pour toute valeur initiale des variables vérifiant P telle que l’exécution de i termine, la valeur des variables à la fin de l’exécution vérifie Q.

À partir de maintenant{P}i{Q}signifiera

Pour toute valeur initiale des variables vérifiant P, l’exécution de i termine et la valeur des variables à la fin de l’exécution vérifie Q.

Une seule règle de raisonnement à changer : celle de la boucle.

(56)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Notion de variant

On annote les boucles :

avec un invariant pour montrer la correction partielle

Unvariantest une quantitéentière positive qui décroîtstrictement à chaque tour de boucle.

Syntaxe :

whilee1 invariant Pvariant e2 doi

(57)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Notion de variant

On annote les boucles :

avec un invariant pour montrer la correction partielle plus un variantpour montrer la terminaison

Variant

Unvariantest une quantitéentière positive qui décroîtstrictement à chaque tour de boucle.

Syntaxe :

whilee1 invariant Pvariant e2 doi

(58)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Notion de variant

On annote les boucles :

avec un invariant pour montrer la correction partielle plus un variantpour montrer la terminaison

à chaque tour de boucle. Syntaxe :

whilee1 invariant Pvariant e2 doi

(59)

Introduction Logique de Hoare Exemples Conclusion

Cadre Règles

Résultats théoriques

Mécanisation de la preuve de programmes

Notion de variant

On annote les boucles :

avec un invariant pour montrer la correction partielle plus un variantpour montrer la terminaison

Variant

Unvariantest une quantitéentière positive qui décroîtstrictement à chaque tour de boucle.

Syntaxe :

whilee1 invariant Pvariant e2 doi

(60)

Règle de la boucle

Règle de la boucle

{bPe ∈N∧e=η}i{Pe∈N∧e < η}

{P}whileb invariant Pvariant e doibP} (η variable n’apparaissant pas dans i)

(61)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(62)

Le programme

Montrer que le programme Python suivant est correct :

# précondition: a = α∈Z et b = β∈N.

r = 1

while b > 0:

if b % 2 == 1:

b = b - 1 r = r * a else:

b = b // 2 a = a * a

# postcondition r = αβ

(63)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Le programme annoté

# précondition: a = α∈Z et b = β∈N.

r = 1

while b > 0:

# invariants: a ∈ Z, b ∈N et r× ab = αβ.

# variant: b if b % 2 == 1:

b = b - 1 r = r * a

else: # b est pair b = b // 2

a = a * a

# postcondition r = αβ

(64)

Correction de l’invariant

Montrons que les invariants donnés dans le programme sont corrects :

Ils sont vérifiés avant le premier tour de boucle. En effet, on a alors a=α∈Z,b =β ∈Net r×ab= 1×αββ.

Supposons qu’au début d’un tour de boucle, la condition de boucle et les invariants soient vrais, montrons alors que les invariants sont vrais à la fin du tour. Notons va,vb et vr les valeurs respectives dea,b et r au début du tour. On a vb>0 et va ∈Z,vb ∈Net vrvavbβ (invariant). Alors :

Sivb est impair, à la fin du tour, on ab=vb1N,a=va

etr =vrva, d’oùr×ab=vrvavavb−1=vrvavb =αβ. Sivb est pair, à la fin du tour, on ab=vb/2N, a=va2Z, etr×ab=vr(va2)vb/2=vrvavb =αβ. Donc les invariants donnés dans le programme sont corrects.

(65)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Décroissance stricte du variant

On a vu que le variant était un entier naturel. Montrons que la valeur deb décroît strictement à chaque tour de boucle. Notonsvb

sa valeur au début d’un tour de boucle. On sait qu’on avb∈Net vb >0.

Si vb est impair, alors à la fin de la boucle,b =vb−1<vb. Si vb est pair, alors à la fin de la boucle,b =vb/2<vb car vb>0.

Donc le variant décroît strictement à chaque tour de boucle.

Donc la boucle termine.

(66)

Correction du programme

La boucle termine donc le programme termine.

À la fin de la boucle, on ab ≤0(condition de boucle) ainsi que b ∈N etr×abβ (invariant). D’oùb = 0 et rβ.

(67)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(68)

Programme

Montrer que le programme Python suivant est correct :

# précondition: t tableau non vide.

n = len(t) k = 0

for i in range(1, n):

if t[i] > t[k]:

k = i

# postcondition t[k] est le maximum du tableau.

(69)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Un for est un while déguisé :

Boucle définie

for i in range(a, b):

...

Boucle indéfinie équivalente i = a

while i < b:

...i = i + 1 i = i - 1

(siaet b inchangées durant la boucle)

(70)

Règle pour le for

Si les valeurs dea et b sont inchangées durant la boucle et si I[a/i]vrai avant l’entrée dans la boucle for

et, pour chaque exécution du corps de la boucle,I vrai avant l’exécution impliqueI[i+ 1/i]vrai après l’exécution.

AlorsI[b/i]est vrai à la fin de la boucle.

Règle

Si les valeurs dea et b sont inchangées durant la boucle {P}instr{P[i+ 1/i]}

{P[a/i]}fori in range(a,b) : instr{P[b/i]}

(71)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Programme annoté

# précondition: t tableau non vide.

n = len(t) k = 0

for i in range(1, n):

# t[k] est le maximum de t[0:i]

if t[i] > t[k]:

k = i

# postcondition t[k] est le maximum du tableau.

(72)

Lignes directrices

1 Introduction

Motivation : correction des programmes Méthodes formelles

2 Logique de Hoare Cadre

Règles

Résultats théoriques

Mécanisation de la preuve de programmes 3 Exemples

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

4 Conclusion

(73)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Contexte

Étant donné :

un tableau t den valeurs triées par ordre croissant une valeur v

Retournerk tel quet[k] =v (−1 sit ne contient pasv), en O(logn) comparaisons.

Algorithme fondamental présent dans les cursus informatique depuis longtemps.

Publié pour la première fois en 1946.

Publié pour la première fois sans bug en 1962.

En 1986 : 90% des programmeurs incapables de l’écrire sans bug en 2h (expérience de Bentley).

(74)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Contexte

Étant donné :

un tableau t den valeurs triées par ordre croissant une valeur v

Retournerk tel quet[k] =v (−1 sit ne contient pasv), en O(logn) comparaisons.

Algorithme fondamental présent dans les cursus informatique depuis longtemps.

Publié pour la première fois en 1946.

bug en 2h (expérience de Bentley).

(75)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Contexte

Étant donné :

un tableau t den valeurs triées par ordre croissant une valeur v

Retournerk tel quet[k] =v (−1 sit ne contient pasv), en O(logn) comparaisons.

Algorithme fondamental présent dans les cursus informatique depuis longtemps.

Publié pour la première fois en 1946.

Publié pour la première fois sans bug en 1962.

En 1986 : 90% des programmeurs incapables de l’écrire sans bug en 2h (expérience de Bentley).

(76)

Contexte

Étant donné :

un tableau t den valeurs triées par ordre croissant une valeur v

Retournerk tel quet[k] =v (−1 sit ne contient pasv), en O(logn) comparaisons.

Algorithme fondamental présent dans les cursus informatique depuis longtemps.

Publié pour la première fois en 1946.

Publié pour la première fois sans bug en 1962.

En 1986 : 90% des programmeurs incapables de l’écrire sans bug en 2h (expérience de Bentley).

(77)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Un programme buggué

n = len(t) i = 0 j = n-1

while j - i >= 1:

m = (i+j) // 2 if v <= t[m]:

j = m-1 else:

i = m

if t[i] == v: return i else: return -1

(78)

Programme annoté

n = len(t) i = 0 j = n-1

while j - i >= 1:

# invariant : 0≤ij <n et vtv ∈ {t[i], . . . ,t[j]}

# variant : ji

m = (i+j) // 2 # imj

if v <= t[m]: # alors vtv ∈ {t[i], . . . ,t[m]}

j = m-1

else: # v >t[m] donc vtv ∈ {t[m+ 1], . . . ,t[j]}

i = m

if t[i] == v: return i else: return -1

(79)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji

c’est faux !

le programme peut boucler (si i = 0 etj = 1)

Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n. c’est faux si n= 0!

le programme plante si t est vide

(80)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n. c’est faux si n= 0!

le programme plante si t est vide

(81)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

le programme peut boucler (si i = 0 etj = 1) Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n. c’est faux si n= 0!

le programme plante si t est vide

(82)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

le programme peut boucler (si i = 0 etj = 1) Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

le programme plante si t est vide

(83)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

le programme peut boucler (si i = 0 etj = 1) Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n.

c’est faux si n= 0!

le programme plante si t est vide

(84)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

le programme peut boucler (si i = 0 etj = 1) Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n.

c’est faux si n= 0!

(85)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Variant

on doit montrer ji ≥1⇒j−ji+j

2

k

<ji c’est faux !

le programme peut boucler (si i = 0 etj = 1) Invariant :

on doit montrer que l’invariant est vrai avant l’entrée dans la boucle.

en particulier, on doit montrer 0≤ij <n.

c’est faux si n= 0!

le programme plante si t est vide

(86)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Corriger les bugs

Deux approches possibles

Corriger les bugs et revérifier la correction.

Reprendre la conception du programme :

(87)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Corriger les bugs

Deux approches possibles

Corriger les bugs et revérifier la correction.

Reprendre la conception du programme :

On jette le premier programme à la poubelle On réfléchit dès le départ à l’invariant et au variant On écrit le détail du code seulement ensuite

(88)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Corriger les bugs

Deux approches possibles

Corriger les bugs et revérifier la correction.

Reprendre la conception du programme : On jette le premier programme à la poubelle

(89)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Corriger les bugs

Deux approches possibles

Corriger les bugs et revérifier la correction.

Reprendre la conception du programme : On jette le premier programme à la poubelle On réfléchit dès le départ à l’invariant et au variant

On écrit le détail du code seulement ensuite

(90)

Corriger les bugs

Deux approches possibles

Corriger les bugs et revérifier la correction.

Reprendre la conception du programme : On jette le premier programme à la poubelle On réfléchit dès le départ à l’invariant et au variant On écrit le détail du code seulement ensuite

(91)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Ce qu’on veut

Chercher une valeur v par dichotomie dans un tableaut.

Variant naturel : taillen du sous-tableau dans lequel on cherche.

On coupe ce sous-tableau en deux sous-tableaux de tailles bn/2cet dn/2e et on cherche dans l’un des deux.

Pour que ce nouveau sous-tableau soit de taille strictement plus petite, il suffit d’avoirdn/2e<n, i.e.n ≥2.

Invariant : si vt, alors v est dans le sous-tableau det de taille n commençant à un certain indicei :

vtvt[i :i+n]

(92)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Ce qu’on veut

Chercher une valeur v par dichotomie dans un tableaut.

Variant naturel : taillen du sous-tableau dans lequel on cherche.

Pour que ce nouveau sous-tableau soit de taille strictement plus petite, il suffit d’avoirdn/2e<n, i.e.n ≥2.

Invariant : si vt, alors v est dans le sous-tableau det de taille n commençant à un certain indicei :

vtvt[i :i+n]

(93)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Ce qu’on veut

Chercher une valeur v par dichotomie dans un tableaut.

Variant naturel : taillen du sous-tableau dans lequel on cherche.

On coupe ce sous-tableau en deux sous-tableaux de tailles bn/2cet dn/2e et on cherche dans l’un des deux.

Pour que ce nouveau sous-tableau soit de taille strictement plus petite, il suffit d’avoirdn/2e<n, i.e.n ≥2.

Invariant : si vt, alors v est dans le sous-tableau det de taille n commençant à un certain indicei :

vtvt[i :i+n]

(94)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Ce qu’on veut

Chercher une valeur v par dichotomie dans un tableaut.

Variant naturel : taillen du sous-tableau dans lequel on cherche.

On coupe ce sous-tableau en deux sous-tableaux de tailles bn/2cet dn/2e et on cherche dans l’un des deux.

Pour que ce nouveau sous-tableau soit de taille strictement plus petite, il suffit d’avoirdn/2e<n, i.e.n ≥2.

vtvt[i :i+n]

(95)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Ce qu’on veut

Chercher une valeur v par dichotomie dans un tableaut.

Variant naturel : taillen du sous-tableau dans lequel on cherche.

On coupe ce sous-tableau en deux sous-tableaux de tailles bn/2cet dn/2e et on cherche dans l’un des deux.

Pour que ce nouveau sous-tableau soit de taille strictement plus petite, il suffit d’avoirdn/2e<n, i.e.n ≥2.

Invariant : si vt, alors v est dans le sous-tableau det de taillen commençant à un certain indicei :

vtvt[i :i+n]

(96)

Squelette du programme

...while n >= 2:

# invariant : n≥0 et Ji,i+nJ⊂J0,|t|J

# et vtvt[i :i+n]

# variant : n k = n // 2

if ...: # alors vtvt[i:i+k]

n = k

else: # vtvt[i+k :i+n] i = i+k

n = n - k

# n<2 et n≥0 ...

(97)

Introduction Logique de Hoare Exemples Conclusion

Exponentiation rapide

Recherche du maximum d’un tableau Recherche dichotomique

Le programme

n, i = len(t), 0 while n >= 2:

# invariant : n≥0 et Ji,i+nJ⊂J0,|t|J

# et vtvt[i :i+n]

# variant : n k = n // 2

if m < t[i+k]: # alors vtvt[i :i+k]

n = k

else: # vtvt[i+k :i+n]

i = i+k n = n - k

# n<2 et n≥0 et vtvt[i :i+n]

if n == 1 and t[i] == m: return i else: return -1

(98)

Conclusion

La sémantique axiomatique permet : de spécifier des programmes impératifs d’en montrer la terminaison et la correction

de construire des programmes corrects du premier coup

Références

Documents relatifs

Donner un exemple de revˆ etement ab´ elien φ tel que Aut(φ) est libre sur deux

On donne une fonction rationnelle f définie par. )Montrer que (E) admet une solution réelle que l’on déterminera b. )Calculer et en déduire la nature du triangle ABC.

En d´eduire les valeurs de θ pour que H soit le centre de gravit´e du triangle ABC... Montrer que la suite (x n ) n∈ N est bien d´efinie

Soit C(∆) l’espace des fonctions réelles continues sur un intervalle fermé borné ∆ = [a, b], muni de la distance d de la convergence uniforme. ( On peut raisonner par l’absurde

De même la deuxième série commence au lancer suivant la n de la première série et se termine (si elle se termine) au lancer précédant un changement de côté.. Exemple : si

Devoir Surveillé 6 - durée : 4h 10 avril 2019 Les documents, la calculatrice, et tout matériel électronique sont interdits.. Le soin, la précision et la qualité de la rédaction

[r]

c) Montrer que si E est r´ eunion d´ enombrable de ferm´ es, alors un au moins de ces ferm´ es est d’int´ erieur non vide. Exercice 2 : Soient E un espace vectoriel norm´ e, A