Logiques de programmes, deuxi`eme cours
Variables et boucles : la logique de Hoare
Xavier Leroy 2021-03-11
Coll`ege de France, chaire de sciences du logiciel xavier.leroy@college-de-france.fr
Les bases de la logique de Hoare
Les triplets de Hoare
Les tripletsfaibles:
{ P } c { Q }
% ↑ -
pr´econdition commande postcondition
Signification intuitive :
Si la commandec, d´emarr´ee dans un ´etat initial satisfaisantP, termine, alors l’´etat final satisfaitQ.
On verra aussi les tripletsforts[P]c[Q]qui garantissent la terminaison :la commandec, d´emarr´ee dans un ´etat initial satisfaisantP, termine toujours, et l’´etat final satisfaitQ.
2
IMP : un petit langage imp ´eratif `a contrˆ ole structur ´e
Expressions arithm´etiques :
a::=x variable du programme
|0|1|. . . constantes
|a1+a2|a1×a2|. . . op´erations Expressions bool´eennes :
b::=a1 ≤a2|. . . comparaisons
|b1andb2|notb|. . . connecteurs Commandes :
c ::=skip commande vide
|x:=a affectation
|c1;c2 s´equence
|ifbthenc1elsec2 conditionnelle
|whilebdoc boucle
Les r `egles de la logique de Hoare
faible
pour IMP
Une r`egle par construction du langage de commandes.
{P}skip{P} {Q[x←a]}x :=a{Q} {P}c1{Q} {Q}c2{R}
{P}c1;c2{R}
{P∧b}c1{Q} {P∧ ¬b}c2{Q} {P}ifbthenc1elsec2{Q}
{P∧b}c{P} {P}whilebdoc{P∧ ¬b}
4
Les r `egles g ´en ´eriques
La r`egle de cons´equence :P⇒P0 {P0}c{Q0} Q0 ⇒Q {P}c{Q}
Peut aussi s’´ecrire avec deux r`egles : une qui renforce la pr´econdition, l’autre qui affaiblit la postcondition.
P⇒P0 {P0}c{Q} {P}c{Q}
{P}c{Q0} Q0⇒Q {P}c{Q}
Note : la r`egle du haut est d´erivable des deux r`egles du bas, et r´eciproquement.
Un exemple de d ´erivation
> ⇒0=0∧1=1
{0=0∧1=1}x:=0{x=0∧1=1} {x=0∧1=1}y:=1{x=0∧y=1} {0=0∧1=1}x:=0;y:=1{x=0∧y=1} { > }x:=0;y:=1{x=0∧y=1}
6
Un exemple de d ´erivation
Une notation plus compacte, sous forme de programme IMP annot´e par des assertions :
{ > }⇒
{0=0∧1=1} x:=0;
{x=0∧1=1} y:=1
{x=0∧y=1}
V ´erification d’un
vrai
programme : la division euclidienne
{0≤a}⇒{a=b·0+a ∧ 0≤a} r:=a;
{a=b·0+r ∧ 0≤r} q:=0;
{a=b·q+r ∧ 0≤r} while r≥b do
{a=b·q+r ∧ 0≤r ∧ r≥b}⇒ {a=b·(q+1) + (r−b) ∧ 0≤r−b} r:=r−b;
{a=b·(q+1) +r ∧ 0≤r} q:=q+1
{a=b·q+r ∧ 0≤r} done
{a=b·q+r ∧ 0≤r ∧ r<b}⇒ {q=a/b ∧ r=amodb}
8
Travaux dirig ´es : le calcul du maximum
(Mike Gordon)1. ´Ecrire un programme IMP qui met dansxle maximum des valeurs dexet dey.
if x<y then x:=y else skip
2. Sp´ecifier ce programme en logique de Hoare.
{ > }if x<y then x:=y else skip{x= max(x,y)}
3. V´erifier le programme vis-`a-vis de cette sp´ecification.
{x<y∧ > } ⇒ {y= max(y,y)}x:=y{x= max(x,y)} {x≥y∧ > } ⇒ {x= max(x,y)}skip{x= max(x,y)} On conclut par la r`egle pour les conditionnelles.
Travaux dirig ´es : le calcul du maximum
(Mike Gordon)1. ´Ecrire un programme IMP qui met dansxle maximum des valeurs dexet dey.
if x<y then x:=y else skip
2. Sp´ecifier ce programme en logique de Hoare.
{ > }if x<y then x:=y else skip{x= max(x,y)}
3. V´erifier le programme vis-`a-vis de cette sp´ecification.
{x<y∧ > } ⇒ {y= max(y,y)}x:=y{x= max(x,y)} {x≥y∧ > } ⇒ {x= max(x,y)}skip{x= max(x,y)} On conclut par la r`egle pour les conditionnelles.
9
Travaux dirig ´es : le calcul du maximum
(Mike Gordon)1. ´Ecrire un programme IMP qui met dansxle maximum des valeurs dexet dey.
if x<y then x:=y else skip
2. Sp´ecifier ce programme en logique de Hoare.
{ > }if x<y then x:=y else skip{x= max(x,y)} 3. V´erifier le programme vis-`a-vis de cette sp´ecification.
{x<y∧ > } ⇒ {y= max(y,y)}x:=y{x= max(x,y)} {x≥y∧ > } ⇒ {x= max(x,y)}skip{x= max(x,y)} On conclut par la r`egle pour les conditionnelles.
Travaux dirig ´es : le calcul du maximum
(Mike Gordon)1. ´Ecrire un programme IMP qui met dansxle maximum des valeurs dexet dey.
if x<y then x:=y else skip
2. Sp´ecifier ce programme en logique de Hoare.
{ > }if x<y then x:=y else skip{x= max(x,y)} 3. V´erifier le programme vis-`a-vis de cette sp´ecification.
{x<y∧ > } ⇒ {y= max(y,y)}x:=y{x= max(x,y)} {x≥y∧ > } ⇒ {x= max(x,y)}skip{x= max(x,y)} On conclut par la r`egle pour les conditionnelles.
9
Est-ce la bonne sp ´ecification ?
Elle est satisfaite par de nombreux programmes ! { > } x:=y {x= max(x,y)} { > } y:=x {x= max(x,y)} { > } x:=1;y:=0 {x= max(x,y)}
La r´eponse est non ! On voulait dire
La valeur dex`a la fin du programmeest le maximum des valeurs dexet deyau d ´ebut du programme.
Est-ce la bonne sp ´ecification ?
Elle est satisfaite par de nombreux programmes ! { > } x:=y {x= max(x,y)} { > } y:=x {x= max(x,y)} { > } x:=1;y:=0 {x= max(x,y)}
La r´eponse est non ! On voulait dire
La valeur dex`a la fin du programmeest le maximum des valeurs dexet deyau d ´ebut du programme.
10
Variables auxiliaires
Une solution est de sp´ecifier en utilisant des variables
math´ematiquesα, β, . . ., distinctes des variables du programme x,y, . . .:
{x=α∧y=β}c{x=max(α, β)} Cesvariables auxiliairessont implicitement quantifi´ees universellement en tˆete du triplet :
∀α, β, {x=α∧y=β}c{x= max(α, β)}
Variables fantˆ omes
Autre possibilit´e : sp´ecifier en utilisant des variables du langage de programmation qui n’apparaissent pas dans le programme `a sp´ecifier :
{x=z}c{x= max(z,y)} avecznon libre dansc Cesvariables fantˆomeszgardent leur valeur pendant l’ex´ecution decet permettent donc de parler de l’´etatavantdans la postcondition.
12
La logique
forte
(correction totale)
Les tripletsforts:
[ P ] c [ Q ]
% ↑ -
pr´econdition commande postcondition
Signification intuitive :
La commandec, d´emarr´ee dans un ´etat initial satisfaisantP, termine dans un ´etat final satisfaisantQ.
Les r `egles de la logique de Hoare
forte
pour IMP
Seules les boucles peuvent causer la non-terminaison
⇒pour les autres constructions d’IMP, les r`eglesfortes sont semblables aux r`eglesfaibles.
[P]skip[P] [Q[x←a] ]x:=a[Q] [P]c1[Q] [Q]c2[R]
[P]c1;c2[R]
[P∧b]c1[Q] [P∧ ¬b]c2[Q] [P]ifbthenc1elsec2[Q] P⇒P0 [P0]c[Q0] Q0 ⇒Q
[P]c[Q]
14
V ´erifier la terminaison d’une boucle
La technique duvariant: une expressiona, `a valeurs positives, qui d´ecroˆıt strictement `a chaque tour de boucle.
∀α, [P∧b∧a=α]c[P∧0≤a< α] [P]whilebdoc[P∧ ¬b]
La boucle termine forc´ement, au bout d’au plusNit´erations, o `uN est la valeur initiale du varianta.
Note : en cas de boucles imbriqu´ees, on v´erifie la terminaison de chaque boucle ind´ependamment des autres.
(Contrairement `a Turing 1949 et Floyd 1967.)
V ´erifier la terminaison de la division euclidienne
Le variant est la variabler.
{0≤a ∧ 0<b} ⇒ {a=b·0+a ∧ 0≤a ∧ 0<b} r:=a;
{a=b·0+r ∧ 0≤r ∧ 0<b} q:=0;
{a=b·q+r ∧ 0≤r ∧ 0<b} while r≥b do
{a=b·q+r ∧ 0≤r ∧ 0<b ∧ r≥b ∧ r=α} ⇒ {a=b·(q+1) + (r−b) ∧ 0≤r−b ∧ 0<b
r:=r−b; ∧0≤r−b< α}
{a=b·(q+1) +r ∧ 0≤r ∧ 0<b ∧ 0≤r< α} q:=q+1
{a=b·q+r ∧ 0≤r ∧ 0<b ∧ 0≤r< α} done
{a=b·q+r ∧ 0≤r ∧ r<b} ⇒ {q=a/b ∧ r=amodb}
16
G ´en ´eralisation `a plusieurs variants
On peut avoir besoin de plusieurs variantsa1, . . . ,anet d’un ordre bien fond´e≺entre lesn-uplets d’entiers.
(Par exemple, un ordre lexicographique.)
∀α1, . . . , αn, [P∧b∧(a1, . . . ,an) = (α1, . . . αn)] c
[P∧(a1, . . . ,an)≺(α1, . . . αn)] [P]whilebdoc[P∧ ¬b]
Ajouter des r `egles `a la logique
Une r `egle d ´eriv ´ee : la conditionnelle sans
elseNotation : ifbthencdef= ifbthencelse skip {P∧b}c{Q} P∧ ¬b⇒Q
{P}ifbthenc{Q} D ´emonstration.
Par la d´erivation suivante :
{P∧b}c{Q}
P∧ ¬b⇒Q {Q}skip{Q} {P∧ ¬b}skip{Q} {P}ifbthencelse skip{Q}
Une r `egle d ´eriv ´ee : la boucle
do. . .whileNotation : docwhilebdef= c;whilebdoc {P}c{Q} Q∧b⇒P {P}docwhileb{Q∧ ¬b} D ´emonstration.
{P}c{Q}
Q∧b⇒P {P}c{Q} {Q∧b}c{Q}
{Q}whilebdoc{Q∧ ¬b} {P}c;whilebdoc{Q∧ ¬b}
19
Une r `egle d ´eriv ´ee : la boucle compt ´ee
forNotation : sih,isont deux variables distinctes,
fori=`tohdoc def= i:=`;whilei≤hdo(c;i:=i+1) On peut d´eriver un triplet fort qui garantit la terminaison de la boucle, pourvu que le corpscde la boucle ne contienne pas d’affectations ni `aini `ah.
[P∧i≤h]c[P[i←i+1] ] i,hnon affect´ees dansc [P[i←`] ]fori=`tohdoc[P∧i>h]
Le variant est l’expressionh−i+1, qui d´ecroˆıt de 1 `a chaque tour.
Une r `egle d ´eriv ´ee : l’affectation `a la mani `ere de Floyd
{P}x:=a{ ∃x0,x=a[x←x0]∧P[x←x0]}
D ´emonstration.
NotonsQdef=∃x0,x=a[x←x0]∧P[x←x0].
P⇒Q[x←a] {Q[x←a]}x:=a{Q} {P}x:=a{Q}
En effet, Q[x←a] = ∃x0,a=a[x←x0]∧P[x←x0][x←a]
= ∃x0,a=a[x←x0]∧P[x←x0] et il suffit de prendrex0=x.
21
Quelques r `egles admissibles
Conjonction, disjonction, quantification :
{P1}c{Q1} {P2}c{Q2} {P1∧P2}c{Q1∧Q2}
{P1}c{Q1} {P2}c{Q2} {P1∨P2}c{Q1∨Q2}
∀x∈X, {P(x)}c{Q(x)} X6=∅ { ∀x∈X.P(x)}c{ ∀x∈X.Q(x)}
∀x ∈X, {P(x)}c{Q(x)} { ∃x∈X.P(x)}c{ ∃x∈X.Q(x)} D ´emonstration.
R´ecurrence surcet inversion sur les d´erivations de{P1}c{Q1}, {P2}c{Q2}, etc.
Extensions du langage de
programmation
Le contrˆ ole non structur ´e
Goto considered harmful . . . or not ? Commandes : c::=. . .|goto`|`:c
Associer un invariantL(`) `a chaque ´etiquette`. Les triplets deviennentL`{P}c{Q}.
L` {L(`)}goto`{ ⊥ }
L` {L(`)}c{Q} L` {L(`)}`:c{Q}
Le non-d ´eterminisme
Permettre aux programmes d’avoir plusieurs comportements diff´erents.
c::=. . .
|c18c2 ex´ecutec1ouc2
|x:=choose(N) met un nombre entre 0 etN−1 dansx
|havocx met un nombre quelconque dansx
Les autres constructions se d´eduisent dehavoc: x:=choose(N) ≈ havocx; x:=xmodN
c18c2 ≈ x:=choose(2);ifx=0thenc1elsec2 x:=choose(N) ≈ x:=08x=18· · ·8x:=N−1
24
Les r `egles pour le non-d ´eterminisme
La r`egle pour le choix :{P}c1{Q} {P}c2{Q} {P}c18c2{Q} L’axiome pourchoose:
{Q[x←0]∧ · · · ∧Q[x←N−1]}x:=choose(N){Q} ou { ∀α, 0≤α <N⇒Q[x←α]}x:=choose(N){Q} L’axiome pourhavoc:
{ ∀α,Q[x←α]}havoc x{Q}
ou {Q[x←y]}havoc x{Q} siyn’apparait pas dansQ
Les assertions dynamiques
Introduisent dans le langage la possibilit´e d’´echouer pendant l’ex´ecution.
c::=. . .
|assertb (best une expression bool´eenne ; adapt´e `a la v´erification dynamique)
|assertA (Aest une assertion logique ; adapt´e `a la v´erification statique)
La v´erification doit garantir l’absence d’erreurs `a l’ex´ecution.
D’o `u la r`egle :
{P∧A}assertA{P∧A}
26
Erreurs dans les calculs arithm ´etiques
L’´evaluation d’une expression arithm´etiqueaou bool´eenneb peut aussi provoquer une erreur `a l’ex´ecution : division enti`ere par z´ero, d´ebordement arithm´etique, etc.
On peut caract´eriser l’absence d’erreurs par un pr´edicatDef: Def(cst) =Def(x) =>
Def(a1+a2) =Def(a1)∧Def(a2)∧MIN≤a1+a2≤MAX
Def(a1/a2) =Def(a1)∧Def(a2)∧a26=0∧MIN≤a1/a2≤MAX Def(a1≤a2) =Def(a1)∧Def(a2)
(etc.)
Erreurs dans les calculs arithm ´etiques
Dans les r`egles de la logique, on ajoute des pr´econditions pour garantir que toutes les expressions s’´evaluent sans erreurs.
{Q[x←a]∧Def(a)}x:=a{Q} {P∧b}c1{Q} {P∧ ¬b}c2{Q} {P∧Def(b)}ifbthenc1elsec2{Q}
{P∧b}c{P∧Def(b)} {P∧Def(b)}whilebdoc{P∧ ¬b}
28
Liens avec la s ´emantique :
correction de la logique
Quelle logique pour ´enoncer et traiter les assertions ?
La vision de Hoare :
• Une logiquesur mesure,
• quiparledirectement des variables du programme (x, . . . ) et des op´erateurs du langage de programmation (+,and, . . . )
• Une assertion = une proposition de cette logique.
Une vision plus pratique :
• Une logiquestandard,
p.ex. logique du 1erordre + arithm´etique.
• Parledes variables du programme et des op´erateurs du langage via unetraduction.
• Une assertion = unpr´edicatsurl’´etat m´emoire.
29
La signification des assertions
Un ´etat m´emoiresassocie une valeur `a chaque variable du programme.
´Etat m´emoire (store) s::=variable→valeur
Une assertionP(portant sur les variablesx,y, du programme) est interpr´et´ee comme unpr´edicat sur l’´etat m´emoires:
[[P]]s=P[x←s(x),y←s(y), . . .]
Exemple
L’assertion 0≤x<yest le pr´edicatλs.0≤s(x)<s(y).
S ´emantique des expressions
On se donne une s´emantique d´enotationnelle des expressions du langage : chaque expressionaest interpr´et´ee comme une
fonction[[a]] : ´etat m´emoire→valeur. Typiquement : [[x]]s=s(x) [[a1+a2]] = [[a1]]⊕[[a2]]
[[cst]]s=cst [[a1∗a2]] = [[a1]]⊗[[a2]]
Les op´erateurs⊕,⊗d´enotent l’addition et la multiplication du langage. Par exemple pour une arithm´etique modulo 232:
n1⊕n2=norm(n1+n2) n1⊗n2=norm(n1×n2)
norm(n) =nmod232 (arithm´etique non sign´ee) norm(n) = (n+231) mod232−231 (arithm´etique sign´ee)
31
Substitution dans les assertions
{Q[x←a]}x :=a{Q}
Dans la r`egle pour l’affectation, que signifieQ[x ←a]? C’est le pr´edicat[[Q]]so `us(x)est remplac´e par[[a]]s.
Par exemple :
[[ (x <10) [x ←x+1] ]]s= (s(x)<10) [s(x)←[[x+1]]s]
= [[x+1]]s<10= (s(x)⊕1)<10 On a, par construction
[[Q[x←a] ]]s= [[Q]] (s[x←[[a]]s])
Ceci valide s´emantiquement la r`egle de Hoare pour l’affectation.
Erreurs dans les expressions arithm ´etiques
Pour mod´eliser les erreurs dans les expressions arithm´etiques (p.ex. division par z´ero), on peut ajouter une d´enotationerr:
[[a]]s∈Z+{err}
L’assertion substitu´eeQ[x←a]exige que[[a]]s6=err: [[Q[x←a]]]s= [[a]]s6=err∧[[Q]] (s[x ←[[a]]s]) L’assertionDef(a)doit garantir que[[a]]s6=err.
Ceci valide s´emantiquement la r`egle
{Q[x←a]∧Def(a)}x:=a{Q}
33
S ´emantique des commandes
La s´emantique des commandes doit pouvoir traiter
• la divergence (non-terminaison) (bouclewhile, . . . )
• les erreurs `a l’ex´ecution (1/0, assertions dynamiques)
• le non-d´eterminisme (choose,havoc,c18c2)
On choisit une s´emantique op´erationnelle `a r´eductions :
c / s → c
0/ s
0c / s → err
c: commande une ´etape c0: commande r´esiduelle s: ´etat m´emoireavant de calcul s0: ´etat m´emoireapr`es
err: erreur `a l’ex´ecution
R `egles de r ´eduction pour IMP
(cf. cours du 2019-11-28)(x:=a)/s→skip/s[x←[[a]]s] (skip;c2)/s→c2/s
(c1;c2)/s→(c01;c2)/s0 sic1/s→c01/s0 (c1;c2)/s→err sic1/s→err (ifbthenc1elsec2)/s→c1/s si[[b]]sest vrai (ifbthenc1elsec2)/s→c2/s si[[b]]sest faux
(whilebdoc)/s→skip/s si[[b]]sest faux (whilebdoc)/s→(c;whilebdoc)/s si[[s]]best vrai
(havocx)/s→skip/s[x←n] pour toutn (assertA)/s→skip/s si[[A]]sest vrai (assertA)/s→err si[[A]]sest faux
35
Suites de r ´eductions
Les comportements possibles d’une commandeccorrespondent
`a des suites de r´eductions pourc/s.
• Terminaison dans l’´etat finals0:r´eductions versskip/s0 c/s→c1/s1→ · · · →skip/s0
• Terminaison en erreur :r´eductions verserr c/s→c1/s1→ · · · →err
• Divergence :suite infinie de r´eductions c/s→ · · · →cn/sn→ · · ·
• Blocage : (ne se produit pas si la relation→est compl`ete)
c/s→c1/s1→ · · · →c0/s0 6→ avecc0 6=skip
Correction de la logique vis- `a-vis de la s ´emantique op ´erationnelle
L’interpr´etation intuitive des triplets :
{P}c{Q} la commandec, d´emarr´ee dans un
´etat initialssatisfaisantP, ne fait pas d’erreurs, et si elle termine, l’´etat final satisfaitQ
[P]c[Q] la commandec, d´emarr´ee dans un
´etat initialssatisfaisantP, termine toujours sans erreurs, et l’´etat final satisfaitQ
Est-ce vrai de toutes les ex´ecutions dec/spossibles d’apr`es la s´emantique op´erationnelle ?
37
Correction s ´emantique de la logique faible
Th ´eor `eme (Correction s ´emantique de la logique faible) Supposons{P}c{Q}. Soit s un ´etat m ´emoire tel que[[P]]s.
1. Sˆuret ´e : il est impossible que c/s→∗ err
2. Correction partielle : si c/s→∗ skip/s0, alors[[Q]]s0.
Nous allons esquisser plusieurs d´emonstrations. La premi`ere approche est inspir´ee par les d´emonstrations de sˆuret´e de syst`emes de types.
Correction s ´emantique de la logique faible
Lemme (Sˆuret ´e et pr ´eservation) Supposons{P}c{Q}et[[P]]s.
1. Sˆuret ´e imm ´ediate : c/s6→err
2. Pr ´eservation : si c/s→c0/s0, alors il existe une pr ´econdition P0telle que{P0}c0{Q}et[[P0]]s0.
D ´emonstration.
Par cas sur les r`egles de r´eductionc/s→. . .et par inversion sur la d´erivation de{P}c{Q}.
39
Correction s ´emantique de la logique faible
Le th´eor`eme de correction s´emantique s’ensuit facilement : 1. Sˆuret´e : supposonsc/s→∗ c0/s0 →err.
Par pr´eservation, il existeP0tel que{P0}c0 {Q}et[[P0]]s0. Par sˆuret´e imm´ediate,c0/s0 6→err. Contradiction.
2. Correction partielle : supposonsc/s→∗ skip/s0.
Par pr´eservation, il existeP0tel que{P0}skip{Q}et[[P0]]s0. Par inversion sur{P0}skip{Q}, on aP0⇒Q.
Donc,[[Q]]s0comme attendu.
L’arbre des r ´eductions
c/s c1/s1
...
err skip/s0
Une ex´ecution du programme = une branche de l’arbre.
Le programme termine toujours
= toutes les branches sont finies
= l’arbre peut ˆetre d´ecrit par unpr´edicat inductif.
41
La terminaison comme pr ´edicat inductif
Termc s Q:la commandecd´emarr´ee dans l’´etatstermine toujours, et l’´etat final satisfaitQ.
[[Q]]s Term skips Q
c6=skip c/s6→err (∀c0,s0, c/s→c0/s0 ⇒Termc0s0Q) Termc s Q
Ce pr´edicat ´etant inductif, il est faux si une s´equence infinie de r´eductions existe.
Correction s ´emantique de la logique forte
Le triplet s´emantique :si l’´etat initial satisfaitP, la commandec termine dans un ´etat satisfaisantQ
[[P]]c[[Q]] def= ∀s, [[P]]s⇒Termc s Q
On montre que cette d´efinition satisfait les axiomes et les r`egles d’inf´erences de la logique de Hoare :
• [[P]]skip[[P]]
• Si[[P]]c1[[Q]]et[[Q]]c2[[R]]alors[[P]]c1;c2[[R]]
• etc.
Th ´eor `eme (Correction s ´emantique de la logique forte) Si[P]c[Q]est d ´erivable, alors[[P]]c[[Q]]est vrai.
43
Des triplets s ´emantiques au lieu de triplets axiomatiques
De plus en plus d’auteurs font l’´economie d’axiomatiser les triplets[P]c[Q]et prennent directement la d´efinition s´emantique :[P]c[Q] def= [[P]]c[[Q]] def= ∀s, [[P]]s⇒Termc s Q Ils montrent alors les axiomes et les r`egles d’inf´erences de la logique de Hoare comme autant de lemmes sur cette d´efinition.
Cela permet alors de raisonner sur les programmes comme en logique de Hoare, mais de mani`ere s´emantiquement correcte par construction.
Ce n’est plus dans l’espritaxiomatiquede Hoare (1969), mais simplifie le formalisme et l’ajout de r`eglesa posteriori.
Des triplets s ´emantiques pour la logique faible
Peut-on suivre la mˆeme approche pour la logique faible ? Oui, en remplac¸ant le pr´edicatTermc s Qpar un pr´edicat Safec s Qqui dit que les ex´ecutions dec/sne terminent pas en erreur, et que si elles terminent alors l’´etat final satisfaitQ.
{{P}}c{{Q}} def= ∀s, [[P]]s⇒Safec s Q
45
Une d ´efinition coinductive de
SafeDe mˆeme que le pr´edicatTermest naturellement inductif, le pr´edicatSafeest naturellementcoinductif:
[[Q]]s Safe skips Q
c6=skip c/s6→err (∀c0,s0, c/s→c0/s0 ⇒Safec0s0Q) Safec s Q
Avec un pr´edicat coinductif, on peut avoir des d´erivations infinies en profondeur. DoncSafec s Qest vrai sic/sdiverge sans erreurs. (par application infinie de la 2er`egle)
Une d ´efinition
step-indexedde
SafeAu lieu de coinduction, on peut utiliser la technique du
comptage de pas(step indexing) :
Safec s Q def= ∀n,Safenc s Q
Le pr´edicat inductifSafenc s Qsignifie que les ex´ecutions dec/s ne font pas d’erreurdans lesnpremi`eres ´etapes d’ex´ecution, et satisfontQsi elles terminenten au plusn ´etapes.
Safe0 c s Q
[[Q]]s Safen+1skips Q
c6=skip c/s6→err (∀c0,s0, c/s→c0/s0 ⇒Safenc0 s0Q) Safen+1c s Q
47
Triplets s ´emantiques pour la logique faible
Tant avec la d´efinition coinductive deSafequ’avec la d´efinition step-indexed, le triplet faible s´emantique
{{P}}c{{Q}} def= ∀s, [[P]]s⇒Safec s Q
satisfait les axiomes et les r`egles de la logique de Hoare faible :
• {{P}}skip{{P}}
• Si{{P}}c1{{Q}}et{{Q}}c2{{R}}alors{{P}}c1;c2{{R}}
• Si{{P∧b}}c{{P}}alors{{P}}whilebdo c{{P∧ ¬b}}
• etc.
Correction s ´emantique de la logique faible
Il en d´ecoule une autre d´emonstration de la correction s´emantique de la logique faible :
Th ´eor `eme (Correction s ´emantique de la logique faible) Si{P}c{Q}est d ´erivable, alors{{P}}c{{Q}}est vrai.
D ´emonstration.
Par r´ecurrence sur la d´erivation de{P}c{Q}.
49
Liens avec la s ´emantique :
compl ´etude de la logique
La compl ´etude d’une logique de Hoare
La r´eciproque de la correction s´emantique :
Toute propri´et´e vraie des ex´ecutions d’un programme c peut-elle ˆetre exprim´ee comme un triplet{P}c{Q}et d´eriv´ee en logique de Hoare ?
`A l’aide des triplets s´emantiques, on peut poser la question plus pr´ecis´ement :
Si{{P}}c{{Q}}, peut-on d´eriver{P}c{Q}? Si[[P]]c[[Q]], peut-on d´eriver[P]c[Q]?
50
Logique de Hoare et calculabilit ´e
La question de la compl´etude a ´et´e beaucoup ´etudi´ee dans les ann´ees 1970 en raison du lien suivant entre logique de Hoare et calculabilit´e :
Corollaire (de la correction s ´emantique)
Si{ > }c{ ⊥ }est d ´erivable, alors c ne termine pas.
Si la logique de Hoare ´etait compl`ete, on aurait une ´equivalence : { > }c{ ⊥ }est d´erivablesi et seulement sicne termine pas.
Incompl ´etude de la logique pour un langage Turing-complet
Rappel : l’ensemble des ´enonc´es d´erivables dans un syst`eme d’axiomes et de r`egles estr´ecursivement ´enum´erable (r.e.).
L’ensemble des triplets{P}c{Q}d´erivables est donc r.e.
L’ensemble des triplets{ > }c{ ⊥ }d´erivables est donc r.e.
(enfiltrantl’´enum´eration de tous les triplets).
Si la logique est compl`ete, l’ensemble des programmescqui ne terminent pas est donc r.e.
Par cons´equent, si la logique est compl`ete, le probl`eme de l’arrˆet est d´ecidable !
52
Une analyse du probl `eme
P⇒P0 {P0}c{Q0} Q0 ⇒Q {P}c{Q}
Que signifient les pr´emissesP⇒P0etQ0 ⇒Q?
• Implications d´erivables dans une logique formelle.
L’ensemble de ces implications est r.e., donc{P}c{Q}est r.e., et la logique est incompl`ete.
• Implications vraies (dans tous les mod`eles).
Alors{P}c{Q}n’est pas r.e. et la logique est compl`ete (transparents suivants).
Compl ´etude relative
(Stephen A. Cook,Soundness and completeness of an axiom system for program verification, SIAM J. Comput., 1978)
On peut montrer que la logique de Hoare est compl`ete si la mˆeme logiqueambianteest utilis´ee
• pour interpr´eter les implicationsP⇒P0,Q0 ⇒Qdans la r`egle de cons´equence ;
• pour d´efinir le triplet s´emantique
{{P}}c{{Q}}def= ∀s, [[P]]s⇒Safec s Q.
54
Plus faible pr ´econdition s ´emantique
On d´efinit la plus faible pr´econdition s´emantique (weakest (liberal) precondition) de la commandecavec postconditionQ:
wpsemc Q def= λs.Safec s Q Par d´efinition du triplet s´emantique, on a
{{P}}c{{Q}} si et seulement si P⇒wpsemc Q Lemme (la plus faible pr ´econdition s ´emantique est d ´erivable) {wpsemc Q}c{Q}est d ´erivable en logique de Hoare.
D ´emonstration.
R´ecurrence surcetinversionssur le pr´edicatSafe, p.ex.
Safe(c1;c2)s QimpliqueSafec1s(wpsemc2Q).
Compl ´etude relative
Th ´eor `eme (compl ´etude relative)
Si{{P}}c{{Q}}est d ´emontrable dans une logique L,
alors{P}c{Q}est d ´erivable dans la logique de Hoare utilisant la logique L pour les implications de la r `egle de cons ´equence.
D ´emonstration.
Par hypoth`ese{{P}}c{{Q}}, on aP⇒wpsemc Q.
Par le lemme, on peut d´eriver{wpsemc Q}c{Q}. On conclut{P}c{Q}par la r`egle de cons´equence.
56
Vers l’automatisation :
un calcul des plus faibles
pr ´econditions
La v ´erification d ´eductive (rappel)
Programme Assertions
logique
de programmes Conditions de
v´erification
d´emonstration manuelle, automatique, ou interactive OK / alarme
Comment engendrer les conditions de v´erification ? Comment minimiser la quantit´e d’assertions `a fournir ?
57
Programmes compl `etement annot ´es
{0≤a} ⇒ {a=b·0+a ∧ 0≤a} r:=a;
{a=b·0+r ∧ 0≤r} q:=0;
{a=b·q+r ∧ 0≤r} while r≥b do
{a=b·q+r ∧ 0≤r ∧ r≥b} ⇒ {a=b·(q+1) + (r−b) ∧ 0≤r−b} r:=r−b;
{a=b·(q+1) +r ∧ 0≤r} q:=q+1
{a=b·q+r ∧ 0≤r} done
{a=b·q+r ∧ 0≤r ∧ r<b} ⇒ {q=a/b ∧ r=amodb}
Conditions de v´erification : les ´etapes⇒o `u on applique la r`egle de cons´equence.
R ´eduire la quantit ´e d’annotations `a fournir
Pour v´erifier un sous-programmec, il suffit de fournir
• la pr´econditionP
• la postconditionQ
• un invariant de boucleInvpour chaque boucle dansc. Les autres assertions logiques et les conditions de v´erification s’obtiennent alors par calcul deplus faibles pr´econditionsou de plus fortes postconditions.
59
Plus faible pr ´econdition
La plus faible pr´econdition (weakest precondition) d’une commandecavec postconditionQest une assertionwpc Q telle que
• c’est une pr´econdition :[wpc Q]c[Q];
• c’est la plus faible : si[P]c[Q]alorsP⇒wpc Q. Par cons´equent :
[P]c[Q] si et seulement si P⇒wpc Q
Intuition : les hypoth`eses n´ecessaires pour que le codeccalcule bien le r´esultat d´ecrit par la postconditionQ.
Intuition originale (Dijkstra, 1975) : synth´etiser le codecpar raffinement `a partir de sa postconditionQ.
Autres
transformateurs de pr ´edicats
Plus faible pr´econdition lib´erale wlpc Q
(weakest liberal precondition) Commewpmais ne garantit pas la terminaison :
{P}c{Q} si et seulement si P⇒wlpc Q Plus forte postcondition (lib´erale) spP c slpP c
(strongest (liberal) postcondition) [P]c[Q] si et seulement si spP c⇒Q
{P}c{Q} si et seulement si slpP c⇒Q Intuition : ex´ecution symbolique dec `a partir d’un ´etat satisfaisantP.
61
Calculer la plus faible pr ´econdition
Une caract´erisation non effective :wlpc Q=W
{P| {P}c{Q}}
Pour les programmes sans boucles, une d´efinition r´ecursive surc: wlp skipQ=Q
wlp(x:=a)Q=Q[x←a]
wlp(c1;c2)Q=wlpc1(wlpc2Q)
wlp(ifbthenc1elsec2)Q= (b∧wlpc1Q)∨(¬b∧wlpc2Q) wlp(havocx)Q=∀n, Q[x←n]
wlp(assertA)Q=A∧Q (Les mˆemes ´equations sont valides pourwp.)
Plus faible pr ´econdition lib ´erale pour une boucle
Non calculable en g´en´eral :wlp(whilebdoc)Q=WiPi avecP0 =¬b∧QetPi+1=b∧wlpc Pi.
On demande au programmeur d’annoter chaque boucle par son invariantInv. Alors :
wlp(whileInv bdoc)Q=Inv
`a condition que
b∧Inv⇒wlpc Inv et ¬b∧Inv⇒Q
Pour calculerwp, il faut aussi annoter la boucle par le variant qui en garantit la terminaison.
63
Un semi-algorithme de v ´erification d ´eductive
Pour v´erifier{P}c{Q}, supposant annot´ees les boucles dec: 1. Calculerwlpc Qet les conditions de v´erificationvcc Q:
vc(whileInv bdoc)Q= (b∧Inv⇒wlpc Inv)
∧(¬b∧Inv⇒Q)
∧vcc Inv vc skipQ=>
vc(c1;c2)Q=vcc1(wlpc2Q)∧vcc2Q et de mˆeme pour les autres constructions du langage.
2. D´emontrer(P⇒wlpc Q)∧vcc Q, qui est une formule de logique usuelle, `a l’aide d’un d´emonstrateur automatique.
Calculer et v ´erifier la plus forte postcondition lib ´erale
Pour m´emoire, les ´equations pourslp: slpPskip=P
slpP(x:=a) =∃x0,x=a[x←x0]∧P[x←x0] slpP(c1;c2) =slp(slpP c1)c2
slpP(ifbthenc1elsec2) =slp(b∧P)c1∨slp(¬b∧P)c2 slpP(whileInv bdoc) =¬b∧Inv
slpP(havoc x) =∃x0,P[x←x0] slpP(assertA) =A∧P
et les conditions de v´erification non triviales :
vcP(whileInv bdoc) = (P⇒Inv)∧(sp(b∧Inv)c⇒Inv)
∧vc(b∧Inv)c vcP(assertA) =P⇒A
65
Point d’ ´etape
Point d’ ´etape sur la logique de Hoare
Un formalisme tr`es riche.
Deux visions compl´ementaires :
• La vision axiomatique : les r`egles d´efinissent le langage.
• La vision op´erationnelle : les r`egles sont des th´eor`emes qui facilitent le raisonnement sur les ex´ecutions des
programmes.
S’´etend assez facilement `a de nombreusesstructures de contrˆole (goto,break,return, exceptions, proc´edures, . . . ).
Quid desstructures de donn´ees? (→prochain cours)
66
Bibliographie
Bibliographie
Deux pr´esentations de la logique de Hoare :
• H. R. Nielson et F. Nielson,Semantics with Applications : an appetizer, Springer, 2007, ch. 9 et 10.
(Suit l’approche op´erationnelle.)
• G. Winskel,The Formal Semantics of Programming Languages, MIT Press, 1993, ch. 6 et 7.
(Suit l’approche axiomatique classique. Discussion tr`es compl`ete de la question de la compl´etude.)
M´ecanisations de la logique de Hoare :
• Le d´eveloppement Coq correspondant `a ce cours :
https://github.com/xavierleroy/cdf-program-logics
• T. Nipkow et G. Klein,Concrete Semantics, chap. 12.
67