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.
L'objectif de ce cours est d'introduire les étudiants aux différentes techniques utilisées pour décrire exactement le comportement des programmes. Ce cours est organisé en 6 séances de 2 heures, accompagnées de 6 séances de Travaux dirigés sur machine.
La première séance a pour objectif de présenter la sémantique naturelle. Les notes de cours ont la forme d'un article d'une dizaine de pages, postscript compressé.
Dans ces TD, nous construisons des dérivations d'exécution pour plusieurs programmes. Nous tâcherons d'évaluer la taille de ces dérivations et nous verrons comment automatiser la construction. Nous nous reposerons sur l'utilisation d'un système de démonstration sur ordinateur appelé Jape. Ce système est disponible sur la majeure partie des machines Unix et Macintosh. Nous utiliserons pour notre cours un fichier de configuration appelé little.jt (aussi en postscript compressé).
La deuxième séance a pour objectif de présenter la sémantique dénotationelle. Les notes de ce cours sont disponibles en postscript compressé.
Vous pouvez accéder au sujet du TD.
Pour la troisième séance nous approfondissons les notions d'ordre partiels complets. Voici des notes de cours correspondant approximativement au contenu de cette séance.
Dans ces TD, nous construisons un programme en Scheme qui implémente les différentes fonctions mathématiques décrite dans la première partie du cours. L'objectif est donc de construire:
La quatrième séance revient sur la sémantique naturelle, en étudiant cette fois-ci la sémantique d'un petit langage fonctionnel. Les notes de cours sont disponibles.
Dans ce TD, nous allons construire un interprète pour le petit langage fonctionnel vu en cours.
On considère que les expressions du langage considéré sont de la forme suivante:
(if e e e) | (lambda x e) | fix | (app e e) | n | v | (plus e e) | (greater e e) | (minus e e)
Dans cette leçon, nous utiliserons des environnements qui sont des listes de paires (variable . valeur). Les valeurs pourront être des valeurs entières, ou bien des closures, c'est à dire des expressions de la forme suivante:
(closure (lambda (x) e) environnement)
Dans ce langage fonctionnel les valeurs associées aux variables ne sont jamais mises à jour. On n'aura donc pas besoin de fonction "update". En revanche on pourra encore utiliser une fonction lookup.
tester cette fonction sur les expressions suivantes:
(eval-miniml '() '(plus 2 3)) (eval-miniml '() '(greater 3 2)) (eval-miniml '((x . 1)) '(plus 2 x)) (eval-miniml '((x . 2)) '(minus 3 x))
(eval-miniml '() '(app (lambda x (plus 2 x)) 3)) (eval-miniml '() '(app (lambda x (app (lambda f (app (lambda x (app f 3)) 4)) (lambda y (plus 2 x))))
La dernière commande devrait retourner 5 ou 7 -- laquelle de ces deux valeurs à votre avis?)
'(closure (lambda f (app f (lambda x (app (app fix f) x)))) ())
tester avec la commande suivante:
(eval-miniml '() '(app (lambda f (app f 3)) (app fix (lambda sum (lambda x (if (greater 1 x) 0 (plus x (app sum (minus x 1)))))))))
'(closure (lambda f (app f (app fix f))) ())
Que se passe-t-il? Pouvez-vous expliquer ce phénomène?
(eval-miniml (app (app "votre fonction" 3) 4))doit retourner 12. Donner également une expression de ce langage qui représente la factorielle.
La solution de ces TD est disponible: programme scheme pour l'interprète du langage fonctionnel. Pour les étudiants intéressés, j'ai aussi une : sémantique naturelle en format Jape (aussi en postscript compressé), mais pour une sémantique différente de celle présentée en cours.
Voici l'examen de l'année 2000-2001 et la correction
Voici quelques exercices qui auraient pu servir d'examen exercices2.ps.gz et leurs reponses2.ps.gz.