UTA Année académique 2023-2024
IGL-3
TD n0 3 : Programmation avancée et Méthodes Formelles
Programmation avancée
Exercice 1.
Ecrire une fonction qui recherche séquentiellement le maximum dans un tableau.
1. Donner la spécification de ce problème :
a. Entrée et Sortie
b. Rôle
c. Précondition
d. Postcondition
2. Ecrire en python le problème ainsi spécifié
Exercice 2.
Partie I : Prouver la correction de ce programme
1. Commencer par trouver un invariant de boucle
a. Chercher une propriété qui vérifie la précondition, avant d’exécuter la boucle i.
b. On rentre ensuite dans la phase initialisation
i. L’invariant est-il vrai avant la première itération ?
c. Puis la phase conservation
i. L’invariant est-il maintenu vrai par une itération de la boucle ?
ii. Pour cela supposer que l’invariant est vraie pour l’indice i et montrer
qu’alors il est vrai pour l’indice i+1.
2. On rappelle qu’un algorithme se termine s’il ne boucle pas à l’infini. L’algorithme précédent
termine-t-il ? Justifier votre réponse.
Partie II : Terminaison d’un algorithme avec un variant de boucle
Dans cette partie, on considère l’algorithme de recherche séquentiel d’une occurrence.
1
1. On définit la notion de variant comme suit. Un variant est une expression à valeur entière
dépendant des variables impliquées dans la répétitive dont on peut démontrer que la valeur :
est positive ou nulle et elle décroit au cours des itérations. Justifier que la quantité 𝑙𝑒𝑛(𝑇) − 𝑖
est un variant. Pour prouver qu’un algorithme termine, il suffit de montrer qu’il ne boucle pas à
l’infini.
2. En déduire que l’algorithme termine.
N.B. :
1. Toute algorithme sans appel de fonction ni répétitive termine ;
2. Toute répétitive pour itère un nombre fini de fois (en Python) ;
3. Une répétitive tant que (et les appels récursifs) peut boucler à l’infini si sa condition reste
toujours vraie.
Exercice 1. On cherche à calculer la somme de deux polynômes représentés par des tableaux. Par exemple,
𝑋 5 + 3𝑋 4 + 5 est représenté par le tableau 5 ; 0; 0; 0; 3; 1.
1. Écrire une spécification du problème.
2. Écrire un programme solution.
3. Prouver la correction du programme par rapport à la spécification du problème.
Exercice 2. On cherche à déterminer l'élément minimum d'un tableau.
1. Écrire une spécification du problème.
2. Écrire un programme solution.
3. Prouver la correction du programme par rapport à la spécification.
Exercice 3.
1. Écrire un programme impératif prenant en entrée un entier n et permettant de calculer la somme des
n premiers entiers.
2. Prouver la correction du programme et sa terminaison
Exercice 4
On considère la fonction réalisant la division euclidienne 𝑎/𝑏 de deux entiers naturel 𝑎 et 𝑏 et
renvoyant le quotient 𝑞 et le reste 𝑟.
1) Prouver la terminaison de cet algorithme.
2) Chercher à montrer que ce code est correct. Conclure.
3) Proposer un exemple d’assertion soulignant le problème de correction de cette fonction.
4) Corriger ce programme et vérifier sa correction au regard des spécifications
2
Exercice 5
Voici un algorithme pour déterminer le plus grand élément d’une liste non vide de nombres.
Prouver sa correction
Exercice 4. Voici deux programmes pour calculer 2𝑛 avec un entier 𝑛 naturel
1) Dans le 1e programme, quel est le nombre d’affectations et de multiplications effectuées
dans le corps de la boucle en fonction de 𝑛 ? Evaluer le niveau de complexité.
2) Prouver la terminaison du 2e programme en estimant le nombre d’itérations.
3) Prouver la correction du 2e programme en considérant l’invariant de boucle 𝑝𝑏𝑚=2𝑛
4) Justifier alors que le niveau de complexité de cet algorithme est en 𝑂(𝑙𝑜𝑔2(𝑛))
Exercice. Démontrer que l’algorithme de tri par sélection terminent.
Exercice. Démontrer que l’algorithme de tri par insertion terminent.
3
4