% INF6120 — Programmation fonctionnelle et logique % UQAM — Département d'informatique % Plan de cours — Été 2023 * Horaires, locaux et enseignants: Responsable(s) du cours ======================= Coordination ------------ Stiévenart, Quentin Enseignement ------------- Stiévenart, Quentin Groupes: 050 Description du cours ==================== Objectifs --------- Faire l'acquisition de nouvelles techniques et stratégies de programmation par l'apprentissage des concepts fondamentaux des langages de programmation fonctionnels et logiques. Apprécier l'apport de ces langages au développement logiciel. Sommaire du contenu ------------------- La récursion comme méthode générale de résolution de problèmes. Bref historique de la programmation fonctionnelle. Effet de bord, référence immuable et évaluation des expressions. Répartition par appariement de motifs. Fonctions comme argument et valeur de retour. Stratégies d'évaluation des arguments. Polymorphisme et déduction des types. Fermetures, *curryage* et application partielle. Fonctions d'ordre supérieur (`map`, `reduce/fold`, `filter`). Patrons de conceptions fonctionnels (foncteurs, monoïdes, applicatifs, monades, transformateurs de monades). Bref historique de la programmation déclarative et logique. Règles, inférence et clauses de Horn. Recherche par retour arrière et déduction. Unification et résolution. Coupure et négation. Programmation par contraintes, consistance d'arc, de chemins et problèmes de satisfaction de contraintes. Comparaison des approches de programmation logique et par contraintes. Modalité d'enseignement ----------------------- Ce cours comporte une séance obligatoire de laboratoire (2 heures). Préalables académiques ---------------------- - INF1131 - Mathématiques pour informaticien ou INF1132 - Mathématiques pour l'informatique ou MAT1060 - Mathématiques algorithmiques - INF2120 - Programmation II Objectif du cours ================= Ce cours vise à initier à la programmation fonctionnelle et logique. Il cherche à illustrer et à mettre en évidence les techniques de programmation propres à ces paradigmes. Il illustre leur potentiel et leur intérêt pour la mise en œuvre d'application complexes. Les compétences développées dans le cadre de ce cours vous rendront capable: - de connaître chacun des paradigmes, - d'apprécier les possibilités et les limites de chacun d'eux, - de développer des applications dans chacun des paradigmes. Contenu du cours ================ Ce cours initie à des approches de programmation originales et différentes de la programmation impérative ou objet. Il met en évidence les caractéristiques, le potentiel de chacun de ces paradigmes au moyen d'une introduction à des langages spécifiques et d'applications typiques de ces langages. Haskell permet de donner un exemple de langage fonctionnel puissant et moderne où les aspects liés aux types de données (vérification, polymorphisme, encapsulation) sont particulièrement développés. Prolog sert à illustrer le concept de programmation logique et les apports liés aux processus d'unification et de résolution Caractérisation générale des paradigmes étudiés dans le cadre du cours: programmation fonctionnelle et programmation logique. 1. La programmation fonctionnelle : Haskell - introduction: historique et concepts de base, - aspects syntaxiques et sémantiques des langages applicatifs, - récursivité et types récursifs, - vérification de types, inférence de types, polymorphisme, - fonctions d'ordre supérieur et curryage, - types abstraits, encapsulation, modules et foncteurs, - les entrées-sorties et les monades, - le mécanisme de l'évaluation paresseuse. 2. La programmation logique : Prolog - introduction: historique et concepts de base, - les faits et le principe d'unification, - les règles et la résolution, - les listes et la récursivité, - exemples d'applications. Modalités d'évaluation ====================== Description sommaire Pondération ---------------------- ------------- TP1 (fonctionnel) 20% Examen intra 30% TP2 (logique) 20% Examen final 30% Pour réussir le cours, la moyenne des **examens** et des **travaux pratiques** doit être supérieure ou égale à 50% (double seuil). L'utilisation de documents est permise aux examens. Les cartes d'étudiant seront contrôlées et exigées au début de chaque examen. À moins d'indication contraire, les travaux pratiques doivent être réalisés individuellement. Une pénalité de 1% par **heure** de retard sera appliquée. La qualité du français constitue un critère d'évaluation pour un maximum de 10% de la note. La note finale (en lettre, A+, A, etc.) pour le trimestre sera attribuée en fonction de l'atteinte des objectifs spécifiques à travers les évaluations. La distribution des résultats dans le groupe pourrait aussi être utilisée. Aucune autre opportunité (travail supplémentaire, etc.) d'augmenter le nombre de points ne sera accordée. Les règlements concernant le plagiat seront strictement appliqués. Pour plus de renseignements, consultez le site suivant : Références ========== Pour la partie fonctionnelle : - Lipovaca, M. [Learn you a Haskell for Great Good!](http://learnyouahaskell.com/) - Lipovaca, M., Robert, V. (traducteur). [Apprendre Haskell vous fera le plus grand bien](https://haskell.fr/lyah/) - O'Sullivan, B., Goerzen, J., Stewart, D.B. [Real World Haskell](https://book.realworldhaskell.org/read/) Pour la partie logique : - Flach, P. [Simply Logical](https://book.simply-logical.space/src/simply-logical.html) - Triska, M. [The Power of Prolog](https://www.metalevel.at/prolog)