informatique (tronc commun des prépas scientifiques) · Chapitre 1 · Exercice de TD
Spécification, tests et preuve d'un algorithme
La discipline de programmation · niveau 3 (difficile)
Énoncé
Écrire, tester et prouver à l'aide d'un invariant une fonction renverse(t) renvoyant une nouvelle liste contenant les éléments de t dans l'ordre inverse, sans modifier t.
Corrigé
def renverse(t: list) -> list:
"""Renvoie une nouvelle liste contenant les éléments de t inversés.
Précondition : t est une liste.
Postcondition : renvoie une liste r de même longueur que t telle que
r[i] == t[len(t) - 1 - i] pour tout indice i. La liste t n'est pas modifiée.
"""
r = []
n = len(t)
for i in range(n):
# Invariant : r est égale aux i derniers éléments de t inversés : [t[n-1], ..., t[n-i]]
r.append(t[n - 1 - i])
return r
Jeu de tests associés :
assert renverse([1, 2, 3]) == [3, 2, 1]
assert renverse([]) == []
assert renverse([5]) == [5]
assert renverse([1, 2, 2]) == [2, 2, 1]
# Vérification de la non-altération de la liste originale t
t_original = [1, 2, 3]
renverse(t_original)
assert t_original == [1, 2, 3]
Démonstration de la preuve : L'invariant s'énonce : "au début de l'étape d'indice , la liste contient les derniers éléments de inversés".
- Initialisation () : Avant d'entrer dans la boucle, est vide, ce qui correspond bien aux 0 derniers éléments de . est vraie.
- Conservation : Supposons vraie. Durant l'étape , on ajoute à la fin de l'élément . Par conséquent, la nouvelle liste est constituée des derniers éléments de inversés. La propriété est donc vérifiée.
- Conclusion : À la sortie de la boucle (), la liste contient les derniers éléments de inversés, ce qui correspond à la liste complète inversée. Le calcul est correct.
Exercices semblables
- Variant non trivial — l'algorithme d'Euclide corrigé
- Invariant du maximum corrigé
- Le test de propriété corrigé
- La boucle qui ne termine pas toujours corrigé
- Le flottant qui trahit le test corrigé