0% ont trouvé ce document utile (0 vote)
41 vues27 pages

Logique de Hoare et vérification des programmes

Transféré par

OUEDRAOGO Alain
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
41 vues27 pages

Logique de Hoare et vérification des programmes

Transféré par

OUEDRAOGO Alain
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Vérification des programmes impératifs :

la logique de HOARE
COMPAORE Anasthasie Joëlle
Qu’est-ce qu’un programme impératif ?
• Communément
– Suite d’instructions (affectations)
– Structures de contrôle
oExécution sous conditions (Conditionnelles)
oExécution itérative (boucles)
Idée maîtresse de la logique de HOARE
Programme = transformateur d’états
Etati exécution programme Etatj

État : valeurs des variables du programme

Exemple
{x = 2, y = 5} exécution programme P {x = 5, y = 2}
Caractéristiques méthodes de vérification
• Basées sur la preuve

• Semi-automatiques (utilisation d’heuristiques)

• Orientées propriétés

• Pendant ou après le développement


Pourquoi spécifier et vérifier les codes
• Spécification : composante documentation
• Peut diminuer de façon significative la durée du
développement et de la maintenance
• Facilite la réutilisation du code
• Peut être obligatoire pour les audits de certification
Un langage minimal
• E ::= n | x | (-E) | (E + E) | (E-E) | (E* E) |
(E div E) | (E mod E)

• B ::= true | false | (!B) | (B & B) | (B || B) |


(E == E) | (E != E) |
(E < E) | (E > E) | (E <= E) | (E >= E)

• C ::= x=E | C; C | if B {C1} else {C2} |


while B {C} | repeat {C} until B
Exemples de programmes
c = 0;
a = 0; a = x + 1;
while (a != 1) {
b = x; if ((a – 1) == 0) {
if (a mod 2 != 0) {
while (b >= y) { y = 1;
c=c+b;
b=b–y }
}
a = a + 1; else {
a = a div 2;
} y = a;
b = b * 2;
}
}; y = 1;
c = c + b; z = 0; début
y = 0;
while (z != x) {
while (y * y < x){
z=z+1
y = y + 1;
y = 1; y = y * z;
}
while (x != 0) { } y = y - 1;
y=y*x fin
x = x - 1;
}
Programme correct ?
Communément : Fait ce qu’il est censé faire sans
se tromper, dans les conditions déterminées
Nécessité de décrire (formellement)
• Le quoi : que doit faire le programme ?
• Les cas pris en compte : sous quelles conditions ?

Exemple : spécifier la division entière de x par y ?


• Le quoi : trouver a et b tel que x = (y * a) + b et
y>b
• Les cas : x entier, y entier non nul
Expression de la spécification
Relation entre :
• les entrées :
o valeurs des variables avant exécution,
o arguments des fonctions
o etc.
• les sorties :
o valeurs des variables après exécution
o etc.
Rappel des notations logiques usuelles
• True
• False
• ¬P
• p Ʌ q signifie p «et» q
• p V q signifie p «ou» q
• p q signifie p «implique» q
•  x, p signifie «quelque soit x, p est vrai »
• Ǝ x, p signifie «il existe x tel que p est vrai »
Spécification : triplets de HOARE
{P} prog {Q} : = triplet de HOARE
• P = Pré-condition
Formules de logique
• Q = Post-condition
• Prog = programme spécifié

Si « prog » s’exécute dans un état satisfaisant P,


l’état issu de l’exécution de « prog » satisfera Q
Spécification : triplets de HOARE
Deux types de variables
• Variables de programme : apparaissent dans le programme
• Variables logiques :
– n’apparaissent pas dans le programme

– Servent en général à conserver les anciennes valeurs des variables de


programme

Exemple : spécifier le programme qui inverse deux valeurs


{x = x0  y = y0} Inverse {x = y0  y = x0}
Spécification : triplets de HOARE
Remarques/définitions
• Un état est une fonction qui associe des valeurs à
chaque variable (pertinente)
• Les quantificateurs ne lient que les variables
n’apparaissant pas dans « prog »
• Lorsqu’il n’est pas nécessaire de contraindre l’état initial,
on utilise T comme précondition

Exercice : Spécifier les programmes présentés


Notion (formelle) de correction
Programme correct = triplet de HOARE vrai
Définition (correction partielle) : Un triplet de HOARE
{P}prog{Q} est satisfait pour la correction partielle
(|=par (P) prog (Q)) si :
pour tout état satisfaisant P,
si prog termine alors
l’état résultant de l’exécution de prog satisfait Q

|=par : relation de satisfaction pour la correction partielle


Notion (formelle) de correction
Définition (correction totale) : Un triplet de HOARE
{P}prog{Q} est satisfait pour la correction totale
(|=tot (P) prog (Q)) si :
pour tout état satisfaisant P,
prog termine et
l’état résultant de l’exécution de prog satisfait Q

|=tot : relation de satisfaction pour la correction totale


Notion (formelle) de correction
Définition : si la correction partielle (totale) d’un triplet
peut être prouvée dans le calcul de correction partielle
(totale), le séquent
|--par (P) prog (Q) (|--tot (P) prog (Q)) est valide
Règles de calcul de la correction partielle

règle de HOARE : règle de déduction dans laquelle


les jugements sont des triplets de HOARE
triplet1 tripletn
triplet

Triplet t correct : il existe un arbre de déduction de


HOARE complet ayant comme racine t.
Règle de l’affectation
Notations
• x=E
• P[x E] ou P[E/x]: P où x est remplacée par E

AFF1
{P[x  E]} x=E {P}

AFF2
{P} x = E {P[x  x0] Ʌ x == E [xx0]}
Règle de l’affectation
Exemples :
1) On suppose prog : x = 2. Lesquels de ces triplets
sont vrais ?
a) {2 = 2} Prog {x = 2} c) {2 = y} Prog {x = y}
b) {2 = 4} Prog {x = 4} d) {2 > 0} Prog {x > 0}
2) On suppose prog : x = x + 1. Trouver P pour que
les triplets suivants soient vrais
a) {?} Prog {x = 2} c) {?} Prog {x+5 = y}
b) {?} Prog {x = y} d) {?} Prog {x > 0  y > 0}

3) Compléter : {x-y >= 0} y = y+x {?}


Règles de la séquence et de la conséquence
C1; C2

{P} C1 {Q} {Q} C2 {R}


SEQ
{P} C1; C2{R}

P  P’ {P’} C {Q’} Q’  Q
CONSEQ
{P} C{Q}
Règles de la séquence et de la conséquence
Exemples :
1) Montrer que u = x + y après l’exécution de :
z = x;
z = z + y;
u = z;

2) Montrer que
• {y = 5} x = y + 1 {x = 6}
• {y < 3} y = y + 1 {y < 4}
• {x=0} x = x+1;x=x+1 {x = 2}
sont valides
Règle de la conditionnelle
Notation : if B then C1 else C2

{P Ʌ B} C1 {Q} {P Ʌ ¬B} C2 {Q}


COND
{P} if B then C1 else C2 {Q}

Exemple :
{true} if y = 0 then x = y else x = 0 {x=0}
{true} a = x + 1; if (a – 1 == 0) y = 1 else y = a {y = x+1}
Règle de l’itération
Notation : while B {C}

{P Ʌ B} C {P}
Partial-WHILE
{P} while B {C} {P Ʌ ¬B}

Invariant déjà donné (P)


Exemple :
•{x>=0} while (x<b) {x := x+1} {x>=0 Ʌ ¬(x <b)}
Règle de l’itération
{ Ʌ B} C {}
Partial-WHILE
{} while B {C} {}
Preuve en remontant
1. Trouver un invariant : 
2. Essayer de prouver que |--   B  et |--   . Si échec retour à 1, sinon
poursuivre
3. Partir de  comme post-condition de la boucle et remonter jusqu’à la
première instruction de la boucle. On note ’ la caractérisation de l’état à ce
niveau
4. Essayer de prouver que |--   B   ‘ est valide. Si OK ( est un invariant),
poursuivre, sinon retour en 1)
5. Écrire  au dessus du while (et  au dessus de ce  s’il n’y a pas des
instructions avant le while) en annotant ce  avec l’implication
Règle de l’itération
Exemple : correction partielle du programme ci-dessous

y = 1;
z = 0;
while (z != x) {
z=z+1
y = y * z;
}
Calcul de la correction totale

Deux étapes
1. Correction partielle
2. Terminaison de prog
Généralement dans cet ordre
Calcul de la correction totale

Terminaison
1. Recherche d’un variant de boucle

{P’ Ʌ B Ʌ 0 <= E = E0} C {P’ Ʌ 0 <= E < E0}


Total-WHILE
{P’ Ʌ 0 <= E} while B {C} {P’ Ʌ ¬B}
Exemple :
{x>=0} while x<b do x := x+1 done {x>=0 Ʌ ¬(x <b)}

Vous aimerez peut-être aussi