Une Boite `a Outils Pour la Preuve Formelle de Syst`emes Séquentiels
Une Boite `a Outils Pour la Preuve Formelle de Syst`emes Séquentiels
Une Boite `a Outils Pour la Preuve Formelle de Syst`emes Séquentiels
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
4.6. CHOIX D’UNE COUVERTURE 101<br />
<strong>la</strong> partition (g 0 ,g 1 ) telle que g 0 = λ⃗y.(¬y k ) et g 1 = λ⃗y.y k . Ce couple sépare le codomaine<br />
en <strong>de</strong>ux parties <strong>de</strong> même taille. On a (g 0 ◦ ⃗ f) = ¬f k , et (g 1 ◦ ⃗ f) = f k . Si srr est un<br />
restricteur d’image strict, alors le vecteur ( ⃗ f srr ε(f k )) est égal à<br />
([f 1 ...f k−1 ] srr ε(f k )) @ [ε(1)] @ ([f k+1 ...f n ] srr ε(f k )).<br />
Ainsi <strong>la</strong> fonction “vectochar-recurse” <strong>de</strong>vient :<br />
function vectochar-recurse( ⃗ f) : TDG;<br />
let [f 1 ...f n ] = ⃗ f and<br />
k = choose-in<strong>de</strong>x( ⃗ f) and<br />
⃗f ′ = [f 1 ...f k−1 f k+1 ...f n ] in<br />
return λ⃗y.( (¬y k ∧vectochar( ⃗ f ′ srr ¬f k )(y 1 ,...,y k−1 ,y k+1 ,...,y n )) ∨<br />
(y k ∧vectochar( ⃗ f ′ srr f k )(y 1 ,...,y k−1 ,y k+1 ,...,y n )));<br />
Figure 29. Premier algorithme <strong>de</strong> calcul <strong>de</strong> Img.<br />
Dans cet algorithme, <strong>la</strong> fonction “choose-in<strong>de</strong>x” retourne un in<strong>de</strong>x k. Par exemple,<br />
“choose-in<strong>de</strong>x”pourraittoujoursrendre1. Cettefonctionpeutplusintelligemmentutiliser<br />
<strong>de</strong>s heuristiques afin d’obtenir un in<strong>de</strong>x k, qui, dans <strong>la</strong> mesure du possible, permettra<br />
d’accélérer l’apparition <strong>de</strong> constantes dans ( ⃗ f ′ srr ε(f k )). On peut par exemple choisir<br />
<strong>de</strong> retourner l’in<strong>de</strong>x <strong>de</strong> <strong>la</strong> composante qui possè<strong>de</strong> le plus petit graphe, ou l’in<strong>de</strong>x <strong>de</strong> <strong>la</strong><br />
composante ayant le moins <strong>de</strong> variables.<br />
Grâce a cette fonction “vectochar-recurse”, le nombre <strong>de</strong> récursion <strong>de</strong> “vectochar” est<br />
borné par le nombre d’éléments <strong>de</strong> Img( ⃗ f,1). Donc si à chaque étape, <strong>la</strong> machine n’atteint<br />
qu’un re<strong>la</strong>tivement petit nombre d’états, cet algorithme est très efficace.<br />
4.6.2 Utilisation d’un partitionnement du domaine<br />
Choisissons [47] <strong>la</strong> partition (h 0 ,h 1 ) tel que h 0 = λ⃗x.(¬x k ) et h 1 = λ⃗x.x k . Ce couple sépare<br />
le domaine en <strong>de</strong>ux parties <strong>de</strong> tailles égales. Si srr est un restricteur d’image strict, nous<br />
avons ( ⃗ f srr h 0 ) = ⃗ f[x k ← 0] et ( ⃗ f srr h 1 ) = ⃗ f[x k ← 1], qui sont calculées en O(| ⃗ f|).<br />
Ainsi <strong>la</strong> fonction “vectochar-recurse” <strong>de</strong>vient :<br />
function vectochar-recurse( ⃗ f) : TDG;<br />
let x be a variable occurring in ⃗ f in<br />
return λ⃗y.(vectochar( ⃗ f[x ← 0]) ∨ vectochar( ⃗ f[x ← 1]));<br />
Figure 30. Deuxième algorithme <strong>de</strong> calcul <strong>de</strong> Img.<br />
La variable x n’apparait pas dans les graphes <strong>de</strong> ( ⃗ f srr ¬x) et <strong>de</strong> ( ⃗ f srr x). Si nous<br />
voulons exploiter le cache au maximum, nous <strong>de</strong>vons éviter que les vecteurs qui y sont<br />
conservés soient composés <strong>de</strong> nouveaux noeuds. En choisissant <strong>la</strong> variable <strong>de</strong> plus petit<br />
ordre dans ⃗ f, le calcul <strong>de</strong> ⃗ f[x ← 0] et ⃗ f[x ← 1] est seulement en O(k), où k est le nombre<br />
<strong>de</strong> composantes <strong>de</strong> ⃗ f, et aucun noeud n’est créé. Ce processus correspond à un parcours<br />
parallèle en profon<strong>de</strong>ur d’abord <strong>de</strong>s graphes <strong>de</strong> ⃗ f. Les seuls noeuds qui sont créés sont