• Aucun résultat trouvé

R´ e´ ecriture des formules de substitution

6.3 G´ en´ eration des substitutions B

6.3.2 G´ en´ eration des op´ erations

6.3.2.4 R´ e´ ecriture des formules de substitution

}

Les principaux op´erateurs du langage B sont pr´esent´es dans l’annexeB. Nous expliquons maintenant ce que repr´esentent les ensembles A et R. La disjonction sur j repr´esente les diff´erentes clauses d’entr´ees avec la mˆeme action dans la d´efinition d’attribut bF. Ainsi, chaque branche j dans A et dans R correspond `a une clause d’entr´ee. Lorsque uj ,i est ´egal `a ⊥, alors l’attribut bF

devient ind´efini pour la valeur de cl´e correspondante, qui est d´etermin´ee par θuj

et Φuj ,i. Chaque branche i de la disjonction dans l’ensemble A repr´esente une de ces valeurs de cl´e. Par exemple, l’action DiscardF(bIdF) affecte la valeur ⊥ `

a l’attribut titleF pour le type d’entit´e bId . D’apr`es la formule ci-dessus, on en d´eduit la substitution suivante : titleB := A− titleB, o`u A est d´efini par :

A = {c | ∃ bIdI · c = bIdI θu∧ true θu}

Dans cet exemple, bIdI est directement li´e par le filtrage, car θu contient la substitution bIdI := bIdB. On en d´eduit alors que : A = {bIdB}. La substi-tution g´en´er´ee pour la variable titleB dans l’op´eration DiscardB est donc : titleB := {bIdB}− titleB.

R est l’ensemble des tuples qui affectent de nouvelles valeurs `a l’attribut bB. La premi`ere disjonction sur j repr´esente les diff´erentes clauses d’entr´ee avec la mˆeme action dans la d´efinition d’attribut bF. Consid´erons maintenant la j -`eme clause d’entr´ee. Si uj est un terme fonctionnel, alors le tuple correspondant est (c, d ), o`u c est la valeur de cl´e d´etermin´ee par θuj et d est la valeur d’attri-but ujθuj. Si uj est un terme conditionnel, alors plusieurs valeurs de cl´e sont concern´ees ; elles sont caract´eris´ees par θuj et Φuj ,i. Chaque branche i repr´esente alors une valeur de cl´e et sa valeur d’attribut associ´ee uj ,iθuj. Par exemple, le terme conditionnel pour la clause TransferF dans la d´efinition d’attribut nbLoansF implique deux entit´es de member : mIdI0 et borrowerF(front (s), bIdI). La formule de substitution g´en´er´ee alors est : nbLoansB := nbLoansB<+R, o`u R est d´efini par :

R = {(c, d ) | ∃ mId · (c = mId ) θu

((mId = mIdI0 ∧ d = nbLoansF(front (s), mId )+1) θu) ∨ ((mId 6= mIdI0 ∧ mId = borrowerF(front (s), bIdI) ∧d = nbLoansF(front (s), mId )−1) θu)}

On remarque que mId reste ici une variable libre, mˆeme apr`es avoir pris en compte le filtrage : θu= {bIdI := bIdB, mIdI0 := mIdB}.

6.3.2.4 R´e´ecriture des formules de substitution

Les substitutions g´en´er´ees par notre algorithme sont syntaxiquement cor-rectes en B, mais peuvent parfois ˆetre difficiles `a prouver. Nous avons d´efini quelques r`egles de r´e´ecriture afin de transformer les substitutions obtenues. En particulier, des substitutions de la forme IF THEN ELSE END sont extraites de

la formule g´en´erale d´efinie dans la section6.3.2.3lorsque cette derni`ere implique des hypoth`eses sur les param`etres d’entr´ee de l’op´eration B.

R`egle 1 (Application des substitutions θuj) Soit E un des ensembles A ou R dans la formule de substitution. Pour chaque j , la substitution θuj est appliqu´ee `a l’expression correspondante exprj = expr θuj dans E de la mani`ere suivante : pour chaque substitution v := q dans θuj, o`u v est une variable de E , alors chaque occurrence de v dans exprj est remplac´ee par q et la notation “θuj” est supprim´ee de l’expression exprj. Si v est une des variables de−→

k , alors l’expression “∃ v ” est supprim´ee de l’expression exprj.

Les quantifications existentielles dans les ensembles A et R de la formule de substitution peuvent ˆetre simplifi´ees en utilisant la r`egle suivante. Nous suppo-sons que c est de la forme c = (c1, . . . , cm).

R`egle 2 (R`egle d’application “one-point”) Soit E un des ensembles A ou R. Pour chaque condition cl = w , o`u w est une variable li´ee de E ou un pa-ram`etre formel de l’action aF, alors :

– chaque occurrence de w dans E est remplac´ee par cl, – la condition cl = w est supprim´ee de E ,

– si w est une des variables de −→

k , alors l’expression ∃ w est supprim´ee de E .

Apr`es l’application des r`egles (1) et (2), les ensembles A et R de la for-mule de substitution sont maintenant de la forme {e | W

i,jexpri,j}. Il existe principalement deux formes de condition dans les expressions exprj ,i : i) des conditions qui permettent de d´eterminer les valeurs des tuples concern´es par les substitutions et ii) des hypoth`eses sur les param`etres d’entr´ee de l’op´eration sous lesquelles les substitutions sont valides. Les conditions de la forme i) ont une incidence sur les variables et les param`etres affect´es par les substitutions, tandis que les conditions de la forme ii) indiquent si une substitution peut ˆetre ex´ecut´ee ou non. La r`egle suivante permet de r´e´ecrire la formule de substitution en exprimant les hypoth`eses de la forme ii) dans les clauses IF de substitutions de la forme IF THEN ELSE END.

R`egle 3 (D´etection des hypoth`eses) Soit E de la forme A ou R. Pour chaque j , pour chaque i , chaque condition de la forme pF = w ou pF ∈ T dans expri,j g´en`ere une expression de la forme IF cond THEN S1 ELSE S2

END, o`u cond est la condition pF = w ou pF ∈ T , S1 est l’ensemble E res-treint aux expressions exprj ,i pour lesquelles la condition cond est satisfaite, et S2 est l’ensemble E restreint aux expressions exprj ,i pour lesquelles la condition cond est fausse. Chaque occurrence de cond et ¬cond est supprim´ee de S1 et S2.

L’application de la r`egle (3) est simplifi´ee par le fait que les conditions Φuj ,i ont ´

et´e d´eduites `a partir d’un arbre binaire. Par cons´equent, il existe une condition n´egative de la forme ¬cond pour toute condition cond apparaissant sur une ´

etiquette des branches de l’arbre.

Pour illustrer l’application de ces r`egles, consid´erons par exemple l’ensemble R obtenu pour l’attribut nbLoansB dans la section 6.3.2.3:

6.3. G ´EN ´ERATION DES SUBSTITUTIONS B 117 ((mId = mIdI0 ∧ d = nbLoansF(front (s), mId )+1) θu) ∨

((mId 6= mIdI0 ∧ mId = borrowerF(front (s), bIdI) ∧d = nbLoansF(front (s), mId )−1) θu)}

Dans un premier temps, on applique la r`egle (1), avec comme substitution θu = {bIdI := bIdB, mIdI0 := mIdB} :

R = {(c, d ) | ∃ mId · c = mId ∧ (mId = mIdB∧ d = nbLoansB(mId )+1) ∨ (mId 6= mIdB∧ mId = borrowerB(bIdB) ∧ d = nbLoansB(mId )−1)} On ´elimine ensuite la quantification existentielle en appliquant la r`egle (2) :

R = {(c, d ) | (c = mIdB∧ d = nbLoansB(c)+1) ∨

(c 6= mIdB∧ c = borrowerB(bIdB) ∧ d = nbLoansB(c)−1)} `

A cette ´etape, on ne peut plus appliquer de r`egle, car les conditions ne sont pas des hypoth`eses sur les param`etres formels de l’op´eration. Toutefois, on pour-rait simplifier l’ensemble R en un ensemble ´enum´er´e si la condition mIdB 6= borrowerB(bIdB) ´etait satisfaite :

R = {(mIdB 7→ nbLoansB(mIdB)+1),

(borrowerB(bId ) 7→ nbLoansB(borrowerB(bIdB))−1)}

Cependant, cette condition ne peut pas ˆetre d´eduite des d´efinitions d’attributs et nous laissons l’ensemble R sous sa forme en extension. Dans le chapitre 7, nous verrons que la condition mIdB 6= borrowerB(bIdB) peut ˆetre d´eduite des substitutions si on impose que l’ensemble soit ´enum´er´e.

Un autre exemple int´eressant concerne l’attribut dueDate dans l’association loan (voir section 4.2.1.2). Dans ce cas, les conditions Φuj ,i g´en´er´ees lors de la construction de l’arbre de d´ecision des clauses d’entr´ee associ´ees `a l’action TransferF incluent des hypoth`eses sur les param`etres formels de l’action. Il en est de mˆeme pour les clauses associ´ees aux actions LendF et TakeF. Par exemple, la formule de substitution g´en´er´ee pour TransferF est :

dueDateB := dueDateB<+R o`u R est d´efini par :

R = {(c, d ) | ∃(bId , mId ) · (c = (bId , mId ) θu1

((typeF = Permanent ∧ d = CurrentDateF+365) θu1)) ∨

(c = (bId , mId ) θu2 ∧ ((typeF 6= Permanent ∧ typeF = Classic ∧ d = CurrentDateF+loanDurationF(front (s), mIdI)) θu2))}

o`u θu1 = θu2 = {bIdI := bIdB, mIdI := mIdB}. En appliquant les r`egles (1) et (2), on obtient :

R = {(c, d ) | (c = (bIdB, mIdB) ∧

(typeF = Permanent ∧ d = CurrentDateB+365)) ∨

(c = (bIdB, mIdB) ∧ (typeF 6= Permanent ∧ typeF = Classic ∧ d = CurrentDateB+loanDurationB(mIdB)))}

La r`egle (3) peut maintenant ˆetre appliqu´ee puisqu’il existe des conditions sur le param`etre formel typeF de l’action TransferF. La premi`ere condition typeF = Permanent g´en`ere l’expression suivante :

R = IF typeB = Permanent THEN

{(c, d ) | c = (bIdB, mIdB) ∧ d = CurrentDateB+365} ELSE

{(c, d ) | c = (bIdB, mIdB) ∧

typeF = Classic ∧ d = CurrentDateB+loanDurationB(mIdB)} END

La r`egle (3) est de nouveau appliqu´ee sur la condition typeF = Classic dans la partie ELSE et on obtient :

R = IF typeB= Permanent THEN

{(c, d ) | c = (bIdB, mIdB) ∧ d = CurrentDateB+365} ELSE IF typeF = Classic THEN

{(c, d ) | c = (bIdB, mIdB)

∧ d = CurrentDateB+loanDurationB(mIdB)} END

END

Dans la pratique, cette ´etape n’est pas n´ecessaire, car le param`etre typeB ne peut prendre que deux valeurs, mais il est parfois difficile de d´etecter ce type de situation de mani`ere syst´ematique.

Lorsque la r`egle (3) ne peut plus ˆetre appliqu´ee sur A ou sur R, on fait une analyse des expressions IF THEN ELSE END pour en d´eduire la substitution finale. Dans l’exemple pr´ec´edent, les hypoth`eses n’impliquent que l’ensemble R ; par cons´equent, l’expression IF THEN ELSE END peut porter sur l’ensemble de la substitution et on obtient finalement la substitution suivante :

IF typeB = Permanent

THEN dueDateB := dueDateB

<+{(bIdB, mIdB) 7→ CurrentDateB+365} ELSE dueDateB := dueDateB

<+{(bIdB, mIdB) 7→ CurrentDate+loanDuration(mId )} END