29.12.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!