Le plan du cours change d'année en année. Vous pouvez accéder au cours tel que je l'avais fait (ou avais prévu de le faire) en 2000-2001, 2001-2002, 2002-2003, 2003-2004, 2004-2005, 2007-2008.

Cours de sémantique (année 2008-2009)

Dans ce cours nous voulons que les étudiants apprennent à réfléchir sur le sens des programmes et le pouvoir expressif des langages de programmation. Ce cours repose sur une fondation théorique importante: vous devrez maîtriser des notions de logique et de calculabilité. Mais les applications pratiques de ce cours sont spectaculaires: c'est grâce aux concepts abordés dans ce cours que l'on est capable de mettre au point du logiciel critique, utilisable en avionique, en commerce électronique, ou en transport ferroviaire. Une bonne maîtrise de la sémantique des langages de programmation permet en effet de développer des compilateurs auxquels on peut faire confiance, des outils de vérification automatique pour éviter les erreurs de débordement, les trous de sécurité, etc, et des outils pour spécifier le comportement attendu du logiciel et vérifier que les programmes respectent leurs spécifications.

1. apprentissage du système Coq

Dans la première partie du cours, nous apprendrons à nous servir d'un système de démonstration sur ordinateur. Nous utiliserons ensuite ce système de démonstration sur ordinateur pour décrire précisément un petit langage de programmation, pour développer des outils manipulant des programmes de ce langage de programmation, et pour montrer que ces outils sont corrects, au sens où il permettent d'éviter l'introduction d'erreurs de programmation ou de détecter certaines classes d'erreurs.

Les notes pour le premier cours sont disponibles ici .

TD pour la première semaine

La première séance de travaux dirigés repose sur le document suivant. Un exemple supplémentaire est fourni dans cet exercice sur la somme de carrés

Devoir à la maison pour la première semaine

écrivez la fonction sop5 qui additionne les premieres puissances cinquièmes:

 1 + 32 + 243 + ... +n^5

Trouvez une formule de la forme : forall x, k*sop5 x = l*x^6 + .... puis démontrez que cette formule est correcte. Tout doit être fait dans Coq. (inspirez-vous de l'exemple sos).

2. Syntaxe et sémantique naturelle

Dans cette partie du cours nous montrons comment décrire les structures syntaxiques d'un petit langage de programmation. Ensuite nous montrons comment décrire le comportement des instructions de ce langage. Nous concluons en montrant comment tout ce travail peut être implémenté dans Coq. Le cours est principalement basé sur ces notes de cours.

TD pour la deuxième semaine

Téléchargez l'archive suivante et decompressez-la (unzip). Allez dans le répertoire td2 et tapez la commande make. Les exercices à faire sont dans le fichier td2.v.

Devoir à la maison pour la deuxième semaine

En vous inspirant du code dans les fichiers syntax.v, td2.v et boxes.v écrivez une fonction de type instr -> string qui affiche une instruction de façon lisible.

3. Logique de Hoare

Dans cette partie du cours, nous montrons comment on peut démontrer que les variables des programmes satisfont certaines propriétés. Ce cours introduit les notions de pré-condition post-condition et d'invariant de boucle. Les notes de ce cours sont disponibles ici.

TD pour la troisième semaine.

On fera le travail décrit dans ce fichier.

4. Calcul de précondition la plus faible

Dans cette partie du cours, nous étudions une méthode de vérification des programmes qui consistent à annoter ces derniers avec des propriétés logiques. Deux fonctions peuvent être définies pour calculer la condition la plus faible pour que le programme soit appelé dans les conditions prévues par les annotations et les conditions logiques pour que le programme soit cohérent avec ses annotations. Dans le cours, on démontre que ces fonctions sont correctes, au sens ou leur comportement est équivalent à la construction d'une dérivation de logique de Hoare.

TD pour la quatrième semaine

On fera le travail décrit dans ce fichier.

Devoir à la maison pour la quatrième semaine

Ecrivez dans le langage de programmation impératif étudié en cours un programme qui calcule la racine carrée de l'une de ses entrées, lorsque cette entrée est positive. Annotez le programme pour exprimer cette spécification et démontrez que le programme satisfait la spécification en utilisant le théorème vcg_correct du quatrième TD.

TD pour la cinquième semaine

Pas de cours pour cette semaine. Nous allons reprendre des preuves autour de la sémantique naturelle (comme en deuxième semaine). Le sujet du TD est disponible ici.