HAL Id: hal-02101782
https://hal-lara.archives-ouvertes.fr/hal-02101782 Submitted on 17 Apr 2019
HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.
V. Mounier, Gil Utard
To cite this version:
V. Mounier, Gil Utard. Axiomatic Semantics of Data-Parallel Languages; Automatization of Programs Verification. [Research Report] LIP RR-1993-08, Laboratoire de l’informatique du parallélisme. 1993, 2+48p. �hal-02101782�
LIP
Institut IMAGUnité de recherche associée au CNRS n°1398
Semantique axiomatique des langages a
parallelisme de donnees
automatisation de la preuve de
programmes
Laurent Mounier Gil Utard Mars1993ResearchRep ort N o
93-08
Ecole Normale Supérieure de Lyon
46, Allée d’Italie, 69364 Lyon Cedex 07, France, Téléphone : + 33 72 72 80 00; Télécopieur : + 33 72 72 80 80;
Adresses électroniques :
parallelisme de donnees
automatisation de la preuve de programmes
LaurentMounierGilUtard
Mars 1993
Abstract
We give a Hoare-like proof system for the data-parallel language L, and we present
an automatic tool to aid program correctness proof. After recalling L's operational
semantics, we dene an axiomatic semantics. We illustrate proof of L programs with
two examples. Then we extend our semantics to weakest precondition, and we deduce techniques for mechanizing program verication from Gordon's veri cation condition method. We prove its correctness, and we present an implementation of this method in theCentaur system.
Keywords:
data-parallel languages, axiomatic semantics, weakest precondition, program veri-cation, program verication tools,CentaurResume
Nous presentons un systeme de preuve a la Hoare pour le langage a parallelisme de donnee L, ainsi qu'une automatisation possible de la preuve de programmes. Dans un
premier temps nous denissons une semantique axiomatique deL, apres un rappel de sa
semantique operationnelle. Nous illustrons son application a la preuve de programmes sur deux exemples, dont un non trivial. Ensuite, apres avoir etendu notre semantique aux pre-conditions les plus faibles, nous deduisons une mecanisation de la preuve de programmes inspiree des veri cation conditions de Gordon. Nous prouvons alors sa cor-rection. Nous presentons enn son implementation sous l'atelier semantiqueCentaur.
Mots-cles:
langages a parallelisme de donnees, semantique axiomatique, pre-conditions les plus faibles, preuve de programmes, outils d'aide a la verication de programme,Centaurautomatisation de la preuve de programmes
Laurent Mouniery
etGil Utard
LIP-IMAG, URA CNRS 1398, ENS Lyon 46 Allee d'Italie, F-69364 Lyon Cedex 07, France
Email:Gil.Utard@lip.ens-lyon.fr Mars 1992
Table des matieres
1 Le langage
L2
1.1 Description informelle du langage : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3
1.2 Semantique operationnelle : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3
1.3 Restrictions sur les programmes consideres: : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6
2 Semantique axiomatique
7
2.1 Langage d'assertion: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8
2.2 Substitutions : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13
2.3 Quelques equivalences utiles : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 14
2.4 Le systeme de preuve: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 16
3 La semantique axiomatique comme outil de programmation
18
3.1 Une preuve complete de programme : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18
3.2 Conception d'un programme dirigee par sa preuve : : : : : : : : : : : : : : : : : : : : : : : : 22
3.2.1 Approche abstraite : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22
3.2.2 Implementation: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 25
3.3 Discussion : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 27
4 Automatiser la preuve de programmes
L29
4.1 Une strategie automatisable pour generer des preuves : : : : : : : : : : : : : : : : : : : : : : 29
4.2 Calcul des plus faibles preconditions : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 31
4.3 Calcul desveri cationconditions : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 35
5 Un environnement d'aide a la preuve automatique
39
5.1 Architecture generale: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 40
5.2 Mise en uvre sousCentaur : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 42
5.3 Mise en uvre sousHol : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 43
5.4 Discussion : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 45
6 Conclusions
45
Ce travail a ete soutenu par le Programme de Recherches Coordonnees du CNRSC
3et le contrat DRET 91/1180. yNouvelle adresse : LGI-IMAG, BP 53 X, 38041 Grenoble Cedex France. Email :
Introduction
Dans le domaine du calcul intensif, le grand de de cette n de siecle est d'atteindre et d'exploiter des puissances de calculs de l'ordre du Teraops (1012 operations ottantes par seconde). Les
constructeurs de calculateurs nous promettent de fournir de telles capacites par le biais du pa-rallelisme massif. Mais de la diversite et de la complexite des machines qui nous sont, et seront, proposees na^t un autre probleme: comment exploiter rapidement et a moindre co^ut toutes ces nou-velles architectures? La solution consiste a fournir un modele de programmation unique a toutes ces machines, a l'aide de langages de programmation adequats.
Le parallelisme de donnees semble ^etre un bon candidat, il rallie la plupart des surages, comme le prouve la denition de la norme HPF 18]. Bouge 7] souligne que ce modele n'est pas une vision restreinte des architectures paralleles, mais doit ^etre considere comme une discipline de programmation, comme pour l'introduction de la structure de contr^ole while dans les langages
sequentiels.
Jusqu'a present, les langages a parallelisme de donnees ont ete peu etudies d'un point de vue formel. Notre travail tente de combler ce vide a partir de la denition d'un langage representatif minimal : le langage L 6]. La denition d'une semantique operationnelle precise a permis
d'etu-dier 4]:
{ l'expressivite de L par rapport aux langages reels tels que
C
,Mpl ou Pompc, c'est-a-direque toutes structures de contr^ole de ces derniers sont exprimables dans notre langage cible { la validation des processus de compilation de ces dernieres.
Nous allons maintenant etudier une autre semantique de L visant la preuve de programmes:
la semantique axiomatique 23], dite encore ((logique de Hoare)). Plus orientee vers l'utilisateur de
part sa nalite, nous allons nous interesser plus particulierement a son emploi comme outil de genie logiciel pour le developpement et la preuve de programmes.
Dans un premier temps nous rappellerons la denition du langage L, ainsi que sa semantique
axiomatique associee. Nous illustrerons sur deux exemples sa mise en uvre pour prouver, et surtout pour aider la derivation de programmes. Apres avoir introduit la notion de pre-condition la plus faible, nous denirons une methode pour automatiser partiellement la preuve de programmes. Nous terminerons en presentant une implantation de cette methode dans l'atelier logiciel Centaur.
1 Le langage
LLe langageLa ete propose par Bouge 6] pour orir une plate-forme d'etude des langages
data-paralleles. L'objectif est de disposer d'un langage qui soit a la fois susamment simple pour pouvoir en decrire les aspects semantiques de facon exhaustive, mais egalement susamment expressif pour que les resultats obtenus puissent ^etre etendus aux structures de contr^ole presentes dans les langages data-paralleles reels, comme
C
,Mpl ou encorePompc. On ne decrit pas ici le modele d'executionsous-jacent qui est associe a L, et qui est directement inspire des architectures de types simd:
une unite de contr^ole centralisee diuse de maniere synchrone les instructions du programme a un ensemble de processeurs qui les executent ou non selon leur activite (le contexte), chaque processeur traitant des donnees propres. Une description plus detaillee de ce modele peut ^etre trouvee dans 6] On donne la denition du langageLqui a eteadoptee dans la suite en presentant tout d'abord la
syntaxe de ses instructions, ainsi que leur signication informelle, puis en en donnant une semantique operationnelle precise. On termine alors cette section en proposant une ((forme normale)) qui a ete
1.1 Description informelle du langage
Pour des raisons de simplicite, on supposera que les variables des programmes appartiennent a un seul type de donnees, les vecteurs d'entiers de dimension 1, et on les notera a l'aide d'identicateurs ecrits en majuscule. Par suite, la valeur locale au processeur
u
d'une variable paralleleX
, qui represente lau
ecomposante de ce vecteur, sera notee (X
)ju. Enn, des expressions parallelespeuvent ^etre construites sur ces variables a l'aide des operateurs arithmetiques et logiques usuels. Ces expressions sont locales, c.-a-d. qu'il n'est pas possible de faire reference a des composantes dierentes dans une expression. En reprenant le modele de machine abstrait simd precedemment cite, cela signie que l'evaluation d'une expression pour un processeur ne fait aucune reference aux valeurs detenues par un autre processeur. Le seul moyen d'acceder aux valeurs des autres processeurs est d'eectuer une instruction de communication explicite auparavant.
On donne les dierentes instructions du langage L que l'on va considerer dans la suite, en
precisant leur signication informelle :
Aectation:
X
:=E
L'expression
E
est evaluee localement par chacun des processeurs actifs, sa valeur a l'adresseu
ne depend que des valeurs a l'adresseu
des variables qui la composent, la valeur obtenue est alors aectee a leur composante de la variable paralleleX
.Communication globale :
getY
fromA
intoX
Chaque processeur actif
u
aecte a sa composante locale du vecteurX
la valeur de la compo-sante deY
situee sur le processeur d'adresseA
ju, ouA
est une expression donnee. On supposeque les composantes de
A
qui correspondent a des processeurs actifs contiennent toutes des adresses correctes.Composition sequentielle :
S
T
Les instructions
S
etT
sont executees en sequence, de maniere synchrone, par l'ensemble des processeurs.Iteration:
whileB
doS
endL'ensemble des processeurs actifs executent le programme
S
tant que l'un d'entre eux au moins evalue l'expression booleenne vectorielleB
a vrai. L'instruction se termine donc quand tous les processeurs actifs evaluentB
a faux.Conditionnement:
whereB
doS
endL'ensemble des processeurs actifs qui evaluent l'expression booleenne vectorielle
B
a faux sont rendus inactifs pendant toute l'execution du programmeS
. L'activite des autres processeurs est inchangee.1.2 Semantique operationnelle
Nous presentons brievement une semantique operationnelle ((a la Plotkin)) pour le langage L,
qui est inspiree de 4].
L'objectif d'une telle semantique est de decrire formellement, a partir de la syntaxe d'un pro-gramme, les transitions eectuees par une machine abstraite qui executerait ce programme.
Confor-mement au modele d'execution sous-jacent que l'on considere pour L, les etats de cette machine
abstraite sont des triplets de la formeh
S s
i.{
S
represente la partie du programme restant a executer (la continuation). La continuation vide est notee .{ represente la fonction environnement, qui associe une valeur a chacune des variables du programme:
:
V AR
!V AL
ou
V AR
etV AL
designent respectivement les domaines des noms et des valeurs des va-riables des programmes L. Notons que, les variables paralleles etant des vecteurs d'entiersde dimension 1, l'ensemble choisi pour
V AL
est l'ensemble des fonctions des entiers dans les entiers.On designera par
env
l'ensemble des environnements.{
s
represente l'activite de chacun des processeurs (ou le contexte), qui est modie lors de l'execution d'une instruction where. Du fait de l'imbrication possible de ces instructions,s
est represente par une pile de vecteurs booleens, telle queTop
(s
)ju=vrai
si et seulement si leprocesseur
u
est actif dans l'etat considere. On designera parctxte
l'ensemble des contextes.Dans la suite, on utilisera egalement les notations suivantes.
{ La pile de contexte vide est notee
"
. Elle represente l'activite des processeurs au debut du programme, et l'on supposeTop
("
) =vrai
.{ Pour tout processeur
u
, le predicatactif
(u
) represente l'activite du processeuru
:actif
(u
)(Top
(s
)ju=vrai
){ La fonction est implicitement etendue aux expressions paralleles: pour toute expression parallele
E
, qui contient ou non des variables libres, on note (E
) la valeur (parallele) deE
, et (E
)ju la valeur deE
locale au processeuru
.{ Parmi les expressions paralleles, on distingue la constante parallele
This
ou pour chaque composanteu
, on a (This
)ju=u
.{ Pour tout environnement , on note
X
V
], l'environnement obtenu a partir de enremplacant la valeur (
X
) par la nouvelle valeurV
:8
Y : X
6=Y
)X
V
](Y
) = (Y
)X
V
](X
) =V
{ Pour tout ensemble d'etatsE
C
env
ctxte
, on notepr
e(respectivementpr
c) la projectionde E
C
dansenv
(respectivementctxte
).Il reste alors a donner pour chaque instruction L, la transition correspondante eectuee par la
machine abstraite:
Aectation:
h
X
:=E s
i;!h 0s
avec: { 0(
X
) ju= (E
)ju siactif
(u
) { 0(X
) ju= (X
)jusi :actif
(u
) { 0(Y
) ju= (Y
)ju siY
6=X
Communication generale:
hget
Y
fromA
intoX s
i;!h 0s
i avec: { 0(X
) ju= (Y
)j (A)j u siactif
(u
) { 0(X
) ju= (X
)jusi :actif
(u
) { 0(Y
) ju= (Y
)ju siY
6=X
.Composition sequentielle :
hS s
i;!hS
0 0s
0 i hS
T s
i;!hS
0T
0s
0 i hS s
i;!h 0s
0 i hS
T s
i;!hT
0s
0 iIteration:
8u :
(actif
(u
) ) :( (B
)ju)) hwhileB
doS
ends
i;!hs
i 9u :
(actif
(u
) ^ (B
)ju)hwhile
B
doS
ends
i;!hS
whileB
doS
ends
iCes deux regles indiquent bien que tant qu'il existe un processeur actif qui verie la condition de boucle, le corps de celle-ci est execute. La pile de contexte n'est, quant a elle, pas modiee.
Conditionnement:
La nouvelle activite, qui correspond au vecteur booleen
Top
(s
)^ (B
), doit ^etre empilee surla pile des contextes
s
. Pour conserver une trace des blocs conditionnels, on utilise egalement la nouvelle construction syntaxiquebeginS
end:hwhere
B
doS
ends
i;!hbeginS
ends
0i
avec
s
0=Push
(Top
(s
)^ (
B
)s
):
Les regles suivantes indiquent alors que le programme
P
est execute jusqu'a sa terminaison eventuelle, et que l'ancien contexte est ensuite restaure a la sortie du bloc en depilant la piles
:h
S s
i;!hS
0
0s
0 ihbegin
S
ends
i;!hbeginS
0end
0s
0 iPour completer cette description formelle du langage, on denit egalement la fonction
S
]], qui, pour tout programmeS
et pour tout environnement et contexte initial (s
), retourne le resultat de l'execution deS
, lorsqu'il existe (c.-a-d. lorsqueS
termine).Denition 1-1
Pour tout programme
S
, et, pour tout environnement et contexte (s
):S
]](s
) =f(0
s
0)jh
S s
i;! h 0s
0ig
Par abus de notations, nous etendons la fonction
S
]] aux ensembles d'etats, c.-a-d. si:E
C
env
ctxte
on a:S
]](EC
) =f( 0s
0 )j9(s
)2EC:
hS s
i;! h 0s
0 igOn a alors les resultats suivants, qui seront utilises par la suite:
Proposition 1-1
Pour tout environnement 2
env
et contextes
2ctxte
on a:X
:=E
]](s
) = f(X
V
]s
)gou
V
est denie comme suit:V
ju= (E
)ju siactif
(u
)V
ju= (X
)jusi :actif
(u
)get
Y
fromA
intoX
]](s
) = f(X
V
]s
)gou
V
est denie comme suit:V
ju= (Y
)j (A)ju siactif
(u
)V
ju= (X
)jusi :actif
(u
)S
1S
2]](s
) =S
2]](S
1]](s
)) whereB
doS
end]](s
) = f( 0s
) j 0 2pr
e(S
]](Push
(Top
(s
)^ (B
)s
)))g whileB
doS
end]](s
) = (s
) si : 8u:actif
(u
)) : (B
)juwhile
B
doS
end]](s
) =S
whileB
doS
end]](s
)si : 9
u:actif
(u
)^ (B
)juNotons que, le langageL etant deterministe, le cardinal de ces ensembles est au plus de un.
1.3 Restrictions sur les programmes consideres
La methode de preuve qui est proposee dans ce rapport a ete appliquee a un sous-ensemble du langage L par rapport a celui presente dans la section 1.1. On decrit ici les hypotheses qui
sont eectuees sur les programmes que l'on considere dans la suite, puis on montre comment ces restrictions peuvent ^etre levees.
On introduit tout d'abord les notations suivantes :
{ Pour tout programme
S
, on designe parChange
(S
) l'ensemble des variables qui peuvent ^etre modi ees lors de l'execution deS
. Il s'agit donc des variables qui apparaissent en partie gauche d'une aectation ou dans une instruction de communication.{ Pour toute expression
E
, on designe parV ar
(E
) l'ensemble des variables qui apparaissent dansE
.On designe alors par
Pgm
un sous-ensemble des programmes en L qui satisfont la denitionsuivante.
Denition 1-2
Un programme
T
de L est dit a contexte xe si pour toute instruction ((whereB
doS
end)) deT
, on a:Change
(S
) \V ar
(B
) =En d'autres termes, cette contrainte signie que les variables de
T
qui apparaissent dans une expression de conditionnement ne sont pas modiees dans le corps du sous-programmeS
qui est conditionne. Notons qu'il est possible de determiner statiquement si un programmeLdonne satisfaitou non cette contrainte.
Le motif de cette restriction est qu'elle permet de simplier de facon notable le systeme de preuve qui decrit la semantique axiomatique de de L, en supprimant notamment la notion d'equivalence
de contexte 23]. Par suite, les preuves mises en uvre pour etablir la correction d'un programme sont plus simples que dans le cas general, et leur automatisation s'en trouve egalement facilitee. En outre, il est possible de montrer qu'un programme
P
qui n'est pas a contexte xe peut toujours ^etre transforme en un programmeP
0qui la satisfait. L'idee intuitive de cette transformation est deremplacer dans
P
chaque instructionwhere
B
doS
endtelle que
Change
(S
) \V ar
(B
)6=, par la sequence d'instruction:B
0:=
B
whereB
0do
S
endou
B
0 est une nouvelle variable.Cette transformation peut ^etre justiee formellement a l'aide d'une notion d'equivalence de programme 4] denie a partir de la semantique operationnelle.
Enn, Le Guyadec et Virot 16] ont recemment propose une modication du systeme de preuve dans laquelle cette transformation est codee de maniere simple a l'aide d'une regle d'inference. L'automatisation que nous decrivons dans la suite pourrait ^etre adaptee a ce systeme de preuve, et elle deviendrait donc ainsi applicable a un programme Lquelconque.
2 Semantique axiomatique
Nous rappelons dans cette section la semantique axiomatique proposee dans 23] pour le langage
L. L'objectif d'une telle semantique est de fournir un systeme de preuve, similaire a la ((Logique
de Hoare)) des langages sequentiels, qui permet d'inferer statiquement des assertions sur le
com-portement d'un programme au cours de son execution, et a terme de prouver qu'un programme est correct. Plus precisement, la ((Logique de Hoare)) se presente de la facon suivante: soient un
programme
S
et deux predicatsP
etQ
qui decrivent les valeurs d'entree et de sortie des variables manipulees parS
(autrement dit sa speci cation). Le but est de prouver que, si celles-ci verientP
avant l'execution deS
, et siS
termine, alors elles verientQ
apres l'execution. On note alors cette proprietefP
gS
fQ
g, ouP
est appele precondition, etQ
postcondition.Toutefois, dans le cas d'un programme data-parallele, la diculte principale vient du fait que le comportement du programme se deduit non seulement des valeurs successives prises par ses variables, mais egalement des changements d'activites des processeurs de la machine sous-jacente. Pour resoudre ce probleme, la solution proposee dans 23] consiste a denir les assertions comme etant des couples constitues de deux composantes distinctes :
{ une partie etat, representee par une proposition logique sur les valeurs des variables du pro-gramme
{ une partie contexte, representee par expression booleenne parallele qui permet de deduire l'activite des processeurs.
Cette forme d'assertions en deux parties est aussi employee dans les travaux de Gabarro et Ga-valda 11], mais la partie contexte est alors un ensemble d'entiers denotant explicitement les pro-cesseurs actifs.
Par suite, les proprietes denies par notre systeme de preuve seront de la forme:
f
P C
gS
fQ D
gou
S
est un fragment de programme et fP C
g et fQ D
g des assertions (P
etQ
decrivant desetats,
C
etD
des contextes).Nous presentons plus en details les deux langages qui denissent ces assertions, puis nous don-nons le systeme de preuve associe au sous-ensemble du langage L que nous considerons dans la
suite.
2.1 Langage d'assertion
On note
Etat
etContexte
les langages dedies respectivement aux parties etat et contexte des assertions. On decrit successivement la syntaxe et la semantique de ces deux langages.Syntaxe
On denit tout d'abord quatre types d'expressions sur lesquels seront construits les langages
Etat
etContexte
, et qui sont respectivement :{ les expressions arithmetiques et logiques scalaires, notees
Sarith
etSbool
{ les expressions arithmetiques et logiques vectorielles, noteesV arith
etV bool
.Concretement, le langage
Etat
sera deni comme un ensemble de formules quantiees construites surSbool
, et le langageContexte
sera constitue des expressionsV bool
.Les expressions
Sarith
,Sbool
,V arith
etV bool
sont decrites par la grammaire suivante:Sarith
::=c
x
V arith
jSarithSarith Binop Sarith
Sbool
::= true falseV bool
jSarith :Sbool
Sarith Rel Sarith
Sbool Connect Sbool
V arith
::=C
X
V arith
jVarithV arith Binop V arith
IF
V bool
THENV arith
ELSEV arith
V bool
::= TRUEFALSE
:
V bool
V arith Rel V arith
V bool Connect V bool
dans lesquelles :
{
c
(resp.C
) denote une constante entiere scalaire (resp. parallele dontThis
) {x
(resp.X
) denote une variable entiere scalaire (resp. parallele){
V arith
jSarith (resp.V bool
jSarith) represente la composante d'indiceSarith
de l'expressionparallele
V arith
(resp.V bool
){
Binop
est un ensemble d'operateurs arithmetiques:Binop
::= +j;jjdiv
jmod
j:::
{
Rel
est un ensemble d'operateurs de comparaison:Rel
::= =j6=j<
j>
jj:::
{
Connect
est un ensemble de connecteurs logiques :Connect
::= ^ j _ j)j,j:::
On denit alors un ensemble
Sform
de formules quantiees surSbool
:Sform
::=Sbool
Sform Connect Sform
:
Sform
8x : Sform
9x : Sform
dans lequel
x
designe une variable entiere scalaire. Finalement, la syntaxe des assertions est la suivante:Assertion
::= fEtat Contexte
gEtat
::=Sform
Contexte
::=V Bool
Semantique
Le domaine choisi pour interpreter les assertions et celui des entiers de l'arithmetique de Peano, ce qui correspond en fait a l'interpretation usuelle des symboles arithmetiques.
Pour decrire formellement la semantique de notre langage d'assertions, il convient tout d'abord d'etendre aux variables scalaires la notion d'environnement denie dans la section 1.2. Plus pre-cisement, on considere dans la suite qu'un environnement associe une valeur scalaire (c.-a-d. un entier) a chaque variable scalaire de type
var
, et une valeur parallele (c.-a-d. une fonction des entiers dans les entiers) a chaque variable parallele de typeV AR
.On a donc:
:
(
var
!entier
V AR
!(entier
!entier
)On donne tout d'abord la semantique des expressions, en introduisant une fonction
E
]]( ), qui, etant donne une expressionE
et un environnement , retourne la valeur deE
dans . Le type de son resultat depend donc du type de l'expression evaluee. Formellement :]] : 2 6 6 6 4
Sarith
Sbool
V arith
V bool
3 7 7 7 5 ;! 0 B B B @env
;! 2 6 6 6 4entier
fvraifaux
gentier
;!entier
entier
;!fvraifaux
g 3 7 7 7 5 1 C C C ALa fonction ]] est denie recursivement sur la structure des expressions, en distinguant une interpretation entiere (lorsque le resultat est un entier, ou une fonction des entiers dans les entiers), et une interpretation booleenne (lorsque le resultat est un booleen, ou une fonction des entiers dans les booleens). Dans cette denition, on utilise les conventions suivantes :
{
c
designe une constante scalaire, etC
designe une constante parallele {x
designe une variable scalaire, etX
designe une variable parallele {s
,s
1 ets
2 representent des elements deSarith
{
V
,V
1 etV
2 representent des elements deV arith
{
b
,b
1 etb
2 representent des elements deSbool
Interpretation entiere
Pour une expression de type
Sarith
,c
]]( ) =c
x
]]( ) = (x
)V
js]]( ) = (V
]]( ))j(s]]( ))
s
1Binop s
2]]( ) =s
1]]( )Binop
s
2]]( )if
b
thens
1 elses
2]]( ) = (s
1]]( ) sib
]]( ) =vrai
s
2]]( ) sib
]]( ) =faux
Pour une expression de type
V arith
,C
]]( ) =C
This
]]( ) =This
, ouThis
ju=u
X
]]( ) = (X
)V
1 jV 2]]( ) =V
, ouV
ju= (V
1]]( )) j (V2]]( ))juV
1Binop V
2]]( ) =V
, ouV
ju= (V
1]]( )) juBinop
(V
2]]( )) juIF
B
THENV
1 ELSEV
2FI]]( ) =V
, ouV
ju= ( (V
1]]( )) jusi (B
]]( ))ju=vrai
(V
2]]( )) jusi (B
]]( ))ju=faux
Interpretation booleenne
Pour une expression de type
Sbool
,true
]]( ) =vrai
false
]]( ) =faux
B
js]]( ) = (B
]]( ))j (s]]( )) :b
]]( ) = :b
]]( )s
1Rel s
2]]( ) =s
1]]( )Rel
s
2]]( )b
1Connect b
2]]( ) =b
1]]( )Connect
b
2]]( )Pour une expression de type
V Bool
,TRUE
]]( ) =B
, ouB
ju =vrai
FALSE
]]( ) =B
, ouB
ju =faux
:
B
]]( ) = :(B
]]( ))V
1Rel V
2]]( ) =B
, ouB
ju = (V
1]]( )) juRel
(V
2]]( )) juB
1Connect B
2]]( ) =B
, ouB
ju = (B
1]]( )) juConnect
(B
2]]( )) juIl reste alors a preciser la semantique des formules booleennes
Sform
.Interpretation des formules
Etant donne un environnement , interpreter une formule
F
dans revient a determiner si cette formule est vraie ou non dans cet environnement.Appliquee aux formules, la fonction ]] a donc le prol :
]] :
Sform
!(env
!fvraifaux
g)et elle est denie par:
:
F
]]( ) = :F
]]( )F
1Connect F
2]]( ) =F
1]]( )Connect
F
2]]( )9
x : P
]]( ) =vrai
ssi 9c
2Ntel queP
c=x
]]]( ) =vrai
La semantique de la formule(( 8
x : P
)) s'obtient en utilisant l'equivalence suivante: 8x : p
:(9x :
(:p
))Dans la suite, on indiquera a l'aide de l'operateurj= le fait qu'un environnement valide une
formule
F
:j=
F
si et seulement siF
]]( ) =vrai
Enn, on termine en donnant la semantique des assertions proprement dites.
Semantique d'une assertion
En premier lieu, il est facile de voir que la semantique que l'on a associee jusqu'ici aux langages d'etat et de contexte permet bien d'une part d'exprimer des propositions sur les valeurs des variables d'un programme et, d'autre part, de deduire le contexte d'activite de ses processeurs, a un instant donne de son execution.
Plus precisement, on dira qu'une assertion f
PC
g est valide dans un etat du programme oul'environnement et le contexte valent respectivement et
s
si et seulement si: { valide la formuleP
:j=
P
{ la valeur de l'expression booleenne parallele est identique au vecteur exprimant l'activite courante des processeurs :
8
u :
(C
]]( ))ju=vrai
ssiactif
(u
)ce qui s'ecrit egalement,
C
]]( ) =Top
(s
)Formellement, on denira donc une fois encore une fonction ]], qui, etant donnee une assertion, retourne l'ensemble des couples (etat, contexte) pour lesquels elle est valide.
Denition 2-1
La fonction ]] est denie sur l'ensemble des assertions de la maniere suivante: ]] :
Assertion
!env
ctxte
avec, pour toute assertionf
PC
g,La encore, l'operateurj= pourra ^etre utilise pour indiquer qu'un couple (
s
) valide une assertiondonnee:
(
s
)j=fPC
gsi et seulement si (s
)2fPC
g]]On denit une nouvelle relation entre les assertions.
Denition 2-2
Soit deux assertions f
PC
g et fQD
g, on dit que fPC
g implique fQD
g, ce que l'on note fPC
gC
)f
QD
g, ssi on a:(
P
)Q
) ^ (P
) 8u:
(C
ju ,D
ju))Il est facile de voir que cette denition reste coherente lorsque l'on compare des assertions en fonction de leur semantique:
f
PC
gC
)f
QD
g ) fPC
g]] fQD
g]]2.2 Substitutions
An de pouvoir deduire statiquement de nouvelles assertions sur le comportement d'un pro-gramme, il est necessaire de disposer d'un mecanisme qui permette de modier de maniere sym-bolique l'expression representee par une variable dans une assertion. Nous introduisons donc une fonction de substitution sur les variables paralleles, qui permet de remplacer, dans une expression
E
, une variableY
par une expressionT
, du m^eme type queY
. La nouvelle expression obtenue est noteeE
T=Y
].Notons que, compte tenu de la semantique que nous avons donnee aux assertions, la substitution denit en fait une interaction entre les langages d'etat et de contexte, puisque les propositions sur les variables du programme sont toujours conditionnees par l'expression de contexte. Stewart 21] propose un mecanisme similaire pour l'instruction d'aectation data-parallel de Fortran 90, mais comme pour Gabarro et Gavalda le contexte est toujours denote explicitement par un ensemble d'entiers, alors que dans notre methode il est denote implicitement.
En supposant que
Y
est une variable parallele et queT
represente une expression de typeV arith
, et en conservant les conventions etablies dans la section 2.1 pour les types des autres identicateurs, ce mecanisme de substitution peut alors ^etre deni par induction comme suit.Expressions scalaires :
c
T=Y
] =c
true
T=Y
] =true
false
T=Y
] =false
x
T=Y
] =x
V
jsT=Y
] = (V
T=Y
])j (sT=Y])B
jsT=Y
] = (B
T=Y
])j (sT=Y])(
s
1Binop s
2)T=Y
] =s
1T=Y
]Binop s
2T=Y
](
b
1Connect b
2)T=Y
] =b
1T=Y
]Connect b
2T=Y
](:
b
)T=Y
] = :(b
T=Y
])(if
b
thens
1 elses
2)T=Y
] = ifb
T=Y
] thens
1T=Y
] elses
2T=Y
](9
x : F
)T=Y
] = 9x :
(F
T=Y
])(8
x : F
)T=Y
] = 8x :
(F
T=Y
])Expressions vectorielles:
C
T=Y
] =C
TRUE
T=Y
] =TRUE
FALSE
T=Y
] =FALSE
X
T=Y
] =(
T
siX
=Y
X
siX
6=Y
(
V
1Binop V
2)T=Y
] =V
1T=Y
]Binop V
2T=Y
](
V
1Rel V
2)T=Y
] =V
1T=Y
]Rel V
2T=Y
](
B
1Connect B
2)T=Y
] =B
1T=Y
]Connect B
2T=Y
](:
B
)T=Y
] = :(B
T=Y
])(IF
B
THENV
1 ELSEV
2)T=Y
] = IFB
T=Y
] THENV
1T=Y
] ELSEV
2T=Y
]2.3 Quelques equivalences utiles
Apres avoir deni la notion d'equivalence sur les composantes de notre langage d'assertions, nous presenterons quelques resultat utiles pour la manipulation de ce dernier, puis nous enoncerons une propriete fondamentale du mecanisme de substitution.
Equivalence de formules ou d'expressions
Nous denissons une notion d'equivalence entre des formules ou des expressions de la maniere suivante:
Denition 2-3
Deux expressions
E
1 etE
2 sont dites equivalentes, ce que l'on noteE
1E
2 si l'on a: 8
:
E
1]]( ) =
E
2]]( )Denition 2-4
Deux formules
F
1 etF
2 sont dites equivalentes, ce que l'on noteF
1F
2 si l'on a: 8
:
F
Equivalences pratiques
On termine cette section en etablissant un certain nombre de propositions relatives aux substi-tutions qui seront utilisees dans la suite.
Proposition 2-1
(V
1Binop V
2) jsV
1 jsBinop V
2 js (V
1Rel V
2) jsV
1 jsRel V
2 js (B
1Connect B
2) jsB
1 jsConnect B
2 js (:B
)js :(B
js)(IF
B
THENV
1 ELSEV
2)js if
B
js thenV
1js else
V
2js
(if
b
thens
1 elses
2)Binop s
3if
b
then (s
1
Binop s
3) else (s
2Binop s
3)(if
b
thens
1 elses
2)Rel s
3if
b
then (s
1
Rel s
3) else (s
2Rel s
3)(IF
B
THENV
1 ELSEV
2)Binop V
3IF
B
THEN (V
1
Binop V
3) ELSE (V
2Binop V
3)(IF
B
THENV
1 ELSEV
2)Rel V
3IF
B
THEN (V
1
Rel V
3) ELSE (V
2Rel V
3)Preuve:
La preuve consiste a verier que la fonction semantique ]] retourne bien des resultats identiques pour les membres gauches et droits de chacune des equivalences proposees. Il sut ensuite d'utiliser l'implication suivante : 8
:
E
1]]( ) =E
2]]( ) )E
1E
2Proprietes de la substitution
On termine en donnant alors une proposition qui montre que, du point de vue de l'evaluation, substituer une variable parallele dans une expression ou dans l'environnement dans lequel cette expression est evaluee, conduit a un resultat identique. Cette proposition etant assez intuitive, et ne dependant en fait pas des caracteristiques particulieres des langages que l'on considere ici pour decrire les expressions, sa preuve ne sera pas detaillee. Notons que l'on trouve une proposition similaire dans 1].
Proposition 2-2
P
]](X
E
]]( )]) =P
E=X
]]]( )Preuve:
Par induction sur la structure deP
.En choisissant alors pour
E
l'expression((IFC
THENE
1 ELSE
E
2)), il est possible d'en deduire
Corollaire 2-1
Pour tout environnement et formule
P
on a:X
IFC
THENE
1 ELSE
E
2]]( )]j=
P
ssi j=P
IFC
THENE
1ELSE
E
2=X
]Ce corollaire est a la base de la validite des axiomes du systeme de preuve que nous presentons dans la suite.
2.4 Le systeme de preuve
On rappelle le systeme de preuve qui decrit la semantique axiomatique du langageL.
Compte-tenu des restrictions que nous avons imposees sur la structure des programmes que l'on considere (c.-a-d. a contexte xe comme deni en section 1.3), on donne en fait ici une version simpliee de ce systeme par rapport a la version originale proposee dans 23].
Ce systeme de preuve est constitue de deux axiomes, qui correspondent respectivement aux instructions d'aectation et de communications, et de trois regles d'inferences, associees aux ins-tructions de composition sequentielle, de conditionnement, et d'iteration. Rappelons que les objets manipules sont des triplets de la formef
P C
gS
fQ D
g, oufP C
getfQ D
gsont des assertions etS
est un fragment de programmeLa contexte xe telle queChange
(S
)\(V ar
(C
)V ar
(D
)) =,ceci an de simplier la gestion des variables de contextes.
Aectation:
f
P
IFC
THENE
ELSEX=X
]C
gX
:=E
fP C
gCommunication:
f
P
IFC
THENY
jA ELSEX=X
]C
g getY
fromA
intoX
fP C
gComposition sequentielle :
fP C
gS
1 fP
0C
g fP
0C
gS
2 fQ C
g fP C
gS
1S
2 fQ C
gConditionnement:
fP C
^B
gS
fQ C
^B
g fP C
g whereB
doS
end fQ C
gIteration:
fI
^9u :
(E
ju ^B
ju)E
gS
fI E
g fI E
g whileB
doS end
fI
^ 8u :
(E
ju ) :B
ju)E
gDans cette regle, l'assertion f
I E
gn'est autre que l'invariant de la boucle.Enn, on ajoute egalement a ce systeme une derniere regle d'inference, la regle de consequence, qui permettra de renforcer une precondition ou encore d'aaiblir une postcondition :
f
PC
g C )fP
0C
0 g fP
0C
0 gS
fQ
0D
0 g fQ
0D
0 g C )fQD
g fP C
gS
fQ D
gOn notera classiquement par`f
P C
gS
fQ D
g le fait que le triplet fP C
gS
fQ D
gpuisse^etre deduit du systeme de preuve.
Pour justier le fait que ce systeme de preuve decrit bien la semantique attendue pour le langage
L, il reste a etablir le lien avec la semantique operationnelle qui etait proposee dans la section 1.2.
On donne pour ce faire une interpretation des triplets en termes de la machine abstraite qui nous avait permis de deriver cette semantique operationnelle.
Plus precisement, on dira qu'un tripletf
P C
gS
fQ D
g est valide ce que l'on note: j=fP C
gS
fQ D
gsi et seulement si toute execution terminee du programme
S
a partir d'un etat de la machine qui verie l'assertion fPC
g, mene a un etat qui satisfait l'assertion fQD
g. Formellement, cetteproposition s'ecrit donc de la maniere suivante :
j=f
P C
gS
fQ D
g ssiS
]](fPC
g]])fQD
g]]Il resterait alors a montrer que le systeme de preuve est correct, c'est a dire que tout triplet qui peut ^etre deduit est un triplet valide :
(`f
P C
gS
fQ D
g) ) (j=fP C
gS
fQ D
g)Nous ne donnons pas cette preuve de correction qui sera detaillee par ailleurs.
Nous donnons ici deux lemmes, qui seront necessaire par la suite, concernant l'invariances des expressions de contexte lorsque les fragments de programmes ne modient pas ces dernieres.
Lemme 2-1
Soit le triplet f
PC
gS
fQD
gtel queV ar
(C
)\Change
(S
) =. Si j=fPC
gS
fQD
galors
j=f
PC
gS
fQC
gPreuve:
j=f
PC
gS
fQD
gsignie que l'on a:
8(
s
)2fPC
g]]:
S
]](s
) =f( 0s
0)gf
QD
g]]or d'apres la semantique operationnel on a
s
0=s
, donc: 8(s
)2fPC
g]]:
S
]](s
) =f(0
s
)gf
QD
g]]comme
V ar
(C
)\Change
(S
) =, on a par induction sur la structure syntaxique deS
:(
C
) = 0 (C
) c.-a-d.: 8u:
(C
)ju= 0 (C
)ju=Top
(s
)ju donc ( 0s
) j=fQC
g, on obtient nalement : j=fPC
gS
fQC
gOn a le lemme symetrique suivant :
Lemme 2-2
Soit le triplet f
PC
gS
fQD
gtel queV ar
(D
)\Change
(S
) =. Si j=fPC
gS
fQD
galors
j=f
PD
gS
fQD
gPreuve:
La preuve est similaire a la precedente.Ces deux lemmes justient aussi la restriction des programmes consideres, c.-a-d. qu'ils soient a contexte xe et que pour tous triplets f
PC
gS
fQD
gon doit avoir:(
V ar
(C
)V ar
(D
))\Change
(S
) =3 La semantique axiomatique comme outil de programmation
Nous allons nous interesser ici a l'emploi de notre systeme de preuve comme outil de program-mation. Dans un premier temps nous exhiberons la preuve complete d'un programme donne. Dans un deuxieme temps, nous verrons comment la conception d'un programme peut ^etre dirigee par sa preuve.
3.1 Une preuve complete de programme
Nous allons voir ici comment notre systeme de preuve peut nous aider a trouver et prouver ce que calcule un programme donne.
Considerons le programme
M
de la gure 1, le probleme est de savoir ce qu'il calcule.Apres une premiere lecture syntaxique, on peut deja presumer du r^ole de chaque variable du programme:
{
T
est apparemment la variable d'entree du programme, puisqu'elle est la seule non initialisee {j
est une variable compteur scalaire1{
S
est s^urement la variable de sortie du programme parce qu'elle cumule plusieurs valeurs {A
est apparemment une variable auxiliaire car reinitialisee a chaque iteration.Maintenant que nous avons une information sur le type des variables, il faut s'interesser aux valeurs calculees par le programme, c.-a-d. connaissant
T
, que vautS
a la n de l'execution.Pour cela le premier reexe est d'executer le programme avec un jeu d'essai. La gure 2 en est un exemple avec huit processeurs. En entree
T
vaut 1 partout, et on constate qu'en sortie chaque element deS
est egal au numero de processeur plus un. A priori le programme calcul pour chaque processeur la somme des valeurs de ces predecesseurs. Ce qui equivaut a la fonctionscan, ou sommeprexee, de la Connection Machine 2.
1par scalaire nous entendons une variable parall ele dont les composantes ont toutes la m^eme valeur a chaque pas
S
:=T
j
:=1while
j < N
doA
:=S
where This
> j
doGet
A
from This -j
S
=S
+A
J
end
j
=j
*2 endFig. 1 - Programme mystere
M
S 2 2 2 2 2 2 2 J=1 S 3 4 4 4 4 4 J=2 S J=4 5 6 7 8 S 5 6 7 8 J=8 1 2 3 1 2 3 4 2 1 1 1 1 1 1 1 1 1 1 T 1 1 1 1 1 1 1 1 S 4
Mais cela n'est encore qu'une supposition, et n'est vrai que pour l'exemple tres particulier du test.
Pour valider notre hypothese dans un cadre plus general, nous allons appliquer notre systeme de preuve axiomatique. Nous allons chercher a prouver l'assertion suivante:
f8
u:
1u
N
)T
ju2Ntrue
gM
f8u:
1u
N
)S
ju=i=u X
i=1
T
jitrue
gEn examinant notre systeme et le programme
P
, on voit qu'il est necessaire de degager un invariant pour la boucle while.Trouver un invariant de boucle est souvent une t^ache delicate, car non seulement doit-il ^etre correct, c.-a-d. rester stable apres execution du corps de la boucle, mais il doit ^etre aussi susant pour prouver la condition qui suit immediatement la boucle dans le programme (en l'occurrence la post-condition nale de la specication de notre programme), mais pas trop pour que la condition precedente a la boucle le satisfasse.
La trace du programme ou l'on aurait place un point d'arr^et a la position ((J)) de la gure 1,
est aussi representee sur la gure 2. Les valeurs ombrees sont celle des processeurs inactifs.
En s'attardant sur une etape particuliere du calcul, par exemple pour
j
= 4, on peut remarquer que les valeurs deS
en entrees de l'iteration, c.-a-d. celle en sorties de l'iteration precedente, satisfont les proprietes suivantes.{ Tous les processeurs inactifs a une iteration, le restent pour les iterations suivantes, c.-a-d. que leur valeur pour
S
est la valeur nale. De plus celle-ci est la somme des valeurs deT
de tous les predecesseurs.{ Pour tous les processeurs actifs, c'est la somme des
j
predecesseurs. Ainsi, on peut formuler l'invariant de la boucle de la maniere suivante :I
8u:
(1u
j
)S
ju= i=u X i=1T
ji)^(j < u
N
)S
ju= i=u X i=u;j+1T
ji)On verie immediatement si celui-ci est susant pour prouver la post-condition nale de notre programme. En eet la regle de la boucle while indique que l'on a comme post-condition :
f8
u:
(1u
j
)S
ju= i=u X i=1T
ji)^(j < u
N
)S
ju= i=u X i=u;j+1T
ji)^(j
N
)true
gcelle-ci implique eectivement la post-condition nale de notre specication:
f8
u:
1u
N
)S
ju=i=u X
i=1
T
jitrue
gPour montrer qu'il est correct, regardons le programme
M
annote par sa preuve de la gure 3, ou toutes les assertions intermediaires ont ete generees en appliquant les axiomes d'aectation et de communication. On peut remarquer d'ailleurs que les assertions du where sont simples carl'invariant a ete exprime en tenant compte du contexte.
Le seul cas delicat dans cette preuve est de verier que (1))(2), avec:
(1)f8
u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
N
)S
ju= Pi =u i=u;j+1T
jitrue
gf8
u:
1u
N
)T
ju2Ntrue
g f8u:
1u
N
)T
ju= Pi =u i=u;1+1T
jitrue
gS
:=T
f8u:
1u
1)S
ju= Pi =u i=1T
ji ^1< u
N
)S
ju= Pi =u i=u;1+1T
jitrue
gj
:=1 f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
N
)S
ju= Pi =u i=u;j+1T
jitrue
g whilej < N
do (1)f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
N
)S
ju= Pi =u i=u;j+1T
jitrue
g (2)f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
j
2)S
ju+S
ju ;j = Pi =u i=1T
ji ^j
2< u
N
)S
ju+S
ju ;j = Pi =u i=u;j 2+1T
jitrue
gA
:=S
f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
j
2)S
ju+A
ju ;j= Pi =u i=1T
ji ^j
2< u
N
)S
ju+A
ju ;j = Pi =u i=u;j 2+1T
jitrue
g where This> j
do f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
j
2)S
ju+A
ju ;j = Pi =u i=1T
ji ^j
2< u
N
)S
ju+A
ju ;j = Pi =u i=u;j 2+1T
jiThis> j
gGet
A
from This -j
f8
u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
j
2)S
ju+A
ju = Pi =u i=1T
ji ^j
2< u
N
)S
ju+A
ju= Pi =u i=u;j 2+1T
jiThis> j
gS
=S
+A
f8u:
1u
j
2)S
ju= Pi =u i=1T
ji ^j
2< u
N
)S
ju = Pi =u i=u;j 2+1T
jiThis> j
g end f8u:
1u
j
2)S
ju= Pi =u i=1T
ji ^j
2< u
N
)S
ju= Pi =u i=u;j 2+1T
jitrue
gj
=j
*2 f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
N
)S
ju= Pi =u i=u;j+1T
jitrue
g end f8u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
N
)S
ju= Pi =u i=u;j+1T
ji ^j
Ntrue
g f8u:
1u
N
)S
ju = Pi =u i=1T
jitrue
gFig. 4 - Quadtree et recursivite du maillage carre (2)f8
u:
1u
j
)S
ju= Pi =u i=1T
ji ^j < u
j
2)S
ju+S
ju ;j= Pi =u i=1T
ji ^j
2< u
N
)S
ju+S
ju ;j = Pi =u i=u;j 2+1T
jitrue
gDans la condition (2), le cas ou 1
u
j
se deduit directement de la condition (1). Pour le cas ouj < u
j
2, il sut de remarquer queu
;j
j
pour voir que celui-ci se deduit aussi de (1). Dem^eme pour le cas ou
j
2< u
N
, remarquer queu
;j > j
sut a prouver l'implication.Enn on voit que l'invariant((remonte))bien vers la pre-condition initiale de notre specication.
Nous avons donc employe notre semantique an de decouvrir et prouver ce que calcule un programme xe. Pour cela nous avons etudie une trace de son execution an de degager une propriete constante associee a un point d'arr^et. Cette methode est celle qui a ete preconisee par Peter Naur 20], et qui a ete justement a la genese de la semantique axiomatique.
3.2 Conception d'un programme dirigee par sa preuve
Nous allons maintenant illustrer l'utilite de notre systeme dans la conception conjointe d'un programme et de sa preuve. L'exemple choisi est la generation de quadtrees a partir d'images bi-naires. Le quadtree est une structure de donnee largement utilisee dans le traitement d'image. Comme exemple d'application on peut citer les travaux de P. Bonnin sur la segmentation coope-rative contour/region 5], dont le programme presente ici est issu d'une mise en uvre en Pompc
3].
3.2.1 Approche abstraite
La notion de quadtree est liee a la propriete de recursivite du maillage carre. On peut representer une image discrete par un arbre quaternaire. Chaque nud de l'arbre correspond a un pave unique de l'image, de taille dependant de sa profondeur dans l'arbre. Le niveau le plus bas etant celui du pixel du capteur. La gure 4 est un exemple de quadtree, ou l'arbre est construit en observant l'image de gauche a droite et de haut en bas.
Un quadtree est une bonne representation d'une image discrete si chaque feuille de l'arbre represente une zone homogene de celle-ci, auquel cas on etiquette chaque feuille avec la ((couleur))
Parmi ces quadtrees((corrects)), il en existe un qui a un nombre minimal de nuds : c'est celui
ou toutes les feuilles ont un frere qui ne decrit pas une zone homogene de l'image, ou alors d'une autre couleur, tel que celui presente en gure 4.
C'est un algorithme a parallelisme de donnees de construction d'un quadtree minimal a partir d'une image binaire de dimension 2N2N que nous nous proposons de construire ici, en nous aidant
de la semantique axiomatique.
Dans un premier temps, nous considerons que nous pouvons traiter directement les quadtrees sans nous preoccuper de leur implementation. La structure de donnees parallele (collection au sens de Pompc) est l'arbre quaternaire complet. Les variables sont:
Feuille
: un booleen qui indique pour chaque nud s'il est une feuille d'un quadtree correctCl
: indique la couleur de la zone homogene representee par la feuilleNiveau
: une constante entiere indiquant a quel niveau ce trouve le nud dans l'arbre quaternaire. Si l'on part d'une image quelconque, le quadtree complet ou la variableFeuille
n'est vraie que pour les nuds de niveau le plus bas (Niveau
= 0), et ouCl
est alors xee a celle du pixel, est un quadtree correct par rapport a l'image. La specication initiale du programme cherche est donc:f8
n:Niveau
jn= 0,Feuille
jntrue
gSi l'on est capable d'enumerer tous les quadtrees corrects, il est alors aise de trouver le minimal. On peut representer tous les quadtrees corrects sur notre structure si tous les nuds representant une zone homogene de l'image sont etiquetes par
Feuille
=tt
. Nous considerons que cette repre-sentation intermediaire est la specication nale de notre programme, c.-a-d. plus formellement:f8
n:
(Feuille
jn)homog
ene
(n
))^(:Feuille
jn):homog
ene
(n
))true
gavec le predicat
homog
ene
(n
) est deni comme suit, et oufils
(n
) represente l'ensemble des quatre ls du nudn
:{ 8
n:
(Niveau
jn= 0)homog
ene
(n
) =true
){ 8
n:Niveau
jn>
0)homog
ene
(n
) = (8n
02
fils
(n
):homog
ene
(n
0)) ^ (8(n
0n
0 0) 2fils
(n
) 2:Cl
jn0 =Cl
jn00)La specication de notre programme est resumee par le schema de la gure 5.
De la denition d'homogeneite, on voit que l'etat initial du programme satisfait la condition suivante:
f8
n:Niveau
jn= 0)(Feuille
jn)homog
ene
(n
)^:Feuille
jn):homog
ene
(n
))true
gD'ou l'idee de construire le programme avec une boucle d'indice
j
ayant comme invariant :I
8n:
(Niveau
jnj
)(Feuille
jn)homog
ene
(n
)^:Feuille
jn):homog
ene
(n
)))Celui-ci est donc verie par l'etat initial (
j
= 0), et pourj
=N
;1 l'invariant satisfait la conditionnale.
On a donc le synopsis de programme de la gure 6, ou nous avons introduit une nouvelle variable
H
qui represente le resultat du test d'homogeneite. Nous avons juste decrit les proprietesQt
Fig. 5 - Specication du programme de quadtree
Qt
f8
n:
(Niveau
jn= 0,Feuille
jn)true
g fI
0=j
]true
gj
:=0 fItrue
g whilej < N
;1 do fI
^j < N
;1true
gS
f
I
^8n:
(Niveau
jn=j
+ 1)(H
jn,homog
ene
(n
)))true
gf
I
IF
(Niveau
=j
+ 1^H
)THEN true ELSE Feuille=Feuille
j
+ 1=j
]true
gwhere
Niveau
= (j
+ 1) do whereH
doFeuille
:=true
Get
Cl
fromls intoCl
end end fI
j
+ 1=j
]true
gj
:=j
+1 fItrue
g end fI
^j
=N
;1true
gf8
n:
((Feuille
jn)homog
ene
(n
))^(:Feuille
jn):homog
ene
(n
)))true
g1 0 0 3 2 1 a a b c Niveau = j Niveau = j+1 2 3
Fig. 7 -
Rang
des nuds et evaluation du test d'homogeneitelogiques qu'elle doit satisfaire pour conserver l'invariant. Il nous faut donc trouver un morceau de programme
S
qui satisfasse la specication suivante :f
I
^j < N
;1true
gS
fI
^8n:
(Niveau
jn=j
+ 1)(H
jn,homog
ene
(n
)))true
gPour calculer
H
il est necessaire que les nuds communiquent. Sans nous preoccuper du reseau de communication, considerons la nouvelle variableRang
qui denote le rang des nuds dans leur liation par rapport a leur pere.Comme represente sur la gure 7, on voit que l'on peut calculer le test d'homogeneite par une reduction au niveau des ls (communication
a
etb
) pour determiner si tous les ls representent une zone homogene (c.-a-d. qu'ils soient tous des feuilles de couleur identique), puis par une lecture du resultat par le pere sur un ls privilegie (communicationc
). Ceci par denition de l'homogeneite et gr^ace a l'invariant qui nous assure que:8
n:
(Niveau
jnj
)(Feuille
jn,homog
ene
(n
)))ce qui est le cas pour les ls. Le code realisant ce calcul est presente dans la gure 8.
3.2.2 Implementation
Nous avons degage le squelette du programme en raisonnant sur une structure de donnees abstraite. Maintenant nous allons nous interesser a l'implementation de celui-ci sur une structure de donnees manipulable par L, c.-a-d. les tableaux.
Un quadtree est entierement specie par la liste de ses feuilles. De plus le nombre de feuilles maximales est egal au nombre de pixels de l'image initiale. D'ou l'idee de plonger le quadtree dans un tableau a deux dimensions comme le montre la gure 9.
Chaque nud de l'arbre est projete dans le pixel superieur gauche du pave qu'il decrit. Ainsi le pixel de coordonnees nulles decrit
N
nuds, qui correspondent a ceux rencontres lors d'un parcours des branches de l'arbre les plus a gauche. Il sut juste alors de savoir pour chaque pixel quel est le niveau maximum des nuds decrits qui sont encore des feuilles du quadtree. Nous introduisonsf
I
^j < N
;1true
gwhere
Niveau
=j
doH
:=Feuille
where
Rang pair
doGet
H
from frere deRang
+ 1 intoH
0Get
Cl
from frere deRang
+ 1 intoCl
0end
H
:=(H
^H
0) ^(Cl
=Cl
0) whereRang
= 0 doGet
H
from frere deRang
+ 2 intoH
0Get
Cl
from frere deRang
+ 2 intoCl
0end
H
:=(H
^H
0) ^(Cl
=Cl
0) end whereNiveau
=j
+ 1 doGet
H
from ls deRang
0 intoH
endf
I
^8n:
(Niveau
jn=j
+ 1)(H
jn,homog
ene
(n
)))true
gFig. 8 - Extrait du programme
S
pour le calcul deH
(0,0)
une variable tableau a deux dimensions2
Niv
qui satisfait la propriete suivante:I
r 8(xy
):
(Niv
j(xy)=
k
),(8
n
2noeud
(xy
): Niveau
jnk
)Feuille
jn ^Niveau
jn> k
):Feuille
jn)noeud
(xy
) etant l'ensemble des nuds decrit par le pixel de position (xy
).Remarquons que les pixels qui decrivent les nuds de
Niveau
=j
sont ceux dont les coordonnees sont des multiples de 2j:8(
xy
):
(9n
2noeud
(xy
):Niveau
jn=j
),(9kl:x
=k
2j^y
=l
2l)On peut de m^eme denir la fonction
Rang
pour un niveauj
donne par:Rang
(j
(xy
)) = 8 > > > < > > > : 0si
9k: x
=k
2j +1et
9l: y
=l
2j +1 1si
:9k: x
=k
2j +1et
9l: y
=l
2j +1 2si
9k: x
=k
2j +1et
:9l: y
=l
2j +1 3si
:9k: x
=k
2j +1et
:9l: y
=l
2j +1Remarquons qu'un pere et son ls de
Rang
= 0 se situent sur le m^eme processeur, d'ou l'eco-nomie d'une communication sur le programme nal de la gure 10. Dans cette version les variablesCl
,H
etH
0 sont des variables tableaux,x
ety
sont des constantes indiquant les coordonnes dechaque pixel.
Le programme nal resultant est non trivial. Resumons la demarche suivie pour y aboutir. Tout d'abord nous avons speci e le probleme sur une structure de donnee abstraite: l'arbre quaternaire. Apres avoir note les proprietes de celui-ci (recursivite liee au maillage carre et a la denition d'homogeneite), nous avons degage un invariant de boucle
I
. Nous avons introduit une nouvelle variableH
, qui speciait l'ensemble des nuds qui devaient ^etre mis a jour pour conserver l'invariant. Nous avons ensuite, a partir de sa specication, exhibe un fragment de programme calculant correctement celle-ci. Nous avons donc utilise la propriete de compositionnalite de la semantique axiomatique pour construire le corps de la boucle.Pour la phase d'implementation, il a sut d'etablir une equivalence entre la representation abstraite du quadtree et la variable tableaux
Niv
par l'introduction de l'invariantI
r, pour exhiberle programme nal qui conserve la m^eme structure que la version intermediaire.
3.3 Discussion
De ces deux applications de notre semantique axiomatique, on constate nalement que les me-thodes employees sont tres proches de celle du cas sequentiel. Cela est reconfortant pour l'utilisateur nal, car une fois qu'il aura assimile les notions specique au parallelisme de donnees tel que celles de localite et de contexte, il pourra employer les m^emes methodes d'approche pour les problemes qu'il aura a resoudre. Ces methodes sont le fruit de plus de 20 annees de recherche autour de la logique de Hoare et de la construction de programme en general, qui sont couramment employees et enseignees par la communaute informatique d'aujourd'hui.
L'application la plus importante est bien s^ur l'aide a la conception de programme. Generalement quand un programme est ecrit, il devient dicile de le prouver. Il faut donc systematiquement developper tout programme avec sa preuve, sous forme d'assertions intermediaires. Il est clair que
2Jusqu' a present nous avons considere que
L manipulait des vecteurs, c.- a-d. des tableaux de dimension un, ici
nous considerons queLpeut manipuler des matrices. On peut se ramener bien s^ur a des vecteurs en y plongeant ces
f8
n:Niveau
jn= 0,Feuille
jntrue
g fI
0=j
]^I
r0=Niv
]true
gj
:=0Niv
:=0 fI
^I
rtrue
g whilej < N
;1 do wherex
%2j = 0^y
%2j = 0 doH
:=Niv
=j
wherex
%2j+1 = 0 doGet
H
from (x
+ 2jy
) intoH
0Get
Cl
from (x
+ 2jy
) intoCl
0H
:= (H
^H
0) ^(Cl
=Cl
0) end end wherex
%2j+1= 0 ^y
%2j +1= 0 do GetH
from (xy
+ 2j) intoH
0Get
Cl
from (xy
+ 2j) intoCl
0H
:= (H
^H
0) ^(Cl
=Cl
0) whereH
doNiv
:=j
+ 1 end endj
:=j
+ 1 end fI
^I
r^j
=N
;1true
gf