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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!