3 Calcul de plus petite précondition
Définition 3.1 (Plus petite précondition). Soit s un programme et φ une assertion. On suppose que toute
boucle while (e) do s
0
de s est décorée d’un invariant I ∈ A, décoration que l’on note while
I
(e) do s
0
.
La plus petite précondition de φ pour s, notée wp
?
(s, φ), est définie inductivement comme suit :
wp
?
(skip, φ) , φ wp
?
(abort, φ) , >
wp
?
(x ← e, φ) , φ[x ← e] wp
?
(s
1
; s
2
, φ) , wp
?
(s
1
, wp
?
(s
2
, φ))
wp
?
(if (e) then s
1
else s
2
, φ) ,
(e =⇒ wp
?
(s
1
, φ)) ∧ (¬e =⇒ wp
?
(s
2
, φ))
wp
?
(while
I
(e) do s, φ) ,
I
∧ ∀m. (e ∧ I =⇒ wp
?
(s, I))
∧ ∀m. (¬e ∧ I =⇒ φ)
Theorème 3.2. Il est toujours vrai que |= {wp
?
(s, ψ)} s {ψ}. Notamment, si |= φ =⇒ wp
?
(s, ψ),
alors |= {φ} s {ψ}.
Démonstration. On prouve par induction sur s que |= {wp
?
(s, ψ)} s {ψ}. On ne détaille que le cas pour
la boucle while, les autres cas étant immédiats. Supposons que s = while
I
(e) do s
0
et soit m t.q.
m |= wp
?
(s, φ). Notons que de cette dernière propriété, nous avons que |= e ∧ I =⇒ wp
?
(s, I) et
|= ¬e ∧ I =⇒ φ. Nous voulons montrer que JsK(m) |=
⊥
φ. Si JsK(m) = ⊥, alors JsK(m) |=
⊥
φ par
définition et la preuve est finie. Sinon, par le Lemme 1.6, il existe un n ∈ N t.q. JsK(m) = J(s
0
)
n
K(m),
J(s
0
)
n
K |= ¬e et ∀p < n. J(s
0
)
p
K(m) |= e. Nous prouvons par induction sur n que J(s
0
)
n
K |= φ. Si n = 0,
alors m |= ¬e. De plus, de m |= wp
?
(s, φ), on a m |= I et nous savons que |= ¬e ∧ I =⇒ φ. Ainsi,
m |= φ. Si maintenant n = p + 1 > 0, alors par hypothèse d’induction interne, J(s
0
)
p
K(m) |= I. Posons
m
p
, J(s
0
)
p
K(m). Par hypothèse sur n, nous savons également que m
p
|= e. Ainsi, de |= e ∧ I =⇒
wp
?
(s, I), nous obtenons que m
p
|= wp
?
(s
0
, I). Par hypothèse d’induction externe, nous obtenons que
Js
0
K(m
p
) |= I, i.e. que J(s
0
)
n
K(m) |= I. Par définition de n, J(s
0
)
n
K(m) |= ¬e. Ainsi, de |= ¬e ∧ I =⇒ φ,
nous avons J(s
0
)
n
K(m) |= φ, ce qui termine l’induction interne et le cas pour while — nous avons prouvé
que JsK(m) |=
⊥
φ.
4 Travail à faire
On vous demande de
1. Définir en Coq la syntaxe du langage
While — le langage des expressions pourra
être laissé abstrait en prenant n’importe
quelle fonction de mem dans int, i.e. du type
des mémoires dans le type des entiers relatifs.
2. Définir en Coq la sémantique des pro-
grammes de While. On pourra dans un pre-
mier temps axiomatiser la théorie des c.p.o.
3. Définir En Coq la notion de validité et de
provabilité pour Hoare — une assertion sera
alors une fonction de mem dans Prop.
4. Démontrer en Coq le Théorème 2.3.
5. Définir en Coq une fonction wp qui cal-
cule la plus petite précondition d’une asser-
tion φ pour un programme s. Cette dernière
échouera dans un premier temps lorsque s
comporte une boucle.
6. Démontrer en Coq que votre fonction wp de
calcul de plus petite précondition est correcte,
i.e. le Théorème 3.2.
7. Définir en Coq une syntaxe pour les asser-
tions et leur interprétation en tant qu’asser-
tion logique. Écrire une fonction wps qui cal-
cule la plus petite précondition d’une asser-
tion syntaxique φ pour un programme s.
8. Comme pour wp, montrer que wps est cor-
recte. On pourra se ramener à la preuve de
correction de wp.
9. Concevoir un mécanisme permettant de don-
ner les invariants de boucle nécessaires au
calcul de plus petite précondition pour les
boucles. Étendre vos fonctions wp et wps en
conséquence, ainsi que leurs preuves de cor-
rection.
4