Probleme – D'autres règles d'inférence : prouver un programme
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 28 — Déduction naturelle
Énoncé
Le programme note qu'« on peut également présenter d'autres utilisations de règles d'inférence pour raisonner ». On applique le formalisme du chapitre à la correction des programmes. Un triplet se lit : « si est vraie avant l'exécution de , et si termine, alors est vraie après ».
- Écrire les règles d'inférence de l'affectation, de la séquence, et de la boucle.
- Démontrer, par un arbre, la correction partielle du programme de sommation ci-dessous.
- Établir sa correction totale.
- Qu'est-ce qui, dans cette présentation, est exactement la déduction naturelle, et qu'est-ce qui en diffère ?
int s = 0;
int i = 1;
while (i <= n) { s = s + i; i = i + 1; }
/* on veut : s == n * (n + 1) / 2 */Corrigé
1. Les règles. Elles s'écrivent exactement comme celles du chapitre — une barre, des prémisses au-dessus, une conclusion au-dessous.
La règle de l'affectation se lit à l'envers, et c'est sa difficulté : pour que soit vraie après , il faut que où l'on a remplacé par soit vraie avant. Ainsi .
2. La correction partielle. On pose l'invariant
et le gardien . Trois pas.
Initialisation. Après s = 0; i = 1;, on a et , donc , et dès que . L'invariant est établi. Formellement, deux applications de aff enchaînées par seq, puis conséq pour passer de la précondition à la forme substituée.
Conservation. Il faut s = s + i; i = i + 1; . En remontant depuis par la règle de l'affectation, appliquée deux fois de droite à gauche : Posons , de sorte que .
\dfrac{\mathcal{U} \qquad \mathcal{V}}% {\{s + i = \sigma(i{+}1)\}\ s := s{+}i\,;\ i := i{+}1\ \{s = \sigma(i)\}}\ \textsf{seq}
Il reste à vérifier , qui est de l'arithmétique : donne . Et la borne assure . Une application de conséq conclut.
Sortie. La règle boucle donne , c'est-à-dire et . Avec de l'invariant, on obtient , d'où
Le programme a été compilé et exécuté avec ces trois assertions posées dans le code, pour à : les cas passent, et .
3. La correction totale demande la terminaison, que la logique de Hoare ci-dessus ne donne pas : la règle boucle suppose qu'on sorte. On ajoute un variant : l'entier . Il est positif tant que le gardien tient ( donne ), et il décroît strictement de à chaque tour puisque croît de . Une suite d'entiers positifs strictement décroissante est finie : la boucle fait exactement tours.
4. Ce qui est identique, et ce qui diffère.
Identique : la forme. Des règles à prémisses et conclusion, des dérivations qui sont des arbres, une lecture de bas en haut guidée par la forme du but, et une preuve de correction par induction sur la dérivation. Tout le vocabulaire du chapitre s'applique tel quel — et c'est ce que le programme entend par « d'autres utilisations de règles d'inférence pour raisonner ».
Différent : les objets. Les séquents du chapitre relient des formules entre elles ; les triplets relient une formule, un programme et une formule. Et surtout, la règle conséq contient deux implications et qui ne sont pas démontrées par ce système-ci : ce sont des énoncés d'arithmétique, renvoyés à une autre théorie. La logique de Hoare n'est pas close sur elle-même, là où la déduction naturelle propositionnelle l'est.
Ce que ce problème referme. Le chapitre chap:algo-prog demandait, pour chaque algorithme, une spécification, un invariant, un variant et une complexité. On voit ici que ces quatre exigences ne sont pas une convention de rédaction : l'invariant est la prémisse de la règle boucle, le variant est ce qui manque à cette règle pour donner la terminaison, et la spécification est le triplet lui-même. Le formalisme que le chapitre 3 imposait sans le nommer est celui-ci.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.