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
Applications diverses: les compilateurs, théorie du contrôle, systèmes de transitions, synthèse de processus
communicants, compression d'images, etc.