Adloun

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".

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.