Adloun

Donner l'invariant de la boucle de recherche , et mener les trois…

Exercice de TD · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Parcourir et prouver

Énoncé

Donner l'invariant de la boucle de recherche, et mener les trois étapes de la démonstration.

Corrigé

L'invariant. Avant le tour d'indice , aucun des éléments t[0..i-1] n'est égal à v.

Remarquez la forme : l'invariant porte sur ce qui est derrière la frontière, et il énonce une absence. C'est normal — tant qu'on n'a rien trouvé, tout ce qu'on sait est ce qu'on n'a pas vu.

Initialisation. Avant le premier tour, : la tranche t[0..-1] est vide, et « aucun élément d'une tranche vide n'est égal à v » est vrai — vrai par vacuité, comme toute propriété universelle sur l'ensemble vide.

Conservation. Supposons l'invariant vrai avant le tour . Le tour teste t[i] == v. Si le test est vrai, la fonction sort par return i : il n'y a pas de tour suivant, il n'y a rien à conserver. S'il est faux, alors t[i] n'est pas égal à v non plus, donc aucun élément de t[0..i] ne l'est : l'invariant vaut avant le tour .

Terminaison. Deux sorties possibles, et il faut traiter les deux.

La vérification machine. La postcondition entière, y compris la primauté de l'occurrence, a été testée sur tableaux tirés au hasard :


r = recherche(t, v)
if r == -1:
    assert all(x != v for x in t)
else:
    assert 0 <= r < len(t) and t[r] == v
    assert all(t[k] != v for k in range(r))     # c'est bien la PREMIERE

cas passent. Mais la preuve, elle, vaut pour tous les tableaux — y compris ceux que le tirage n'a pas produits. C'est toute la différence.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.