Вы находитесь на странице: 1из 21

Les programmes corrects par construction

Stefano GHIGGINI, Imane HARTI, Erwann GENTRIC 18 Dcembre 2012

Contents
1 Introduction 1.1 1.2 Lapproche traditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le programme correct par construction . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 6 7 7 7 8 8 10 11 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 13 14 14 15 16 16 16 17 17 17 17 18 18

2 Les propositions et les prdicats 2.1 2.2 Calcul propositionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Calcul des prdicats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Les outils 3.1 3.2 Triplets et weakest pre-conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Premier exemple: problme du MAX 5 Invariants 5.1 5.2 La notion dinvariant

Invariants de boucle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6 Algorithme dEuclide 6.1 6.2 6.3 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Prsentation de lalgorithme

Drivation en programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 6.3.2 6.3.3 Pr conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cur du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Post conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6.4

Calcul du PPCM en utilisant un invariant . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.1 6.4.2 6.4.3 6.4.4 Pr conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cur du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtermination de linvariant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Post conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

7 Les langages de programmation 7.1 7.2 Eiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Langage /Mthode B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 19 19 20

8 Programmes corrects par construction pour lenseignement des mathmatiques

1
1.1

Introduction
Lapproche traditionnelle

An dintroduire la notion de programmes corrects par construction, nous avons choisi daborder le sujet avec un petit exemple de David Gries (The science of programming)[1]. Cela nous permettra de comprendre lintrt de construire des programmes corrects ds le dpart sans passer par la phase de dbogage. Supposons que, pendant le dveloppement dun nouveau logiciel, nous voulons crire un bout de code qui calcule le quotient q et le reste r de la division entre un nombre entier positif x par un autre nombre strictement positif y. La machine qui excutera le code ne fait pas les divisions entre entiers. Nous choisissons dcrire ce code sous la forme dune boucle qui soustrait y une copie de x plusieurs fois jusqu ce que le rsultat de la soustraction devienne ngatif. Notre langage nous permettra dcrire entre accolades {} des expressions boolennes qui permettent de vrier des conditions sur les valeurs des variables. En eet, quand le code en cours dexcution arrive sur une ligne comme telle, lexpression est value. Si elle est fausse, une trace du programme est imprime. Nous appellerons ces expressions prdicats. Soit le code suivant : { y > 0} r := x , q := 0 ; while r > y do begin r := r y ; q := q + 1 ; end ; {x = yq + r } Le code est test avec direntes valeurs de x et de y. Les rsultats semblent corrects jusqu ce que nous nous apercevions que pour le jeu de test x = 6 et y = 3, la valeur de q est 1 et celle de r est 3. Le reste est infrieur au diviseur. . . la condition de la boucle aurait du tre donc r y. Ceci nous permettra de rcrire le prdicat en rajoutant cette condition qui est plus forte que r > y. Le code amlior est donc :

{ y > 0} r := x , q := 0 ; while r >= y do begin r := r y ; q := q + 1 ; end ; { x = y q + r and r < y } Lalgorithme semble tre correct. un moment, la trace de lexcution nous montre un reste ngatif -2. La cause vient de la valeur errone de x en entre. Il ne faut pas que cette dernire soit ngative. Nous rcrivons donc les conditions en entre et en sortie de faon ce quelles soient plus restrictives. Lerreur xe, nous obtenons le code suivant : { x >= 0 and y > 0} r := x , q := 0 ; while r >= y do begin r := r y ; q := q + 1 ; end ; { x = y q + r and 0 <= r < y } A ce stade, nous entamons une rexion sur lapproche suivre pour dvelopper notre application: pouvons nous crire le code de manire moins ad-hoc? Par exemple, nous aurions pu entrer les conditions initiales et nales avant dcrire le code en lui mme. Par rapport la condition de boucle, aurait-il t possible de la dduire partir des spcications? Pour rpondre ces questions, nous remanierons le code en y rajoutant des conditions plus restrictives : { x >= 0 and y > 0} r := x , q := 0 ; { x >= 0 and y > 0 and x = y q + r } while r >= y do begin { r >= 0 and 0 < y <= r and x = y q + r } r := r y ; q := q + 1 ; { r >= 0 and 0 < y and x = y q + r } 5

end ; { x = y q + r and 0 <= r < y } En regardant ce code source, nous nous apercevons de la facilit avec laquelle nous dduisons la condition de boucle. A la n de lexcution, r doit tre strictement infrieur y (r < y). Si nous inversons cette proposition, nous trouvons la bonne condition r y. Ce type de dmarche nous aurait vits de commettre des erreurs dans lalgorithme initial. Si le code avait t dduit de faon rigoureuse partir des spcications trs prcises, nous aurions pu ne pas le corriger a maintes reprises et mme ne pas passer par la phase de dbogage. Pour ce, il faut tre capable de raisonner sur les prdicats et sur les programmes de faon mathmatique.

1.2

Le programme correct par construction

Un intressant aperu de la programmation correcte par construction est donn dans The correctness by construction approach to programming de D. Kourie et B. Watson[2]. Elle est dcrite avec les mots suivants : ... derive code from specications. Once a problem has been specied, a number of renement laws can be deployed to rene incrementally the specication. Each renement step adds more algorithmic information to the specication and can be proven to be a correct renementone that is consistent with the previous specication. Eventually a fully algorithmic specication of the original problem is attainted. The algorithm is guaranteed to be correct in the same sense that the proof of a mathematical theorem is guaranteed to be correct. Cet extrait met en vidence les concepts les plus importants comprendre pour matriser le sujet. Les spcications, sous forme de prdicats, sont le point de dpart pour tout programme. En y appliquant une srie de ranements, elles doivent, au fur et mesure, voluer vers une reprsentation plus proche de lalgorithme nal. Ces ranements doivent imprativement tre corrects par preuve. Si chaque tape est correcte, le rsultat nal sera correct par construction. Lanalogie avec les preuves mathmatiques est essentielle pour souligner la rigueur du raisonnement. Ce concept de programmation correcte par construction nest pas nouveau. Il est apparu au moment o les preuves de correction dun algorithme (que lon faisait aprs avoir crit le code) devenaient trop compliques et arrivaient une impasse. Cest dans les annes 80 que ce nouveau mouvement 6

de programmation correcte par construction sest dvelopp, avec lappui de certaines personnalits des plus connues dans les domaines de linformatique et des mathmatiques (Dijkstra, Hoare, Knuth, Wirth). Dijkstra tait le plus fervent dfenseur de cette approche qui tait selon lui la seule vritable manire de programmer : pour lui, le dveloppement logiciel existant ntait pas de la programmation, mais du bricolage qui permettait darriver tant bien que mal au rsultat (il a notamment quali le software engineering de How to program if you cannot).

Les propositions et les prdicats

Les ouvrages traitant le concept de programmation correcte par construction dcrivent galement les spcications dun programme de faon formelle. On y souligne limportance dun langage prcis et non ambigu pour spcier tous les tats dune machine. Avant daborder les notions de pr-condition et post-condition, Nous introduirons le calcul propositionnel et en particulier le calcul des prdicats.

2.1

Calcul propositionnel

Le calcul propositionnel est un langage formel bas principalement sur des propositions lies grce des connecteurs logiques. Une proposition est une expression bien forme qui peut tre soit Vraie soit Fausse. En liant plusieurs propositions entre elles grce des connecteurs logiques, nous pouvons en crer des nouvelles. Les valeurs de ces dernires dpendent des celles des propositions initiales. Les connecteurs logiques sont : la ngation (), lquivalence (<=>), la conjonction (), la disjonction () et limplication (=>). Une proposition peut tre en plus forme grce aux oprateurs relationnel (<, <=, >, >=, =, !=) et loprateur (appartient).

2.2

Calcul des prdicats

Le calcul des prdicats permet de raisonner sur les propositions par le biais de deux nouveaux oprateurs : les quanticateurs universels et existentiels.

le quanticateur universel permet de formuler des expressions de type x (P) (pour chaque x alors P). Cette expression est vraie si et seulement si P est vrai pour tous les objets x. le quanticateur existentiel permet de formuler des expressions de type x (P) (il existe x tel que p). Cette expression est vraie si et seulement si P est vrai pour un objet x

3
3.1

Les outils
Triplets et weakest pre-conditions

Le langage formel introduit ci-haut nous permettra de raisonner sur la notion dtat dune machine. Une pr-condition dun programme S est un prdicat qui dcrit ltat de la machine avant lexcution de S. Plus prcisment, quelles sont les valeurs des variables, utilises dans S avant son excution. De la mme faon, une post-condition est le prdicat dcrivant ltat de la machine aprs lexcution de S. Maintenant, nous avons toutes les notions pour introduire le concept de Triplet de Hoare. Un Triplet est form dune pr-condition, dun programme et dune post-condition. On le reprsentera de la faon suivante : {P } S {Q} o P est la pr-condition, S le programme et Q la post-condition. Cette notation doit tre interprte de la faon suivante: si P est value vraie avant lexcution de S, alors S terminera et Q sera vraie. Avec les Triplets de Hoare, nous pouvons spcier des problmes. Cest donc loutil adapt pour driver un programme correct par construction. Un premier exemple pour montrer ce concept est donn par le Triplet suivant: {P } Skip {P } Skip sexcute sans modier ltat de la machine. Si P est vrai avant lexcution de la commande, alors P le sera aussi aprs son excution. Nous donnerons une dnition plus formelle de Skip par la suite. Prenons un deuxime exemple: {x 0} y : S y 2 = x

Dans ce triplet, nous pouvons modier seulement la valeur de y (cette contrainte tant reprsent avec lexpression y : S). Supposons que nous avons une mthode qui compute la racine carre dun nombre positif. Une implmentation du programme S aurait pu tre la suivante : {x 0} y := x y2 = x

Ce triplet est une tautologie. Ce petit exemple illustre parfaitement lintrt dun triplet. A partir dune spcication de la forme {P} S {Q}, o S nest qu une reprsentation symbolique du programme, on dduit une instance de S qui transforme le triplet en une tautologie. Modions les spcications en : {x 0} x, y : S x = y y 2 = x Comme nous avons le droit de modier les valeurs de x et de y, une solution de ce problme aurait t : {x 0} x := 1; y := 1 x = y y 2 = x Il existe donc plusieurs implmentations dune spcication. Si nous reprenons le dernier exemple, un autre solution aurait t : {x 0} x := 0; y := 0 x = y y 2 = x Partons maintenant du triplet suivant, o la pr-condition nest pas spcie {P } y := x y2 = x

Nous nous apercevons facilement quil existe des pr-conditions P pour lesquelles la post-condition nest pas atteinte. Si par exemple x est ngatif avant lexcution du programme, alors la machine ne peut pas se retrouver nalement dans ltat dcrit par la post-condition, puisque la fonction racine carre nest pas dnie pour les nombres ngatifs. Cela nous pousse introduire la notion de weakest pre-condition. La weakest pre-condition dun programme S par rapport sa post-condition Q (note wp(S,Q)) est lensemble de tous le tats initiaux qui permettent la machine, aprs lexcution de S, de se trouver dans un tat qui satisfait la postcondition. Nous pouvons par exemple crire :

wp(x := x + 1, x < 5) = x < 4 Une pr-condition quelconque P serait moins gnrale que la wp. Dans lexemple que nous venons de montrer, x < 3 serait une pr-condition plus contraignante que x < 5. De manire quivalente, nous pouvons crire que toute pre-condition vrie P wp(S, Q). Grace la notion weakest pre-condition, nous pouvons donner une dnition formelle de Skip. Comme on avait dit, Skip ne modie pas ltat de la machine lors de son excution. Soit Q un prdicat qui dcrit une post-condition, nous pouvons le dnir comme suit : wp(Skip, Q) = Q Cela nous amne armer que : {Q} Skip {Q}est une tautologie. Quelque soit lensemble dtats dcrits par Q, ce triplet sera vrai. La commande Skip est la seule qui garantit cette proprit pour toute valeur du prdicat Q.

3.2

GCL

Pour pouvoir spcier un algorithme, Dijkstra a introduit un langage simple et complet, connu sous le nom de GCL (Guarded Command Language). Il est bas sur les lments suivants: Les commandes skip et abort. La commande skip a t introduite prcdemment. Il sagit dune commande vide car elle ne fait rien. Ltat de la machine ne varie pas aprs son excution. Une deuxime commande abort est utilise pour dcrire des comportements du code qui sont non prvisibles (par exemple des boucles innies) Les aectations := .Une aectation est une expression de type x := X o x est une variable et X est une expression du mme type que x. Un exemple daectation est x := x + 1, o la valeur de la variable de type entier x est incrmente de 1. Les aectations peuvent tre aussi multiples, comme dans x, y := y, x, o les valeurs de x et y sont substantiellement inverses. La composition ; . La composition permet denchainer deux segments de code (deux programmes) S1 et S2 nots S1; S2. Aussi, si il existe M tel que ({P } S1 {M }) ({M } S2 {Q})

10

Alors{P } S1; S2 {Q}. La composition permet donc de diviser un code en plusieurs segments pour faciliter sa manipulation. La slection if f i. La slection permet dcrire des expressions de type if G1 S1 G2 S2...Gn Sn f i O les Gi sont des prdicats (conditions) et les Si sont des commandes (ou compositions de commandes) en GCL. Lors de lexcution dune commande de slection, toute condition est teste et la bonne commande (celle qui correspond la condition vraie) est excute. Au minimum une condition doit tre value vraie. La rptition do od . La rptition est similaire la commande de slection, sauf que les conditions sont continuellement values (et les commandes correspondantes excutes) jusqu ce que aucune ne soit vraie. Elle est reprsente de la faon suivante : do G1 S1G2 S2...Gn Sn Do

Premier exemple: problme du MAX

Nous possdons maintenant tous les lments pour pouvoir dvelopper notre premier programme correct par construction. Nous choisissons, pour cette n, de rsoudre un problme assez classique et simple, le problme du max qui met en jeu deux entiers x et y. Nous souhaitons trouver le maximum entre ces deux entiers et aecter sa valeur une nouvelle variable z. S tant lalgorithme quon veut dduire, nous formalisons le problme avec la notation suivante {T } S {Q : z := max(x, y)} Avant de dvelopper S, il faut remplacer max avec sa dnition. Si la variable z contient le maximum entre x et y alors lexpression suivante est vraie : Q : z x z y (z = x z = y) A ce niveau, nous nous demandons quelles sont les commandes qui pourraient tre excutes pour pouvoir tablir Q. On choisit z := x car il apparat tre le plus naturel et le plus simple; nous crivons donc : wp(z := x, Q) = x x x y (x = x x = y) = T x y (T x = y) = x y Nous avons donc pu dduire une premire partie du code. La weakest pre-condition que nous venons de trouver est en fait utilise comme condition pour lexcution de la commande z := x 11

i f ( x >= y ) > z := x f i Ce premier programme excute notre tache condition quil ne sinterrompe pas. Actuellement,

lensemble des conditions dans la construction conditionnelle if f i ne couvre pas tous les tats dnis dans la pr-condition T . Il faut donc intgrer le code avec une nouvelle condition. Nous rptons donc les tapes avec z := y : wp(z := y, Q) = y x y y (y = x y = y) = y x T (y = x T ) = y x Et nous transformons le code en if fi Puisque au moins lune des deux alternatives est toujours vraie, nous pouvons armer que le programme quon vient de driver est le bon programme. Cette armation peut tre faite grce un thorme que nous ne dtaillerons pas dans notre prsentation. (Gries, 84). Grace cet exemple, nous remarquons que le point de dpart du dveloppement est la spcication sous la forme dun triplet (pr-condition, programme et post-condition). Le programme est progressivement amlior. Plusieurs tapes sont ncessaires pour arriver la solution nale, prouve correcte. La dduction est faite de manire rigoureuse, mais, comme nous pouvons voir, le programmeur choisit la commande z := x, et ensuite z := y dune faon intuitive. Comment pouvons-nous sassurer que ces choix sont corrects ? Une activit de testing peut nous aider non pas pour trouver des erreurs dans le code( puisque il est prouv tre correct) mais pour sassurer que notre choix a t bon . Ce concept est abord dans [Gries, 84] qui souligne que cette tache de testing ne doit pas tre appele debug, qui sous-entend la prsence derreur dans le code. ( x >= y ) > z := x ( y >= x ) > z := y

5
5.1

Invariants
La notion dinvariant

De manire gnrale, un invariant correspond une condition qui est toujours vraie. Un invariant peut sappliquer un programme entier ou une partie de celui-ci, comme par exemple les invariants de boucle. 12

Souvent, un invariant permet de prouver la correction du programme. Et de manire plus gnrale, Il permet de simplier un problme qui semblerait complexe priori. Prenons par exemple le problme suivant : on considre un jeu de dominos carr dont les cases extrmes dune diagonale sont limines. Le damier est bicolore noir / blanc, comme sur la gure suivante : Figure 1: Damier personnalis

La question est : Est-il possible de recouvrir entirement la surface de ce jeu de dominos laide de dominos ? (nous rappellons quun domino permet de couvrir 2 cases adjacentes) Nous pourrons tre tent de rsoudre ce problme en essayant toutes les combinaisons possibles... Cependant nous pouvons simplier en faisant remarquer linvariant suivant :

N ombreDeCasesBlanches=N ombreDeCasesN oires Ceci est valable quel que soit le nombre de cases recouvertes. Notre problme est donc directement rsolu. Pour tout recouvrir, il faudrait la n avoir 0 case blanche et 0 case noire, ce qui est impossible du fait de notre invariant. Ltablissement en dtail de linvariant est dtaille dans la partie suivante.

5.2

Invariants de boucle

Les invariants de boucle sont les plus frquents pour prouver la correction dun programme. En effet, ils permettent dtablir mathmatiquement que lalgorithme est juste en utilisant un raisonnement 13

par rcurrence. Reprenons lexemple prcdent. Nous avons tabli un peu brusquement linvariant N ombreDeCasesBlanches=N ombreDeCasesN oires. Nous allons ici le prouver de faon plus rigoureuse : Initialisation : Au dbut (jeu de dominos vide), nous avions si on compte : N ombreDeCasesN oires = N ombreDeCasesBlanches + 2

Preuve par rcurrence : Nous considrons qu un moment du jeu, nous avons N ombreDeCasesBlanches=N ombreDeCasesN oires. Nous rajoutons un domino pour couvrir le jeu. Celui-ci va couvrir une case blanche et une case noire, du fait de la disposition du jeu (cases adjacentes de couleur dirente). Nous avons donc aprs cela N ombreDeCasesBlanches=N ombreDeCasesN oires. Donc par rcurrence (initialisation + preuve tape N+1 partir de ltape N), nous avons tabli linvariant.

6
6.1

Algorithme dEuclide
Introduction

Lalgorithme dEuclide est un algorithme qui permet de dterminer le plus grand commun diviseur (PGCD) de deux entiers dont nous ne connaissons pas la factorisation. Cet algorithme utilise la division euclidienne. Nous allons prsenter lalgorithme de faon mathmatique. Par la suite, nous le driverons en programme (an dillustrer ainsi le principe de drivation des algorithmes). Dans un dernier temps, nous rajouterons cet algorithme le calcul du PPCM pour montrer lutilit des invariants. Nous nous basons dans cette partie sur la prsentation vido de cet algorithme, par M. Djikstra [3].

14

6.2

Prsentation de lalgorithme

Lalgorithme dEuclide se base sur la division euclidienne, ainsi que sur une des proprits concernant le PGCD : P GCD(a, b) = P GCD(b, a mod b) a mod btant le reste de la division euclidienne de a par b. Ainsi, le principe est de remplacer de manire itrative les nombre initiaux a et b par b et le reste de la division euclidienne de a par b, jusquau moment o lon arrivera un reste nul. La dernire valeur de b est le PGCD. Voici un schma illustrant cet algorithme[4] : Figure 2: Algorithme dEuclide

Pour complter la prsentation de cet algorithme, il faut prciser la faon dont est calcul le reste de la division euclidienne dun nombre a par un nombre b (avec a b ). Celle-ci se fait par soustractions

15

successives de b jusqu ce que le rsultat de la soustraction soit infrieur b. Dans ce cas, ce rsultat est le reste de la division euclidienne de a par b.

6.3

Drivation en programme

Maintenant que lalgorithme a t prsent, nous allons essayer de le prciser de faon mathmatique an de le driver en programme. Nous allons donc expliciter les pr conditions, post conditions ainsi que le cur du programme. 6.3.1 Pr conditions

Dans les pr conditions, nous devons numrer tout ce dont nous avons besoin en entre du programme : Les 2 nombres X et Y , entiers naturels non nuls dont nous voulons calculer le PGCD 2 autres nombres x et y entiers naturels non nuls, qui sont gaux au dbut du programme X et Y mais que nous allons faire varier pour implmenter lalgorithme Nous avons donc ceci : X, Y, x, y N , x = X, y = Y, P GCD(x, y) = P GCD(X, Y ) 6.3.2 Cur du programme

Pour implmenter ce programme, nous allons utiliser un invariant se basant sur la rgle suivante : Si a > b : P GCD(a, b) = P GCD(a b, b) Linvariant sera ici P GCD(x, y) = P GCD(X, Y ) Voici le cur du programme : ; do od ; Nous bouclons sur les instructions suivantes : Si x > y, on dcrmente x de y 16 x > y > x := x y y > x > y := y x

Si y > x, on dcrmente y de x Cela nous donne deux indications : P GCD(x, y)est toujours gal P GCD(X, Y ), cf rgle nonce prcdemment On sort de la boucle quand x = y 6.3.3 Post conditions

Les post conditions correspondent ltat dans lequel seront les variables initiales la n du programme : Xet Y nauront pas chang x=y P GCD(x, y) = P GCD(X, Y ) Les post conditions peuvent donc tre rsumes de cette faon : x = y = P GCD(X, Y ) Nous avons donc bien calcul le PGCD de X et Y . Nous pouvons noter la simplicit de ce programme par rapport la prsentation de lalgorithme, grce lutilisation dun invariant.

6.4

Calcul du PPCM en utilisant un invariant

Nous allons enrichir le programme prcdent pour calculer galement le PPCM de X et Y , cela va permettre dillustrer une fois de plus lutilisation dun invariant. 6.4.1 Pr conditions

Dans les pr conditions, nous allons rajouter les nombres entiers u et v tels que : u, v := X, Y . 6.4.2 Cur du programme

Le cur du programme sera modi de la faon suivante : ; do x > y > x := x y ; u := u + v y > x > y := y x ; v := v + u od ; Nous incrmentons u de v si x > y, et v de u si y > x. 17

6.4.3

Dtermination de linvariant

Au dbut du programme nous avons : x, y := u, v := X, Y . Lgalit 2XY = xv + yu est donc vraie. Lors dun tour de boucle, considrons cette galit comme vraie. Si x > y : x(n + 1) := x(n) y; u(n + 1) := u(n) + v Et on a : 2XY = x(n)v + yu(n) Do : 2XY = v (x(n + 1) + y) + y (u(n + 1) v) 2XY = v x(n + 1) + vy + y u(n + 1) yv 2XY = x(n + 1) v + y u(n + 1) Nous pouvons eectuer le mme raisonnement dans le cas y > x. Par rcurrence, nous avons prouv linvariant 2XY = xv + yu . 6.4.4 Post conditions

Nous avons vu que les post-conditions pouvaient scrire ainsi : x = y = P GCD(X, Y ) . Nous allons appliquer ces valeurs notre invariant : 2XY = P GCD(X, Y ) (v + u) XY /P GCD(X, Y ) = (u + v)/2 Or nous connaissons cette proprit liant le PGCD au PPCM : XY /P GCD(X, Y ) = P P CM (X, Y ) Donc nous avons bien russi calculer le PPCM de X et Y , qui correspond la n du programme la valeur (u + v)/2 .

Les langages de programmation

Toutes les notions introduites ci hauts ont t mis en pratique sur des langages de programmation. On prsentera par la suite deux dentre eux.

18

7.1

Eiel

Eiel est un langage orient objet n en 1986. Il comprend des caractristiques comme lhritage de type et la programmation par contrat design by contract. Cette dernire sappuie sur les notions de pr/post condition et dinvariants. Lide est dintgrer dans le langage un formalisme qui permet de spcier les interactions entre tous les composantes dun logiciel. Les spcications ne permettent pas donc de dvelopper avec preuve des programmes corrects. Lobjectif etant plutt dorir les bonnes bases pour les activits de debug et de testing [5]. Eiel intgre donc dans le code: Les pr-conditions introduites par le mot-cl require Les post-conditions introduites par le mot-cl ensure Les invariants introduits par le mot-cl invariant. Ils doivent tre satisfaits par chaque instance de la classe chaque fois quelle est extrieurement accessible Lors de la compilation dun programme en Eiel, le dveloppeur spcie quelles sont les assertions quil souhaite tester durant la phase dbogage

7.2

Langage /Mthode B

B est une mthode ne dans les annes 80 . Elle montre comment la programmation correcte par construction peut tre utilise pour le dveloppement de logiciels critiques. Cette mthode est mise en oeuvre dans le domaine des transports. Par exemple, le systme de contrle de la ligne 14 du Mtro de Paris [6] est gnr partir du langage B. Ce projet a t eectivement ecace et sans bug de 1998 2007. B couvre tout le cycle de dveloppement dun logiciel. partir dun cahier de charges, on rednit le modle en question jusqu lobtention dune implmentation cohrente avec les spcications. Comme la programmation correcte par construction, les preuves de correction sont faites tout au long du dveloppement du logiciel. Chaque ranement ajoute des dtails aux spcications jusqu aboutissement la solution nale. La notion de base de la mthode est celle de la machine abstraite [7], qui sappuie sur les outils quon a prsent ci-haut: les variables, les oprations et les invariants. Les variables sont les donnes utilises dans les programmes, et sont lies la notion dtat dune machine quon a introduit ci-haut. 19

Les invariants sont les prdicats qui dnissent les proprits garanties lors de lexcution dun programme. Les oprations sont les services proposs par les machines. Les pr-conditions sont les tats que la machine abstraite doit satisfaire avant lexcution dune opration. Les direntes itrations ralises sur le modle abstrait permettent dobtenir un modle concret dcrit dans un langage proche des langages de programmation tel que C, Ada etc. Un traducteur peut donc gnrer une implmentation dans un de ces langages derniers.

Programmes corrects par construction pour lenseignement des mathmatiques

Les mathmatiques ont trois piliers : problmes, preuves, structures. La faon avec laquelle elles sont enseignes ne permet peut-tre pas aux tudiants de dvelopper leur capacit de raisonnement. En eet, les preuves sont introduites dune faon intuitive et non rigoureuse (les thormes sont souvent dlivrs sans explicitation dtaille). Linformatique (computer science) peut par contre amliorer lenseignement des mathmatiques avec trois autres piliers (logique formelle, algorithmes, les preuve calcules). La systmatisation des formes de raisonnement amliorerait la faon avec laquelle sont enseignes les preuves dans les cours de mathmatiques[8]. Lutilisation des jeux (puzzle par exemple) ou les dirents scnarios denseignement (dterminer pr post conditions, invariant) sont aussi dexcellentes mthodes pour familiariser les mathmatiques aux tudiants.

20

References
[1] David Gries, The Science Of Programming, Springer, 1981 [2] D. Kourie B. Watson,The Correctness by Construction Approach to Programming, Springer, 2012 [3] E. Dijkstra, Newcastle University Lecture, http://www.youtube.com/watch?v=WLoruWBYbRM, 1992 [4] Wikipdia , Algorithme dEuclide, http://fr.wikipedia.org/wiki/Algorithme_d%27Euclide [5] Eiel.com, Design By Contract In Detail, http://www.eiel.com/developers/design_by_contract_in_detail.html [6] T. Safety Lecomte Critical T. Servat Railway G. Pouzancre, Systems, Formal Methods In

http://www.methode-b.com/wp-

content/uploads/2012/08/Formal_methods_in_safety_critical_railway_systems.pdf [7] Ludovic Casset, Construction Correcte de Logiciels pour Carte Puce,

http://www.atelierb.eu/pdf/theseLudovic.pdf, 2002 [8] J. F. Ferreira A. Mendes R. Backhouse et al, Which Mathematics for the Information Society ?, Springer, 2009

21

Вам также может понравиться