TD 8 : TABLEAUX ET BOUCLES (AVANCÉ) Exercice 1 : Inversion de tableau Proposer un algorithme optimal d’inversion de tableau (dont le nom sera A) dans le langage J-While. On ne considérera que la division entière et la longueur du tableau A sera notée A.length Exercice 2 : Conception par contrat On souhaite tester correctement notre algorithme, c’est-à-dire proposer une contractualisation complète du code. Question 2.1 : Précondition et postcondition. On pose les prédicats suivants: def • prédicat “trié” : T (A, d, f ) = ∀i ∈ N, 0 ≤ i < f − 1 =⇒ A[i] < A[i + 1] def • prédicat “trié en ordre inverse” : T I(A, d, f ) = ∀i ∈ N, 0 ≤ i < f − 1 =⇒ A[i] > A[i + 1] Entourer le programme de l’exercice 1 des préconditions et postconditions qui vous semblent reflêter le fait que l’inversion d’un tableau trié produit un tableau trié en sens inverse. Question 2.2 : Variant et invariant. Par simulation sur deux exemples de tableaux de tailles 5 et 6, proposez: • Un variant de boucle V décroissant par pas de 1 et terminant en 0 • Un invariant de boucle I qui permettrait de déduire selon-vous les préconditions et postcondition proposées • Une condition d’arrêt CA que l’on ajoutera à I et qui garantit que l’algorithme termine pour i (sans suppose que i vaut 0 au début). Il s’agira donc de fournir un intervalle pour i. Question 2.3 : Algorithme contractualisé. Ajouter au code de l’algorithme les vérification du contrat pour le variant V et l’invariant I Exercice 3 : logique de Hoare On veut prouver dans cet exercice que nos contrats sont corrects (ce qui nous permettra de ne pas rendre nécessaire l’exécution du code de vérification). Plus que les détails (assez fastidieux) de la preuve, on s’appliquera à bien suivre la méthodologie de preuve en logique de Hoare, en comptant et nommant correctement les étapes. 1