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 T′ est 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 ¹ T′ et 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 φ.