• Aucun résultat trouvé

Abstraction des fonctions bool´eennes

7.2

Abstraction des fonctions bool´eennes

Dans cette section, nous d´efinissons une algorithme d’abstraction des fonctions r´eelles `a valeur dans B = {0, 1}. Cet algorithme utilise des techniques classiques d’analyse par intervalles pour construire une repr´esentation abstraite des fonctions bool´eennes. Dans toute cette section, B⊥

repr´esentera le treillis complet des valeurs bool´eennes donn´e par la d´efinition 7.2 ci-dessous.

D´efinition 7.2 (Treillis complet des valeurs bool´eennes) Nous noterons B⊥ le treillis

complet des valeurs bool´eennes tel que B⊥ = {⊥, 0, 1, ⊤} muni de l’ordre ⊑ repr´esent´e par le

diagramme de Hasse ci-dessous. L’´el´ement 0 repr´esente la valeur “faux”, 1 repr´esente la valeur “vrai”.

0 1

7.2.1

Repr´esentation d’une fonction bool´eenne

Nous allons abstraire une fonction bool´eenne par sa repr´esentation spatiale, c’est-`a-dire un recouvrement de son domaine de d´efinition en un ensemble de rectangles tel que la fonction est constante sur chaque rectangle. Cette repr´esentation est donn´ee sous forme d’arbres r´eguliers appel´es octree.

D´efinition 7.3 (Recouvrement d’un hyperrectangle) Soit n∈ N et b ∈ In

Run hyperrectangle

de dimension n. On dira qu’un ensemble I(b) =©b1, . . . , bm

ª

d’´el´ements de In

Rest un recouvrement

de b si et seulement si b =m i=1bi.

Nous allons utiliser des repr´esentations r´eguli`eres des fonctions bool´eennes, c’est-`a-dire que le recouvrement du domaine de d´efinition sera obtenu en divisant les intervalles de d´efinition dans chaque direction en deux. Cette technique n’est pas forc´ement optimale dans tous les cas, mais elle est la plus g´en´erale et la plus simple `a mettre en place lorsque l’on consid`ere des fonctions bool´eennes incluant des calculs potentiellement non lin´eaires.

D´efinition 7.4 (Recouvrement r´egulier d’un hyperrectangle) Soit b ∈ In

R un rectangle

de dimension n. On notera Split(b) le recouvrement de b tel que |Split(b)| = 2n, et si b =

¡

b1, b2, . . . , bn

¢

avec∀i ∈ [1, n], bi∈ IR, alors on a :

Split(b) =˘(b′1, . . . , b′n) : ∀i ∈ [1, n], b ′

i= [bi, mid(bi)] ou b′i= [mid(bi), bi]¯ .

Rappelons que pour un intervalle x∈ IR, x est la borne inf´erieure de x, x sa borne sup´erieure et

mid(x) = x−x2 est le milieu de x.

Exemple 7.2 En dimension 2, on a par exemple

D´efinition 7.5 (Octrees) Un octree de dimension n est un graphe dirig´e, acyclique, ayant une racine unique et deux types de noeuds :

– les noeuds non terminaux de la forme N (b), avec b∈ In R;

– les noeud terminaux de la forme V (v) avec v∈ {0, 1, ⊤} ; et tel que pour tout b∈ In

R, le noeud N (b) a soit un noeud fils de la forme V (v) soit 2nnoeuds fils

non terminaux N1(b1), N2(b2), . . . , N2n(b2n) avec{bi : i∈ [1, 2n]} = Split(b). Le noeud racine

d’un octree T doit ˆetre un noeud non terminal, et on dira que T est de domaine b ∈ In R si son

noeud racine est N (b). On notera b = dom(T ).

Remarque (1) Le terme octree est g´en´eralement utilis´e pour le cas de la dimension 3 uniquement ; en dimension 2, on parle de quadtree Par abus de notation, nous utilisons le mˆeme terme pour toutes les dimensions.

Remarque (2) Une autre repr´esentation possible des fonctions bool´eennes consiste `a utiliser des Diagrammes de D´ecision Intervalles (Interval Decision Diagrams, ou IDD [Str99]) qui sont une g´en´eralisation des Binary Decision Diagrams, ou BDD. Cette forme d’arbre permet g´en´eralement une repr´esentation plus compacte des fonctions bool´eennes car elle autorise un partitionnement non r´egulier du domaine de d´efinition. Cependant, elle est moins pratique `a utiliser pour la repr´esentation de fonctions fortement non lin´eaires, ce qui sera souvent le type de fonctions que nous rencontrerons. En effet, les fonctions bool´eennes qui nous int´eressent sont d´efinies par la par- tie de contrˆole des programmes embarqu´es qui contiennent souvent des calculs non lin´eaires (par exemple pour des filtres) ainsi que des instructions de branchement conditionnel. L’algorithme de construction de la repr´esentation que nous utiliserons (voir section 7.2.2) est un algorithme de branch and bound, et nous devons donc pouvoir facilement calculer un partitionnement du domaine de la fonction. La repr´esentation par octree nous semble donc plus adapt´ee.

Exemple 7.3 La figure 7.1 repr´esente un octree de dimension 2 et de profondeur 3. Les noeuds non terminaux sont repr´esent´es par des rectangles et les noeuds terminaux par des cercles.

[0, 10]× [0, 10] [0, 5]× [0, 5] 1 [0, 5]× [5, 10] 0 [5, 10]× [0, 5] [5, 7.5]× [0, 2.5] ⊤ [5, 7.5]× [2.5, 5] 0 [7.5, 10]× [0, 2.5] 1 [7.5, 10]× [2.5, 5] ⊤ [5, 10]× [5, 10] 0

Fig.7.1 – Exemple d’un octree de dimension 2 et de profondeur 3.

Intuitivement, un octree T est la repr´esentation de toutes les fonctions bool´eennes f telles que, si T poss`ede un noeud N (b) avec un seul noeud fils V (v), avec b∈ In

R et v∈ B⊥, alors f v´erifie

f (x) ⊑ v pour tout x ∈ b. L’ordre ⊑ est ici l’ordre sur le treillis abstrait B⊥ : si v ={0, 1}, on

devra alors avoir f (x) = v, et si v =⊤, alors la valeur de f(x) est inconnue. Nous d´efinissons donc formellement cette notion de repr´esentation d’une fonction par un octree.

7.2. ABSTRACTION DES FONCTIONS BOOL´EENNES 141

D´efinition 7.6 (Application d’un octree) Soit T un octree de dimension n et de domaine D∈ In

R, et soit x∈ D. On note alors T (x) la valeur associ´ee `a x dans l’octree T , d´efinie par :

T (x) = v tel que∃ N(b′)∈ T : x ∈ b′ et N (b′) a un seul fils V (v) .

Exemple 7.4 Soit T l’octree de la figure 7.1. On a alors : T¡(3, 1.5)¢= 1 et T¡(6, 1.2)¢=⊤. Remarque La complexit´e du calcul de l’application d’un octree `a une valeur r´eelle est faible : le calcul peut clairement ˆetre effectu´e en un temps lin´eaire en la profondeur de l’octree, et donc logarithmique en la taille du domaine d’entr´ee.

D´efinition 7.7 (Repr´esentation d’une fonction bool´eenne) Soit D ∈ In

R et f : D → B

une fonction bool´eenne. On dira qu’un octree T de dimension n est une repr´esentation de f si et seulement si∀x ∈ D, f(x) ⊑ T (x).

Clairement, il n’existe pas une unique repr´esentation pour un fonction bool´eenne f . En parti- culier, si on note dom(f )⊆ Rn le domaine de d´efinition de f , alors l’octree N¡dom(f )¢:: V (⊤)

est toujours une repr´esentation de f . Pour distinguer deux repr´esentations diff´erentes d’une mˆeme fonction f , nous introduisons une relation de pr´eordre sur l’ensemble des octrees qui est compatible avec la notion naturelle de pr´ecision de la repr´esentation : on dira qu’une repr´esentation est plus pr´ecise qu’une autre si elle renvoie moins souvent la valeur⊤. Rappelons qu’un pr´eordre est un ordre partiel ne disposant pas de la propri´et´e d’antisym´etrie.

D´efinition 7.8 (Pr´ecision de la repr´esentation : pr´eordre sur les graphes) Soit T et T′

deux octrees avec dom(T ) = dom(T′) = D. On dira que Test plus pr´ecis que T si et seulement

si ∀x ∈ D, T (x)⊑ T (x). On notera alors T¹ T . La relation ¹ est un pr´eordre sur l’ensemble

des octrees de mˆeme domaine.

Exemple 7.5 L’octree de la figure 7.1 est plus pr´ecis que l’octree suivant :

[0, 10]× [0, 10] [0, 5]× [0, 5] 1 [0, 5]× [5, 10] ⊤ [5, 10]× [0, 5] ⊤ [5, 10]× [5, 10] 0

Remarque Le pr´eordre¹ n’est pas un ordre partiel car nous n’avons pas d´efini de forme normals sur les octrees. On peut en effet construire deux octree T et T′tels que pour tout x, T (x) = T(x)

mais tels que T et T′ ont des profondeurs diff´erentes. On peut assez facilement d´efinir une forme

normale sur les octrees (entre deux octrees T et T′ v´erifiant T ¹ Tet T¹ T , il suffit par exemple

de prendre celui de profondeur minimale), et on peut alors utiliser toujours la forme normale ; le pr´eordre¹ devient alors un ordre partiel. Nous ne d´etaillerons pas le m´ecanisme de normalisation des octree, mais dans notre impl´ementation, nous calculerons toujours les formes normales.

7.2.2

Algorithme d’abstraction d’une fonction bool´eenne

Nous montrons maintenant comment on peut construire un octree qui soit une repr´esentation d’une fonction bool´eenne φ : D → B, avec D ∈ In

R. Pour cela, nous devons d’abord d´efinir une

fonction d’inclusion, ou fonction abstraite, pour φ, c’est-`a-dire une fonction ˜φ : In

R → B⊥ qui soit

une abstraction sˆure de φ.

D´efinition 7.9 (Fonction d’inclusion bool´eenne) Soit φ : Rn → B une fonction bool´eenne.

On dira qu’une fonction ˜φ : In

R→ B⊥ est une fonction d’inclusion pour φ si elle v´erifie :

∀b ∈ IRn, α

¡

{φ(x) : x ∈ b}¢⊑ ˜φ(b) (7.1)

o`u α :P(B) :→ B est l’abstraction classique des ensembles de valeurs bool´eennes vers le treillis abstrait B et⊑ est l’ordre partiel sur B.

Exemple 7.6 Soit φ : R2

→ B la fonction d´efinie par ∀x, y ∈ R2, φ(x, y) =

½

1 si x = y

0 sinon . La

fonction ˜φ : I2

R→ B⊥ d´efinie par ˜φ([x] , [y]) =

½

0 si [x]∩ [y] = ∅

⊤ sinon est une fonction d’inclusion pour φ.

Nous n’expliquons pas comment obtenir cette fonction d’inclusion pour toute fonction φ : Rn

→ B. Intuitivement, les calculs num´eriques effectu´es dans φ seront traduits en leurs ´equivalents sur le domaine des intervalles, et les tests seront surapproxim´es. Par exemple, la fonction φ(x) = x≤ 3 sera traduite en : ˜φ([x]) =    1 si x≤ 3 0 si x > 3 ⊤ sinon

. Nous expliquerons `a la section 7.3 comment on peut construire cette fonction d’inclusion pour le cas qui nous int´eresse, c’est-`a-dire lorsque la fonction bool´eenne est une fonction de la forme : “´etant donn´ee une entr´ee X, la ligne n du programme peut elle ˆetre ex´ecut´ee ?”. `A l’aide d’une fonction d’inclusion ˜φ pour une fonction φ : D→ B avec D⊆ Rn, on peut construire un octree repr´esentant φ.

D´efinition 7.10 (Calcul de la repr´esentation d’une fonction bool´eenne) Soit n ∈ N et D ∈ In

R un domaine born´e. Soit une fonction φ : D → B et soit ˜φ : IRn → B⊥ une fonction

d’inclusion pour φ. Soit Nmax ∈ N une profondeur maximale. On d´efinit alors Tφ l’octree de

profondeur maximale Nmax repr´esentant φ par : Tφ = ConstruireOctree( ˜φ, D, 0, Nmax), o`u

ConstruireOctreeest la fonction donn´ee par l’algorithme 3.

Remarque La fonction ConstruireOctree est d´ecroissante en Nmax : plus Nmax est ´elev´e, plus

l’octree construit est pr´ecis.

Exemple 7.7 Soit D = [0, 10]× [0, 10] ⊆ R2 et φ : D

→ B la fonction d´efinie par ∀x, y ∈ D, φ(x, y) = ¡d¡(x, y), (3.5, 6)¢ ≤ 1¢¡d¡(x, y), (7, 1.2)¢ ≤ 1¢, o`u d est la fonction distance. Autrement dit, φ teste si un point (x, y) est `a une distance inf´erieure `a 1 du point (3.5, 6) ou du point (7, 1.2). L’algorithme de la d´efinition 7.10 donne les octree de la figure 7.2 pour des pr´ecisions Nmax∈ {1, 4, 6, 10}. Les parties vertes sont les zones o`u l’octree vaut 0, les zones jaunes celles o`u

l’octree vaut 1, et les zones rouges signifient que l’octree renvoie⊤. Proposition 7.1 Soit D ⊆ Rn et φ : D

→ B une fonction bool´eenne. Si ˜φ est une fonction d’inclusion pour φ, alors pour tout Nmax ∈ N, T =ConstruuireOctree( ˜φ,D,1,Nmax) est une

7.2. ABSTRACTION DES FONCTIONS BOOL´EENNES 143

Nmax= 6 Nmax= 10

Nmax= 1 Nmax= 4

Fig. 7.2 – R´esultats obtenus par l’algorithme ConstruireOctree pour la fonction de l’exemple 7.7.

Entr´ee : ˜φ : In

R → B⊥; /* Fonction `a abstraire */

Entr´ee : D⊆ In

R ; /* Domaine de d´efinition */

Entr´ee : N∈ N ; /* Pr´ecision actuelle */

Entr´ee : Nmax∈ N ; /* Pr´ecision maximale */

R´esultat : T de domaine D et de hauteur maximale Nmax− N telle que

∀x ∈ D, φ(x) ⊑ T (x) d´ebut x = ˜φ(D); si x =⊤ ∧ N < Nmax alors list = Split(D); res = N (D);

pour tout ´el´ement l∈ list faire

aux = ConstruireOctree( ˜φ, l, N + 1, Nmax);

res = N (D) :: aux; finpour sinon res = N (D) :: V (x); finsi renvoyer res; fin

Algorithme 3 : ConstruireOctree( ˜φ,D,N ,Nmax) : fonction de construction d’un octree

repr´esentant une fonction φ.