Spécification, tests et preuve d'un algorithme
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 1 — La discipline de programmation
É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.
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.