Programmation, partiel: sémantique d un tableur Recommandations. Votre copie (papier ou électronique) devra être lisible et bien structurée. La note tiendra compte autant du fond que de la présentation. D autre part, vous devrez justifier toutes vos affirmations, soit par une preuve soit par un contre-exemple. (Ces recommandations sont bien sûr valables dans tout devoir.) Vous connaissez sans doute Excel, ou son équivalent Open Source OpenOffice.org Calc. (Sinon, vous pouvez télécharger la suite OpenOffice.org ce n est ni utile ni nécessaire pour le devoir.) Il s agit d un tableur, c est-à-dire un logiciel permettant de faire des calculs sur une grille rectangulaire. Voici à quoi ceci peut ressembler : L illustration ci-dessus représente une grille fictive servant à un professeur à attribuer des notes à des élèves. (Leurs noms apparaissent dans la colonne A. Il est inutile de chercher une ressemblance quelconque avec des élèves existants ou ayant existé.) Chaque case de la grille, appelée cellule : est repérée par ses coordonnées : par exemple la cellule sélectionnée dans l illustration cidessus est la cellule D5 ; a un contenu, qui peut être soit : une constante (1 dans l exemple de la cellule D5 ci-dessus) soit une formule. Par exemple, la cellule N19 contient la formule : =SUM(B19:M19) (Les formules se distinguent des constantes en ceci qu elles commencent par le signe =.) Chaque cellule a finalement une valeur : la valeur de la constante qu elle contient si tel est le cas, ou le résultat du calcul de la formule qu elle contient sinon. Dans l exemple ci-dessus, la cellule N19 a pour valeur celle de la formule =SUM(B19:M19), c est-à-dire la somme des valeurs des cellules B19 à M19. Pour indication, toutes les cellules de la colonne N contiennent des formules, et par exemple la cellule N2 contient la formule 1
=SUMPRODUCT(B2:M2;B19:M19) qui énonce que l on obtient sa valeur comme la somme des produits terme à terme des vecteurs B2 M2 et B19 M19. (Dans l exemple, chaque cellule de B2 à M2 donne la note d Assurancetourix à chaque question, normalisée à une valeur entre 0 et 1, et la ligne de B19 à M19 donne les coefficients respectifs de chaque question.) Nous formaliserons la sémantique d un tableur simplifié comme suit. D abord, nous supposerons que le domaine des valeurs est R, plus un symbole spécial Err. De même, nous supposerons que les constantes sont les réels (mais pas Err). Les formules sont construites comme les expressions de la forme = F, où F est définie par la (pseudo-)grammaire suivante : F ::= C cellule F + F somme de deux expressions if(f 1 = x; F 2 ; F 3 ) test, conditionnelle (x R) SUM(R) sommation de région SUMPRODUCT(R, R ) sommation de produits de régions R ::= C : C région délimitée par deux cellules C ::= m n colonne, ligne (m, n N) A noter que les colonnes c sont ici formalisées comme des numéros de colonnes plutôt que des lettres, comme dans l exemple. On peut penser à identifier A à 1, B à 2, etc. : ce n est pas essentiel, et ceci nous simplifiera la tâche plus loin. Toujours dans un souci de simplification, nous n avons pas listé toutes les formules possibles fournies par Excel ou OpenOffice.org Calc. A tout moment, la grille est dans un état G, qui est une fonction de N N vers R {Err} : G(i, j) est la valeur de la cellule en colonne i et ligne j. NB : on notera (i, j) le couple i, j, et si c est un tel couple, G(c) dénotera G(i, j). On définit les fonctions de sémantique suivantes, qui évaluent respectivement les formules, les régions, les cellules, les colonnes, les lignes : F C (G) = G(C C ) C m n = (m, n) F F + F (G) = F F (G) + F F (G) F F 2 (G) si F F 1 (G) = x F if(f 1 = x; F 2 ; F 3 ) (G) = F F 3 (G) si F F 1 (G) x, Err Err sinon F SUM(R) (G) = i 1 m i 2 G(m, n) R C : C = (C C, C C ) j 1 n j 2 où R R = ((i 1, j 1 ), (i 2, j 2 )) 0 a i 2 i 1 G(i 1 + a, j 1 + b).g(i 1 + a, j 1 + b) F SUMPRODUCT(R, R 0 b j 2 j 1 ) (G) = si i 2 i 1 = i 2 i 1 et j 2 j 1 = j 2 j 1 Err sinon où R R = ((i 1, j 1 ), (i 2, j 2 )) R R = ((i 1, j 1), (i 2, j 2)) On conviendra que Err + x = x + Err = Err dans la sémantique de +, SUM, et SUMPRODUCT. On notera que, dans le cas de if ci-dessus par exemple, x dénote une constante réelle (pas une variable, notamment). 1. Quels sont les types des fonctions F F (où F est une formule), R R (R région), C C (C cellule)? A titre d exemple, F F est de type (N N R {Err}) R {Err}, c est-à-dire prend un état G en entrée et retourne une valeur. Pour chaque constante x ou formule = F, on pose x (G) = x, = F (G) = F F (G). Une feuille est l équivalent d un programme dans un tableur, et est la donnée de constantes ou de formules pour chaque cellule de la grille. Formellement, une feuille est donc une fonction ϕ de N N vers l ensemble formé de l union disjointe des constantes (dans R) et des formules. Nous 2
supposerons toujours que ϕ(i, j) est la constante 0 pour tout couple (i, j) sauf pour un nombre fini une feuille, comme un programme, est un objet fini. On définit une relation binaire ϕ d évolution en une étape de l état G dans la feuille ϕ, par : G ϕ G si et seulement s il existe i, j N tels que ϕ(i, j) (G) G(i, j), et G = G[(i, j) ϕ(i, j) (G)]. La notation G[(i, j) V ] désigne l état qui à tout indice (m, n) différent de (i, j) associe G(m, n), et à (i, j) associe V. 2. Expliquez intuitivement, mais précisément, la relation d évolution en une étape ϕ. 3. On dit qu un état G est stable (pour ϕ) si et seulement si G(i, j) = ϕ(i, j) (G) pour tous i, j N. On définit une sémantique naturelle comme dans le cours par les deux règles : G stable pour ϕ (F in) ϕ G = G ϕ G = G fin ϕ G = G fin G ϕ G (Stb) Montrer que, si ϕ G = G fin est dérivable, alors G fin est stable. Terminaison 4. Montrer qu une feuille ne termine pas toujours. Autrement dit, trouver une feuille ϕ et un état G tels que ϕ G = G fin ne soit dérivable pour aucun état G fin et démontrez-le. 5. Pour une cellule C = m n, on pose u(c) = (m, n), et pour une région R = C : C, on pose U(R) = {(m, n) N N i 1 m i 2, j 1 n j 2 }, où (i 1, j 1 ) = u(c), (i 2, j 2 ) = u(c ). On définit l ensemble des cellules utilisées par une formule F, par récurrence sur la taille de F, comme suit : U(C) = {u(c)} U(F + F ) = U(F ) U(F ) U(if(F 1 = x; F 2 ; F 3 )) = U(F 1 ) U(F 2 ) U(F 3 ) U(SUM(R)) = U(R) U(SUMPRODUCT(R, R )) = U(R) U(R ) Montrer que la valeur d une formule F ne dépend que des cellules utilisées par F. Autrement dit, montrer que pour tout couple d états G et G tels que G(i, j) = G (i, j) pour tout (i, j) U(F ), F F (G) = F F (G ). 6. Supposons (juste pour cette question) que pour tout (i, j) N N, pour tout (m, n) U(ϕ(i, j)), on a m i et n < j, ou m < i et n j (ce qu on notera (m, n) < (i, j)). Montrer qu une telle feuille ϕ termine, en partant de n importe quel état G, au sens où, comme ci-dessus, on peut dériver un jugement de la forme ϕ G = G fin pour un certain état G fin. Déterminisme 7. Montrer que (contrairement aux langages que l on a vu en cours), la sémantique des feuilles n est pas déterministe. Autrement dit, trouver une feuille ϕ et un état G tels que l on puisse dériver (au moins) deux jugements ϕ G = G fin1 et ϕ G = G fin2 avec G fin1 G fin2. 8. Supposons maintenant que pour tous (i 1, j 1 ) et (i 2, j 2 ) dans N N, (i 1, j 1 ) U(ϕ(i 2, j 2 )) et (i 2, j 2 ) U(ϕ(i 1, j 1 )). Montrer que si G ϕ G 1 et G ϕ G 2 alors il existe un état G 3 tel que G 1 ϕ G 3 et G 2 ϕ G 3. 9. En déduire que, sous les hypothèses de la question 8, une telle feuille ϕ est déterministe, c est-à-dire que si ϕ G = G fin1 et ϕ G = G fin2 alors G fin1 = G fin2. 3
Graphes de contrôle Finalement, on va comparer l expressivité du langage des feuilles avec un langage du style de C. On considère le langage suivant, que nous appellerons D. Les expressions sont (par souci de simplicité de nouveau) : e ::= x e + e Les instructions (ou programmes) sont de la forme : c ::= l x = e affectation l x = a affectation d une constante (a R) l skip ne rien faire c; c séquence l if(e == 0) c else c conditionnelle l while(e! = 0) c boucle while où l N est une étiquette, servant à repérer où nous en sommes dans l exécution du programme. Nous supposerons que chaque étiquette apparaît au plus une fois dans un programme donné. Les affectations l x = e et l x = a sont distinguées dans un unique but : faciliter les développements techniques ci-dessous. On peut donc par exemple y écrire des programmes comme le programme (Ex) suivant : 1 u = 1; 2 v = 1; 3 res = 1; 4 i = n; 5 while (i! = 0) { 6 res = res + i; 7 i = i + v} Notons que toute instruction c a une étiquette de départ c, définie par ( l x = e) = ( l x = a) = ( l skip) = ( l if(e == 0) c else c ) = ( l while(e! = 0) c) = l et (c; c ) = c. On appelle graphe de contrôle G tout graphe orienté (chaque arc du graphe va d un sommet (source) à un autre (cible)) et étiqueté chaque arc est muni d une garde, obéissant à la syntaxe : et d un effet, obéissant à la syntaxe : g ::= e == 0 e! = 0 f ::= x = e x = a (Dans les deux cas, dénote l absence, de garde ou d effet selon le cas.) On notera un tel arc s f g t, où s est la source et t la cible. Le graphe de contrôle d un programme c, noté CG(c), est construit comme suit. D abord, les sommets de CG(c) sont les étiquettes présentes dans c, plus une autre étiquette notée l. Ensuite, l ensemble des arcs de CG(c) est défini comme E(c, l ), où : E( l x = e, l ) = { l x=e E( l x = a, l ) = { l x=a E( l skip, l ) = { l l } l } l } E(c; c, l ) = E(c, c ) E(c, l ) E( l if(e == 0) c else c, l ) = { l E( l while(e! = 0) c, l ) = { l e==0 e==0 l, l c, l e!=0 10. Dessiner le graphe de contrôle du programme (Ex). e!=0 c } E(c, l) c } E(c, l ) E(c, l ) 4
On définit la sémantique opérationnelle d un couple (G, l ), où G est un graphe de contrôle G = (V, E) et l V V est un ensemble fini de sommets, et V est un quadruplet (s, g, f, t) avec s, t V, g une garde, et f un effet comme suit. Les jugements sont de la forme ρ l ρ, et énoncent que partant d un sommet l dans un environnement ρ, on peut atteindre le sommet (final) l en un nombre fini d étapes, et avec un environnement final ρ. (F in) ρ l ρ l f g l E ρ = g fx f ρ l ρ (Arc) ρ l ρ où l on définit le jugement auxiliaire ρ = g par : (T rue) ρ = et où fx f ρ est défini par : e ρ = 0 (==) ρ = e == 0 e ρ 0, Err (! =) ρ = e! = 0 fx ρ = ρ fx x = e ρ = ρ[x e ρ] fx x = a ρ = ρ[x a] (Je ne donnerai pas l intuition, ce sera à vous de la comprendre.) On définira la sémantique d un programme c écrit en D par : ρ c ρ si et seulement si ρ c ρ est dérivable dans la sémantique ci-dessus de (CG(c), l ). 11. Montrer que la sémantique des programmes est déterministe : dans un graphe de contrôle CG(c), pour tout sommet l, si ρ l = ρ 1 et ρ l = ρ 2 alors ρ 1 = ρ 2. 12. La sémantique des graphes de contrôle (pas seulement de ceux de la forme CG(c)) est-elle déterministe? Autrement dit, peut-on montrer que dans un graphe (G, l ), si ρ l = ρ 1 et ρ l = ρ 2 sont dérivables, alors ρ 1 = ρ 2? D et les tableurs On propose de traduire tout programme c 0 écrit en langage D, ou plutôt tout graphe de contrôle G 0, en une feuille ϕ comme suit. (Je ne donnerai pas l intuition ici non plus.) Nous supposerons que, comme ci-dessus, les sommets de G 0 sont des numéros. Ensuite, on numérote chaque variable x : soit n x le numéro de x. On demande que si x et y sont deux variables distinctes, alors n x n y. De même, on numérote chaque constante a apparaissant dans une affectation de constante l x = a de G 0 (dans une garde) : soit n a le numéro de a, où l on suppose de nouveau que si a a alors n a n a. Par souci de lisibilité, posons A = 0, B = 1, C = 2. Ceci permettra d écrire des cellules sous la forme A5, B9, Cn ou Al (n, l N) au lieu de l écriture plus maladroite 0 5, 1 9, 2 n ou 0 l. Ensuite, on pose : (Flôt de données) pour chaque variable x, on définit ϕ(1, n x ) comme suit. Soient l1 x = e 1,..., lm x = e m, lm+1 x = a 1,..., lm+p x = a p les affectations (resp, affectations de constantes) modifiant x dans les gardes du graphe G 0. Alors ϕ(1, n x ) est la formule : = if(a0 = l 1 ; ê 1 ; if(a0 = l 2 ; ê 2 ;... if(a0 = l m ; ê m ; if(a0 = l m+1 ; Cn a1 ; if(a0 = l m+2 ; Cn a2 ;... if(a0 = l m+p ; Cn ap ; Bn x )...)))...)) où pour chaque expression e, ê est la formule obtenue en remplaçant chaque variable x par la cellule Bn x. 5
(Flôt de contrôle) En énumérant tous arcs de G 0 : l 1 f 1 g 1 l 1, l 2 f 2 g 2 l 2,..., l q f q g q l q, on définit ϕ(0, 0) (le contenu de la cellule A0) comme la formule : = if(a0 = l 1 ĝ 1 ; l 1; if(a0 = l 2 ĝ 2 ; l 2;... if(a0 = l q ĝ q ; l q; A0)...)) où pour chaque garde g, on pose if(f ĝ; F 2 ; F 3 ) égal à : if(f ; F 2 ; F 3 ) si g = if(f ; if(ê = 0; F 2 ; F 3 ); F 3 ) si g est de la forme e == 0 if(f ; if(ê = 0; F 3 ; F 2 ); F 3 ) si g est de la forme e! = 0 (Constantes) pour chaque constante a du graphe G 0, on pose ϕ(2, n a ) = a. 13. Pour tout environnement ρ (donnant des valeurs aux variables du langage D), et toute étiquette l, posons G l ρ l état (du tableur) défini par G l ρ(0, 0) = l, G l ρ(1, n x ) = ρ(x) pour tout variable x, G l ρ(2, n a ) = a pour chaque constante a du graphe G 0, et G l ρ(i, j) = 0 dans les autres cas. Montrer que si l on peut dériver ρ l ρ dans la sémantique du couple graphe de contrôleétiquette (G 0, l), alors on peut dériver ϕ G l ρ G l ρ dans la sémantique du tableur, où ϕ est construit ci-dessus. 14. L état G l ρ de la question précédente est-il stable? 15. La feuille ϕ construite ci-dessus est-elle déterministe? 16. Expliquer pourquoi le résultat de correction de la question 13 est strictement plus faible que ce que l on voudrait. En d autres termes, pourquoi la feuille ϕ ne calcule-t-elle pas en réalité la même chose que le graphe de contrôle G 0? 6