la recherche d'un élément par dichotomie dans un ... - Verimag
la recherche d'un élément par dichotomie dans un ... - Verimag
la recherche d'un élément par dichotomie dans un ... - Verimag
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Langages Automates Non-déterminisme Grammaires Attibuées et Génératives Expressions régulières<br />
Correction Partielle de Programmes<br />
Ceci n'est pas <strong>un</strong> cours de C++<br />
1.1 Application à <strong>un</strong> cas plus réaliste<br />
Algorithme de <strong>recherche</strong> <strong>d'<strong>un</strong></strong> <strong>élément</strong> x <strong>par</strong> <strong>dichotomie</strong> <strong>dans</strong> <strong>un</strong> tableau T croissant<br />
0: d=0; f=N;<br />
1: while(true){<br />
2: if(d>f)<br />
3: { present=false; break;}<br />
4: else<br />
5: { m=(d+f)/2;<br />
6: if (x==T[m]){ present=true; break; }<br />
7: else if (xT[m]){ d=m+1; }<br />
9: }<br />
10: }<br />
11: return present;<br />
où l'instruction return valeur se traduit <strong>par</strong> l'aectation de <strong>la</strong> valeur à <strong>un</strong>e variable réservée, result,<br />
destinée à recevoir le résultat <strong>d'<strong>un</strong></strong> programme.<br />
et x/y correspond à <strong>la</strong> <strong>par</strong>tie entière de x y<br />
notée x ÷ y en math.<br />
Exemples 1 ÷ 2 = 0, (−1) ÷ 2 = 0, 5 ÷ 2 = 2, (−5) ÷ 2 = −2, 2n ÷ 2 = (2n + 1) ÷ 2 =<br />
n, (2n − 1) ÷ 2 = n − 1<br />
Automate de Von Neumann correspondant à l'algorithme précédent<br />
q 0<br />
d←0 ; f←N<br />
q 2<br />
d←m+1<br />
q 8<br />
q 1<br />
d≤f<br />
<br />
d>f<br />
f←m−1<br />
q 7<br />
present←false<br />
q 11<br />
result←present<br />
q s<br />
q 4<br />
m←(d+f)÷2<br />
x>T [m]<br />
q 5<br />
x
On prétend que ce programme satisfait <strong>la</strong> propriété de correction<br />
∧<br />
result = true ⇒ x ∈ T [0..N] result = false ⇒ x /∈ T [0..N]<br />
où x ∈ T [0..N] est l'abbréviation de ∃i ∈ [0..N], x = T [i]<br />
1.1.1 Exemple de rédaction de preuve de correction <strong>par</strong>tielle<br />
Montrons, <strong>par</strong> <strong>la</strong> méthode de Floyd-Hoare, que lorsqu'on atteint l'état de sortie q s <strong>la</strong> propriété de<br />
correction est satisfaite.<br />
def<br />
∧<br />
En q s : ψ s = result = true ⇒ x ∈ T [0..N] result = false ⇒ x /∈ T [0..N]<br />
result←present<br />
En q 11 : on détermine ψ 11 d'après ψ s en utilisant <strong>la</strong> transition q 11 −−−−−−−−−−→ q s<br />
ψ 11<br />
def<br />
= ψ s [result ← present]<br />
def<br />
= <strong>la</strong> propriété ψ s <strong>dans</strong> <strong>la</strong>quelle on remp<strong>la</strong>ce <strong>la</strong> variable result <strong>par</strong> present<br />
def<br />
∧<br />
= present = true ⇒ x ∈ T [0..N] present = false ⇒ x /∈ T [0..N]<br />
present←false<br />
En q 2 : on détermine ψ 2 d'après ψ 11 en utilisant <strong>la</strong> transition q 2 −−−−−−−−−→ q 11<br />
ψ 2<br />
def<br />
= ψ 11 [present ← false]<br />
def<br />
= false = true ⇒ x ∈ T [0..N]<br />
} {{ }<br />
false<br />
≡ false ⇒ . . .<br />
} {{ }<br />
≡<br />
true<br />
x /∈ T [0..N]<br />
∧<br />
∧<br />
false = false ⇒ x /∈ T [0..N]<br />
true ⇒ x /∈ T [0..N] ≡ true<br />
∧ x /∈ T [0..N]<br />
En q 1 : on détermine ψ 1 d'après ψ 2 en utilisant <strong>la</strong> transition q 1 −−−→ q 2<br />
Principe Rappelons qu'on doit montrer <strong>la</strong> propriété x /∈ T [0..N] en q 2 . On cherche donc<br />
<strong>un</strong>e propriété en q 1 qui, avec le test d > f, implique <strong>la</strong> propriété ψ 2 en q 2 .<br />
.} .{{ . . .}.<br />
∧ d > f =⇒ x /∈ T [0..N]<br />
} {{ }<br />
ψ 1 ψ 2<br />
Pour déduire x /∈ T [0..N] de d > f qui n'ont a priori rien en comm<strong>un</strong>, on fait <strong>un</strong> raisonnement <strong>par</strong><br />
contradiction ; c'est-à-dire qu'on chercher <strong>un</strong>e propriété ψ 1 de <strong>la</strong> forme x ∈ T [0..N] ⇒ . . . où <strong>la</strong> <strong>par</strong>tie<br />
. . . devra faire ap<strong>par</strong>aître d et f et donnera <strong>un</strong>e contradiction avec d > f.<br />
def<br />
On choisit de prendre ψ 1 = x ∈ T [0..N] ⇒ x ∈ T [d..f] qui donne <strong>la</strong> contradiction souhaitée. En<br />
eet, x ∈ T [d..f] ∧ d > f ≡ false car x ne peut ap<strong>par</strong>aître <strong>dans</strong> le sous-tableau T [d..f] qui ne contient<br />
pas d'<strong>élément</strong> puisque d est après f. Ce raisonnement permet de montrer l'implication<br />
(x ∈ T [0..N] ⇒ x ∈ T [d..f])<br />
} {{ }<br />
ψ 1<br />
∧ d > f =⇒ x /∈ T [0..N]<br />
} {{ }<br />
En q 8 : on détermine ψ 8 d'après ψ 1 en utilisant <strong>la</strong> transition q 8 −−−−−→ q 1 .<br />
def<br />
ψ 8 = ψ 1 [d ← m + 1] def<br />
= x ∈ T [0..N] ⇒ x ∈ T [m + 1..f]<br />
ψ 2<br />
d>f<br />
d←m+1<br />
x>T [m]<br />
En q 5 : on détermine ψ 5 d'après ψ 8 en utilisant <strong>la</strong> transition q 5 −−−−−→ q 8 . On cherche ψ 5 telle que<br />
.} .{{ . . .}.<br />
∧ x > T [m] =⇒ x ∈ T [0..N] ⇒ x ∈ T [m + 1..f]<br />
} {{ }<br />
ψ 5<br />
On choisit<br />
ψ 8<br />
2
def<br />
ψ 5 = T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
Remarque : T [0..N] croissant et x > T [m] permet de montrer que x ∈ T [m + 1..N] mais<br />
ne sut pas pour montrer que x est situé avant f. Il faut donc ajouter <strong>la</strong> seconde condition qui<br />
dit que si x est <strong>dans</strong> le tableau alors il est <strong>dans</strong> le sous-tableau qui se termine à f.<br />
m←(d+f)÷2<br />
En q 4 : on détermine ψ 4 d'après ψ 5 en utilisant <strong>la</strong> transition q 4 −−−−−−−−→ q 5 . On choisit<br />
def<br />
ψ 4 = ψ 5 [m ← (d + f) ÷ 2] def<br />
= T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
Remarque : La propriété ψ 5 ne mentionne pas m, donc le remp<strong>la</strong>cement de m <strong>par</strong> (d+f)÷2<br />
n'a pas d'eet et on trouve que ψ 4 = ψ 5 . Ce<strong>la</strong> signie que le calcul de m ne joue auc<strong>un</strong> rôle<br />
<strong>dans</strong> <strong>la</strong> preuve de correction ; ce qui peut <strong>par</strong>aître surprenant. En fait, ce calcul est important<br />
<strong>dans</strong> <strong>la</strong> preuve de terminaison de l'algorithme mais n'a pas d'impact sur <strong>la</strong> preuve de correction.<br />
✞<br />
☎<br />
d≤f<br />
En q 1 : ✝VÉRIFICATION ✆: on utilise <strong>la</strong> transition q 1 −−−→ q 4 pour s'assurer que les propriétés que<br />
nous avons choisies forme <strong>un</strong>e chaîne d'implications qui est préservée <strong>par</strong> les itérations (c'est-à-dire les<br />
chemins de q 1 à q 1 ).<br />
On vérie que<br />
x ∈ T [0..N] ⇒ x ∈ T [d..f] ∧ d ≤ f<br />
} {{ }<br />
ψ 1<br />
?<br />
=⇒ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
} {{ }<br />
La seconde <strong>par</strong>tie de <strong>la</strong> propriété ψ 4 est trivialement satisfaite puisqu'elle ap<strong>par</strong>aît en prémisse de<br />
l'implication (c'est ψ 1 ). Par contre <strong>la</strong> première <strong>par</strong>tie de ψ 4 n'est pas <strong>un</strong>e conséquence de <strong>la</strong> prémisse.<br />
On doit réviser notre choix de ψ 1 et prendre :<br />
def def<br />
ψ 1 = ψ 4 = T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
Ceci entraîne des révisions en cascade des propriétés qu'on a déterminées à <strong>par</strong>tir de ψ 1 . On doit donc<br />
reprendre les raisonnements depuis q 1 .<br />
def<br />
ψ 8 = ψ 1 [d ← m + 1] def<br />
= T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [m + 1..f]<br />
?<br />
Avec ces modications, l'implication ψ 1 ∧ d ≤ f =⇒ ψ 4 est trivialement satisfaite car elle est de <strong>la</strong><br />
forme P ∧ Q ⇒ P donc nos choix sont validés : les propriétés ψ 1 , ψ 4 , ψ 5 , ψ 8 , ψ 2 , ψ 11 , ψ s sont donc des<br />
invariants des états q 1 , q 4 , q 5 , q 8 , q 2 , q 11 , q s respectivement.<br />
En q 0 : on détermine les conditions initiales ψ 0 d'après ψ 1 en utilisant <strong>la</strong> transition q 0 −−−−−−−−→ q 1<br />
ψ 4<br />
d←0 ; f←N<br />
ψ 0<br />
def<br />
= ψ 1 [d ← 0 ; f ← N] def<br />
= T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [0..N]<br />
} {{ }<br />
def<br />
= T [0..N] croissant<br />
true<br />
Donc l'algorithme fonctionne pour n'importe quel tableau croissant (contenant ou non le x cherché).<br />
3
Exercice : Terminez <strong>la</strong> preuve en complétant les pointillés<br />
1.2 Principe de <strong>recherche</strong> et de validation des invariants avec multiples révisions<br />
Illustration sur <strong>la</strong> preuve de correction <strong>par</strong>tielle (suite et n) de l'algorithme de <strong>recherche</strong> <strong>d'<strong>un</strong></strong><br />
<strong>élément</strong> x <strong>par</strong> <strong>dichotomie</strong> <strong>dans</strong> <strong>un</strong> tableau T croissant.<br />
f←m−1<br />
En q 7 : on détermine ψ 7 d'après ψ 1 en utilisant <strong>la</strong> transition q 7 −−−−−→ q 1<br />
ψ 7<br />
def<br />
= ψ 1 [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ]<br />
def<br />
= T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d.. . . . . . . . . . . . . . . . .]<br />
En q 6 : on détermine ψ 6 d'après . . . . . . . . . en utilisant <strong>la</strong> transition q 6<br />
present←true<br />
−−−−−−−−−→ . . . . . . .<br />
ψ 6<br />
def<br />
= . . . . . . . . .[present ← true]<br />
def<br />
= . . . . . . . . . . . = true<br />
} {{ }<br />
⇒ x ∈ T [0..N]<br />
∧<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . = false<br />
} {{ }<br />
⇒ x /∈ T [0..N]<br />
≡<br />
≡<br />
. . . . . . . . . . .<br />
true ⇒ x ∈ T [0..N]<br />
x ∈ T [0..N] ∧ true<br />
∧<br />
. . . . . . . . . . . . ⇒ . . .<br />
} {{ }<br />
true<br />
. . . . . . . . . . . .<br />
≡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
x=T [m]<br />
Pour valider ψ 6 il faut montrer que c'est <strong>un</strong>e conséquence de |psi 5 après <strong>la</strong> transition q 5 −−−−−→ q 6 .<br />
Remarque On va voir que ce<strong>la</strong> nous oblige à renforcer <strong>la</strong> propriété ψ 5 en lui ajoutant de<br />
nouvelle contrainte. Pour l'instant on a déterminé ψ 5 en s'intéressant seuleument à <strong>la</strong> transition<br />
x>T [m]<br />
q 8 −−−−−→ q 5 . Autrement dit, on a choisi ψ 5 pour qu'elle garantisse ψ 8 . Mais il y a trois transition<br />
qui <strong>par</strong>tent de q 5 vers q 6 , q 7 et q 8 . Il faut donc que <strong>la</strong> propriété ψ 5 garantisse les propriétés<br />
ψ 6 , ψ 7 , ψ 8 .<br />
En q 5 : on détermine les contraintes supplémentaires de ψ 5 d'après ψ 6 en utilisant <strong>la</strong> transition<br />
q 5<br />
x=T [m]<br />
−−−−−→ q 6 de sorte qu'on ait :<br />
? . . .? } {{ }<br />
∧ . . . . . . . . . . . . . . . . . . . . . . . . .<br />
} {{ }<br />
ψ 5<br />
test<br />
=⇒ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
} {{ }<br />
Le test x = T [m] sut à montrer que x ∈ T [0..N] à condition que . . . . .<br />
. . . . . . . . . . . . . . . . On ajoute donc à <strong>la</strong> propriété ψ 5 <strong>la</strong> condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
ψ 6<br />
ap<strong>par</strong>tienne à l'interval<br />
def<br />
ψ 5 = . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
Ce<strong>la</strong> nous oblige à réviser les propriétés que l'on a déterminées à <strong>par</strong>tir de ψ 5 c'est-à-dire ψ 4 , ψ 1 et<br />
ψ 8 , ψ 0 .<br />
4
ψ 5<br />
ψ 4<br />
ψ 1<br />
ψ 7<br />
ψ 0<br />
def<br />
= . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
def<br />
= ψ 5 [m ← (d + f) ÷ 2] (cf. cours)<br />
def<br />
= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∈ [0..N] ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
def<br />
= ψ 4 (cf. cours)<br />
def<br />
= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∈ [0..N] ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..f]<br />
def<br />
= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
def<br />
= ( . . . + . . . . . . . . . . . . . . . .) ÷ 2 ∈ [0..N] ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [d..m − 1]<br />
def<br />
= ψ 1 [d ← 0 ; f ← N] (cf. cours)<br />
def<br />
= ( . . . . . . . . . . . . . . . . ) ÷ 2 ∈ [0..N]<br />
} {{ }<br />
true<br />
∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [0..N]<br />
} {{ }<br />
. . . . . . . . . . .<br />
ψ 8<br />
≡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
def<br />
= ψ 1 [d ← m + 1] (cf. cours)<br />
def<br />
= ( . . . . . . . . . . . . . . . . + . . . ) ÷ 2 ∈ [0..N] ∧ T [0..N] croissant ∧ x ∈ T [0..N] ⇒ x ∈ T [m + 1..f]<br />
Pour valider ψ 7 on doit considérer <strong>la</strong> transition . . . . .<br />
de . . . . . .<br />
et du test x < T [m].<br />
On doit montrer l'implication :<br />
x
preuve : m ∈ [0..N] et 1 ∈ [1..1] impliquent m + 1 ∈ [1..N + 1].<br />
Avec f ∈ [0..N] on a m + 1 + f ∈ [1..2N + 1] et donc (m + 1 + f) ÷ 2 ∈ [1 ÷ 2..(2N + 1) ÷ 2] = [0..N]<br />
On est conduit à <strong>un</strong>e nouvelle révision de ψ 5 et des propriétés qui en dépendent. Pour plus de c<strong>la</strong>rté<br />
on ne fait désormais ap<strong>par</strong>aître que les nouvelles propriétés à valider.<br />
ψ 5<br />
ψ 4<br />
ψ 1<br />
ψ 7<br />
ψ 0<br />
ψ 8<br />
def<br />
= m ∈ [0..N] ∧ d, f ∈ . . . . . . . . . . . . . . . ∧ . . .<br />
def<br />
= ψ 5 [m ← (d + f) ÷ 2]<br />
def<br />
= (d + f) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ . . .<br />
def def<br />
= ψ 4 = (d + f) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ . . .<br />
def<br />
= ψ 1 [f ← m − 1]<br />
def<br />
= (d + m − 1) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ . . .<br />
def<br />
= ψ 1 [d ← 0 ; f ← N]<br />
def<br />
= (0 + N) ÷ 2 ∈ [0..N]<br />
} {{ }<br />
true<br />
def<br />
= ψ 1 [d ← m + 1]<br />
∧ . . . . . . . . . . .<br />
∈ [0..N] ∧ . . .<br />
} {{ }<br />
true<br />
def<br />
= (m + 1 + f) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧ . . .<br />
Qu'y a t'il de nouveau <strong>dans</strong> cette révision ?<br />
Pour valider ψ 8 on doit montrer que m + 1 ∈ [0..N] sachant (d'après ψ 5 ) que m ∈ [0..N]. C'est<br />
impossible. En eet, si d = N et f = N alors m = (N + N) ÷ 2 = . . . . . et m + 1 . . . . N ; donc les<br />
propriétés concernant d, f doivent être plus subtiles.<br />
De <strong>la</strong> même manière pour valider ψ 7 , on doit montrer que m − 1 ∈ [0..N] sachant (d'après ψ 5 ) que<br />
m ∈ [0..N]. C'est impossible. En eet, si d = . . . et f = . . . alors m = (d + f) ÷ 2 = . . . et m − 1 < . . ..<br />
On constate que les seuls cas qui nous ennuie sont les cas d = f = m = N et d = f = m = 0. Il ne<br />
posent pas <strong>un</strong> réel problème puisque <strong>dans</strong> ces deux cas il n'y aura pas de nouvelle itération.<br />
On choisit donc d'ajouter <strong>la</strong> contrainte d ≤ f ⇒ d, f ∈ [0..N] à ψ 1 , c'est-à-dire qu'à l'état<br />
q 1 on s'intéresse aux valeurs de d, f <strong>un</strong>iquement lorsque d ≤ f.<br />
On modie à nouveau les propriétés :<br />
ψ 5<br />
ψ 4<br />
ψ 1<br />
ψ 7<br />
def<br />
= m ∈ [0..N] ∧ d, f ∈ [0..N] ∧ . . .<br />
def<br />
= ψ 5 [m ← (d + f) ÷ 2]<br />
def<br />
= (d + f) ÷ 2 ∈ [0..N] ∧ d, f ∈ [0..N] ∧ . . .<br />
def<br />
= (d + f) ÷ 2 ∈ [0..N] ∧ d ≤ f ⇒ d, f ∈ [0..N] ∧ . . .<br />
def<br />
= ψ 1 [f ← m − 1]<br />
def<br />
= (d + m − 1) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . ⇒ . . . . . . . . . . . . . . . . . . . . . . ∈ [0..N] ∧ . . .<br />
6
ψ 0<br />
ψ 8<br />
def<br />
= ψ 1 [d ← 0 ; f ← N]<br />
def<br />
= (0 + N) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . ⇒ . . . . . . . . . . . ∈ [0..N]<br />
} {{ }<br />
def<br />
= ψ 1 [d ← m + 1]<br />
true(trivial)<br />
∧ . . .<br />
def<br />
= (m + 1 + f) ÷ 2 ∈ [0..N] ∧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ⇒ . . . . . . . . . . . . . . . . . . . . . . ∈ [0..N] ∧ . . .<br />
Qu'y a t'il de nouveau <strong>dans</strong> cette révision ?<br />
Pour ψ 0 <strong>la</strong> nouvelle contrainte se réduit trivialement à true. Donc elle n'ajoute pas de . . . . . . . . . . . . . . . . . . . . . . . . .<br />
d' . . . . . . . . . . . . . . . . . . . . . . . . . . . de l'algorithme.<br />
Pour valider ψ 8 il faut montrer que m + 1 ≤ f ⇒ m + 1, f, (m + 1 + f) ÷ 2 ∈ [0..N] sachant (d'après<br />
ψ 5 ) que m, f ∈ [0..N].<br />
preuve : m ∈ [0..N] donc m + 1 ∈ [ . . .. . . . . . . . . . . . . . . ] or . . . . . . . . . . . . . . ≤ f et f ∈ [0..N] donc<br />
m + 1 ∈ [ . . ... . . . .] ⊆ [0..N].<br />
Pour valider ψ 7 il faut montrer que d ≤ m − 1 ⇒ d, m − 1 ∈ [0..N] sachant (d'après ψ 5 ) que<br />
m, d ∈ [0..N].<br />
preuve : m ∈ [0..N] donc m − 1 . . . . N or . . . . . . . . . . . . . . . . . . . . . . . . et d ∈ [0..N] donc . . ≤ m + 1<br />
d'où m − 1 ∈ [0..N].<br />
Pour valider ψ 4 on doit considérer <strong>la</strong> transition q 1 −−−→ q 4 et on doit montrer que<br />
ψ 1 ∧ d ≤ f<br />
?<br />
=⇒ ψ 4<br />
preuve (à rédiger): On se contente de prouver les nouvelles <strong>par</strong>ties de ψ 4 .<br />
Pour valider ψ 5 on doit considérer <strong>la</strong> transition q 4 −−−−−−−−→ q 5 : que doit-on montrer ?<br />
d≤f<br />
m←(d+f)÷2<br />
ψ<br />
. . .<br />
=⇒ ψ<br />
. . .<br />
[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .]<br />
preuve : L'implication est évidente (de <strong>la</strong> forme P ⇒ P ) puiqu'on a choisi<br />
def<br />
ψ 4 = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
Pour valider ψ 1 il faut considérer toutes les transitions qui arrivent en q 1 . Il y en a trois. Il faut donc<br />
faire trois preuves ; elles sont triviales (expliquez pourquoi).<br />
1. transition q 0<br />
d←0 ; f←N<br />
−−−−−−−−→ q 1 : que faut-il montrer ?<br />
2. transition q 7<br />
f←m+1<br />
−−−−−→ q 1 : que faut-il montrer ?<br />
3. transition q 8<br />
d←m−1<br />
−−−−−→ q 1 : que faut-il montrer ?<br />
Conclusion<br />
On a associé des propriétés à chaque état et montré que ce sont des invariants d'état c'est-à-dire qu'elles<br />
sont valides à chaque fois qu'on passe <strong>dans</strong> ces états.<br />
L'invariant ψ s associé à l'état de sortie q s<br />
def<br />
ψ s = result = true ⇒ x ∈ T [0..N]<br />
∧<br />
result = false ⇒ x /∈ T [0..N]<br />
7
nous garantit que l'algorithme eectue <strong>un</strong>e <strong>recherche</strong> d'<strong>élément</strong> <strong>dans</strong> <strong>un</strong> tableau.<br />
L'invariant ψ 0 associé à l'état d'entré q 0 nous donne les conditions d'utilisation de l'algorithme<br />
def<br />
ψ 0 = T [0..N] croissant<br />
Elles indiquent que l'algorithme exige que le tableau soit trié <strong>dans</strong> l'ordre croissant.<br />
8