Adloun

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

Le cours du chapitre · Tous les exercices du chapitre