Description de module pour les modules centraux

Transcription

Description de module pour les modules centraux
Description du module
Theoretical Computer Science
Généralités
Désignation du module
Theoretical Computer Science
Catégorie du module
Approfondissement technique et scientifique
Périodes
2 périodes de cours et 1 période d’exercice par semaine
Brève description /Explication des objectifs et du contenu du module en quelques phrases
Ce module a pour objectif d’approfondir les aspects théoriques fondamentaux de l’informatique. Dans ce cours, l’étudiant
apprendra que la notion de :
• langage formel et théorie des automates sont des concepts essentiels à la caractérisation de différents types de problèmes et
de calcul ;
• calculabilité/décidabilité sont deux concepts nécessaires pour expliquer le fait que de nombreux problèmes semblent pouvoir
se résoudre de manière intuitive alors qu’aucune solution algorithmique n’est envisageable ;
• complexité est liée au temps et/ou à l’espace nécessaire pour résoudre un problème ; bien des problèmes très pratiques
rencontrés par les ingénieurs demeurent toutefois intraitables, c’est-à-dire qu’ils ne peuvent être résolus en temps ou dans un
espace raisonnable ;
• programmation fonctionnelle jette un solide pont entre les mathématiques et la conception de logiciel. Cette programmation
possède des caractéristiques qui la rend attractive pour un prototypage logiciel rapide, des manipulations mathématiques ainsi
que pour la transformation de programmes.
Objectifs, contenu et méthodes
Objectifs d'apprentissage et compétences visées
• Comprendre que les trois formalismes, à savoir : automates à états finis, grammaires et expressions régulières sont
équivalents et définissent l’ensemble des langages réguliers. Les automates à états finis et les expressions régulières seront
illustrés par des exemples en relation avec l’analyse lexicale, les modèles à base d’états, les protocoles de communication et
la vérification formelle.
• Se rendre compte qu’il n’est pas possible d’utiliser les langages réguliers pour décrire les langages de programmation. En
revanche, les grammaires non contextuelles se révèlent plus adaptées et sont capables de décrire tous les langages de
programmation modernes. L’analyse syntaxique (« Parsing ») est étroitement liée aux langages non contextuels. Des
générateurs d'analyseurs syntaxiques seront utilisés pour illustrer les techniques d'analyse « top-down » et « bottom-up ».
• Etre conscient que beaucoup de problèmes sont indécidables, ce qui veut dire qu’aucun algorithme ne peut les résoudre. En
d’autres termes, tout n’est pas calculable. De tels problèmes apparaissent, par exemple, dans des systèmes d’exploitation
(problème du verrou mortel ou « dead lock »), des langages de programmation (décision de sous-typage), et la vérification
formelle.
• Comprendre que les problèmes décidables sont classifiés selon les ressources (temps et/ou espace) nécessaires à leur
résolution, et connaître les classes de complexité les plus importantes (P, NP, EXP, PSpace), leurs différences ainsi que leurs
relations (hiérarchie).
• Comprendre le concept de non-déterminisme, lequel joue un rôle essentiel dans l’étude de la complexité. La complexité en
temps polynomiale non-déterministe (NP) contient une classe de problèmes très pratiques qui sont intraitables (classe de
problèmes NP-complets). La cryptologie, la vision par ordinateur, divers problèmes d’optimisation et bien d’autres domaines
encore sont concernés par cette notion de problèmes intraitables. Les étudiants seront capables de démontrer que de tels
problèmes sont intraitables et chercheront à contourner la difficulté par d’autres moyens. Un grand nombre de problèmes
connus pour être NP-complets seront présentés et étudiés.
• Sensibiliser les étudiants à un autre paradigme de programmation, à savoir le paradigme fonctionnel. Un langage de
programmation fonctionnel moderne, intitulé Haskell, sera présenté et utilisé par les étudiants. Les étudiants pourront
constater que les concepts de haut niveau de ce type de programmation accélèrent notablement le développement
informatique et encouragent la vérification formelle. De plus, les programmes développés au moyen de langages fonctionnels
s’avèrent plus robustes.
Contenu du module
Ce module se divise en quatre parties:
1. Langages et automates
a. Alphabets, mots, langages formels, grammaires
b. Automates à états finis, grammaires/langages réguliers, expressions régulières, non-déterminisme
c. Automates à pile (« pushdown automata »), grammaires/langages non contextuels
d. Machines de Turing, lambda-calcul
2. Calculabilité/décidabilité
a. Différents modèles de calcul, thèse Church/Turing
b. Réduction d’un problème à un autre
c. Problèmes décidables/indécidables
d. Fonctions calculables/non calculables
3. Complexité
a. Types de complexité (temps, espace)
b. Classes de complexité, complexité en temps polynomiale, NP, réduction polynomiale, NP-complétude
c. Techniques d’approximation
4. Programmation fonctionnelle
a. Typage polymorphique, transparence référentielle, évaluation paresseuse
b. Types : typage fort, fonctions polymorphes, inférence de types
c. Fonctions : définitions, « pattern matching », « curryfication », fonction d’ordre supérieur
d. Liste : manipulation, récursion, induction
Plan du module avec pondération des contenus d’enseignement
Semaine
Chapitres
1
Langages et automates
2
Définitions de base, types d’automates et relations avec les types de langages, hiérarchie des langages,
3
machines de Turing, lambda-calcul.
4
Calculabilité/décidabilité
5
Définition de la notion calcul, similarités entre problèmes et langages, modèles de calcul, décidabilité/
6
indécidabilité de problèmes.
7
Complexité
8
Classification de problèmes selon les ressources nécessaires (temps, espace), classes de complexité les
9
plus importantes (P, NP, EXP, PSpace), définition de la classe NP-complet et de la notion de problèmes
10
intraitables, importance de cette notion en pratique, techniques d’approximation afin de contourner les
11
difficultés liées aux problèmes NP-complets.
12
Programmation fonctionnelle
13
Principes de la programmation fonctionnelle, différences par rapport à la programmation impérative,
14
aspects de haut niveau (polymorphisme, récursion, « pattern matching », fonctions d’ordre supérieur)
Organisation du module (p. ex. division en cours)
Les chapitres de ce module recouvrent quatre domaines ou “blocs” d’enseignement différents. Chaque bloc pourra être
enseigné par une personne différente.
Bloc
Titre
Semaines
1
Langages et automates
1-3
2
Théorie du calcul
4-6
3
Complexité
7-11
4
Programmation fonctionnelle
12-14
Méthodes d’enseignement et d’apprentissage
• Enseignement ex cathedra
• Présentation et discussion de problèmes théoriques
• Discussion d’exemples pratiques afin de réduire le fossé entre la théorie et la pratique
• Exercices et travail personnel sur des sujets choisis
Connaissances et compétences prérequises
Bonnes connaissances en programmation, algorithmes et mathématiques discrètes.
Bibliographie
nd
• Introduction to the Theory of Computation, Michael Sipser, Course Technology, 2 Edition, 2006.
• Computers Ltd.: What They Really Can't Do, David Harel, Oxford University Press, 2000.
• Introduction to automata theory, languages, and computation, J.E. Hopcroft and J.D. Ullman, Addison-Wesley Publishing
Company, Reading, MA, 1979.
nd
• Haskell: The Craft of Functional Programming, Simon Thompson, Addison-Wesley, 2 Edition, 1999.
Mode d’évaluation
Conditions d’admission aux examens de fin de module (tests exigés)
Examen écrit de fin de module
Durée de l’examen
120 minutes
Moyens autorisés
10 pages de résumé

Documents pareils

INF7541 - Département d`informatique

INF7541 - Département d`informatique Applications diverses: les compilateurs, théorie du contrôle, systèmes de transitions, synthèse de processus communicants, compression d'images, etc.

Plus en détail