Nous aborderons les sujets suivants.
- Introduction : langages et grammaires, notion de problème, systèmes logiques, formalisation des mathématiques et applications à l'informatique, limites de l'informatique, notion de résolution effective (incomplétude, décidabilité), modèles opératoires.
- Modèles de calcul : machines de Turing, notion de calculabilité, lambda-calcul, systèmes de réécriture, équations diophantiennes, thèse de Turing/Church, équivalences ; application aux paradigmes de programmation (impératif, fonctionnel, objet, logique).
- Définitions des langages de programmation : syntaxe, typage, notion de point fixe, sémantique opérationnelle (McCarthy, 1963), sémantique axiomatique (Hoare, 1969), sémantique dénotationnelle (Milne et Strachey, 1976).
- Complexité : types de complexité, non-déterminisme, complexité temporelle, problèmes NP-complets, théorème de Cook, complexité spatiale, théorèmes de hiérarchies.
- Aspects avancés : randomisation, informatique quantique, calcul ADN.
Ces concepts seront concrétisés durant des travaux pratiques tels que :
- génération d'un analyseur lexical et syntaxique à partir d'une grammaire ;
- initiation à la programmation fonctionnelle (OCaml) ;
- mathématiques constructives en Coq ;
- sémantique axiomatique et preuve de programmes ;
- programmation d'un algorithme quantique.
Le mode d'évaluation sera fonction de l'assiduité et, en partie, du nombre d'élèves présents et de leurs préférences : présentations orales, élaboration d'une critique d'un article, travaux pratiques ou restitutions par groupe des travaux pratiques.