Algorithmique et Programmation Fonctionnelle (APF) Algorithmique et Programmation Fonctionnelle (APF) RICM3 Cours 1 : Introduction à OCaml Jean-François Monin, Benjamin Wack 2016 - 2017 1 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Qui ? Où ? Quand ? Enseignants I Cours : Jean-François Monin & Benjamin Wack I TD groupe 1 : Erwan Jahier I TD groupe 2 : Jean-François Monin I TP : Erwan Jahier & Benjamin Wack I (échanges ponctuels) Horaires réguliers I COURS : Mardi 8h-9h30 Polytech I TD : Mardi 9h45-11h45 I TP : Mercredi 8h Polytech 009 binômes tirés au hasard (apporter vos machines !) Consulter ADE 2 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Les moyens Matériel I Install Party : Linux + OCaml + Tuareg + emacs I Polys de TD et TP I Page Web (outils, planning, documents...) http://www-verimag.imag.fr/~wack/APF Ressources recommandées I http://caml.inria.fr/ I Demander de l’aide aux enseignants 3 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Note APF Note finale = 60 % Devoirs + 40% CC Devoirs I 1 DS I 1 Exam CC I 1 DM I 8 TPs (quitus global) I 1 Projet (2 TP + travail en autonomie) 4 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Les rendus TP I Questions préliminaires à préparer avant I Compte-rendu à envoyer par mail lundi matin avant 8h I Correction : revue de code au début du TP suivant DM Énoncé distribué une semaine avant Projet TP-Projet (2 séances) à rendre à la fin du semestre Travail non rendu à temps Copier quelle que soit la source ) ⇒ ZERO pour toutes les personnes impliquées 5 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Votre travail Rappel : volume de travail (4 ETCS = 4*24h) I I I I 15h 20h 18h 50h Amphi TD TP Travail personnel Travail personnel pour cette UE I Préparation des TDs suite au cours I Exercices chaque semaine + DM I TP par groupe, préparés à l’avance I Projet I révisions... 6 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Objectifs du cours Savoir faire I Utiliser le paradigme fonctionnel. I Utiliser la récursivité et les structures de données correspondantes. I Concevoir des algorithmes efficaces et corrects. Moyens I Programmation fonctionnelle en Objective Caml. (Caml = Categorical Abstract Machine Language) I Typage I Raisonnement par récurrence structurelle. I Initiation aux calculs de complexité. 7 / 31 Algorithmique et Programmation Fonctionnelle (APF) Présentation du cours Plan Présentation du cours Motivations Expressions et types de base Définition d’un identifiant 8 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Plan Présentation du cours Motivations Expressions et types de base Définition d’un identifiant 9 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Qu’est-ce qu’un programme ? 10 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Qu’est-ce qu’un programme ? La traduction d’un algorithme dans un langage commun à l’homme et à la machine. 10 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Qu’est-ce qu’un programme ? La traduction d’un algorithme dans un langage commun à l’homme et à la machine. Qu’est-ce qu’un algorithme ? 10 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Qu’est-ce qu’un programme ? La traduction d’un algorithme dans un langage commun à l’homme et à la machine. Qu’est-ce qu’un algorithme ? Une procédure de résolution d’un problème, suffisament élémentaire pour être exécutée de façon automatique. 10 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Différents paradigmes de programmation 1. Impératif Fortran (1954), COBOL (1960), C (1970)... 2. Fonctionnel Lisp (1959), Haskell (1990), Objective CAML (1996)... 3. Logique Prolog (1972) 11 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation impérative Programmation impérative Centrée sur la notion d’affectation x := E I x est un emplacement mémoire I E est une expression : sa valeur v est temporairement associée à x. x est aussi traditionnellement appelée une variable. 12 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation impérative Modèle de calcul État Définit les données représentées en mémoire à un instant donné. L’état peut être très complexe, utiliser des pointeurs Les ingrédients des algorithmes I Une instruction indique une transition d’état. I Combinaisons d’instructions (if, boucles...) Pour comprendre un programme Il faut étudier l’effet de toutes les instructions sur toutes les parties de l’état dans toutes les situations atteignables. Problème : les variables sont de véritables savonettes. 13 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation impérative Comprendre un programme Pour raisonner sur un programme Il faut étudier l’effet de toutes les instructions sur toutes les parties de l’état dans toutes les situations atteignables. Problème : les variables sont de véritables savonettes. Exemple x := 3 Donne x = 3 x := x+1 Donne quoi ? On peut survivre Cf. matières A&G et API 14 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Programmation fonctionnelle Centrée sur la notion d’expression Toute expression a une valeur et un type. I Déterminés une fois pour toutes. I La valeur ne dépend pas de l’ordre d’évaluation. Description d’un algorithme I Un algorithme est une fonction d’un ensemble de valeurs dans un autre. I Une fonction est souvent décrite elle-même à partir de fonctions (analyse descendante). I Utilisation intensive de la récursivité I Manipulation aisée des données grâce au filtrage (English : pattern-matching) 15 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Comprendre un programme fonctionnel Raisonnement facilité I On ne se préoccupe que de la valeur et du type. I Raisonnement par cas sur les différentes valeurs possibles + raisonnement par récurrence. I Raisonnement équationnel : toute expression peut-être remplacée par une expression égale. Passe plus facilement à l’échelle Y compris pour des preuves formelles en présence de données complexes 16 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Mythes et réalités sur la programmation fonctionnelle Ce que l’on évite I Pas de contrôle : chemins d’exécution indifférents I Pas de pointeurs : pas de corruption des valeurs Ce que l’on ne perd pas I Efficacité : Interpréteur, compilateur → code-octet ou natif I Possibilité d’utiliser des traits impératifs (à bon escient) Ce que l’on gagne I Taille du code typiquement 1/10 du code C équivalent I Gestion mémoire automatique 17 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Prix à payer Effort I Changement de perspective I Moins adapté à l’embarqué ou à la programmation système de bas niveau (un peu comme Java) Support I Communauté très active dans le « libre » I Bibliothèques en quantité moyenne mais d’excellente qualité 18 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Un « vrai » langage Caml et ses avatars développés depuis ' 25 ans, principalement dans des laboratoires d’informatique français. Applications I Domaine de prédilection : traitement symbolique I I I analyse de programmes : ASTREE (CNRS & INRIA) aide à la démonstration : Coq (INRIA) compilation I Programmation système : SLAM (Microsoft) I Programmation réseau : MLdonkey (peer to peer multiplateformes, premier client open source d’eDonkey) I Milieux scientifiques, domaine bancaire (Jane Street)... Un exemple : est passé de Java à OCaml en cours de développement pour gagner en robustesse. 19 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Caractéristiques de OCaml Expressivité I Typage statique avec inférence de types et polymorphisme I Types définissables et filtrage I Gestions des exceptions Développement I Gestion de la mémoire I Modules paramétrables (foncteur) I Compilateur natif et bytecode I Système de classe évolué (objets) I Open source 20 / 31 Algorithmique et Programmation Fonctionnelle (APF) Motivations Programmation fonctionnelle Programme du Cours 1. Bases de OCaml 2. Programmation et preuve par récurrence structurelle 3. Analyse syntaxique 4. Modularité 5. Mécanismes de typage 6. Lambda Calcul 7. Structures et traits impératifs 21 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Plan Présentation du cours Motivations Expressions et types de base Définition d’un identifiant 22 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Types de base opérateurs : + - * / mod I int 42 I float -3.1 0. I bool true false I et aussi char, string... cf doc. OCaml -12 1.3e-4 opérateurs : +. -. *. /. opérateurs : && || not 23 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Types de base opérateurs : + - * / mod I int 42 I float -3.1 0. I bool true false I et aussi char, string... cf doc. OCaml -12 1.3e-4 opérateurs : +. -. *. /. opérateurs : && || not Expression = assemblage de constantes et d’opérateurs qui respecte les contraintes de type Chaque opérateur est typé (arguments attendus et valeur calculée). 23 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expressions à base d’opérateurs I 2+3 I 2.x +. 3. I (2 + 5) * 3 I 2=5 I 2<5 I true && false I (2 < 5) && 2 = 5 24 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; I (if 5 < 9 then 21 else 3) *2 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; I (if 5 < 9 then 21 else 3) *2 I (if true then 21 else 3) *2 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; I (if 5 < 9 then 21 else 3) *2 I (if true then 21 else 3) *2 I 21*2 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; I (if 5 < 9 then 21 else 3) *2 I (if true then 21 else 3) *2 I 21*2 I 42 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Expressions et types de base Expression conditionnelle I I “if b then e1 else e2 ” Pas une instruction mais une expression dont la valeur dépend de b Exemple : (if 5 < 9 then 21 else 3) * 2 ; ; I (if 5 < 9 then 21 else 3) *2 I (if true then 21 else 3) *2 I 21*2 I 42 Les opérateurs booléens sont paresseux : Dans e1 && e2 l’expression e2 n’est pas évaluée si e1 vaut false Dans e1 || e2 l’expression e2 n’est pas évaluée si e1 vaut vrai 25 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Plan Présentation du cours Motivations Expressions et types de base Définition d’un identifiant 26 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Identifiants Définition d’un identifiant : let let associe un identifiant à une valeur calculée par une expression # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = ? 27 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Identifiants Définition d’un identifiant : let let associe un identifiant à une valeur calculée par une expression # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 27 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Identifiants Définition d’un identifiant : let let associe un identifiant à une valeur calculée par une expression # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 Explications I let y = x - 11 ; ; I x est associé à la valeur 53. I donc x - 11 a la valeur de 53 - 11. I val y : int = 42 Pas d’état, pas de variables 27 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Redéfinition d’un identifiant Un identifiant est un nom donné à une valeur. Exemple # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 # let x = 2 ; ; val x : int = 2 # y;; - : int = ? 28 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Redéfinition d’un identifiant Un identifiant est un nom donné à une valeur. Exemple # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 # let x = 2 ; ; val x : int = 2 # y;; - : int = ? -9 ou 42 28 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Redéfinition d’un identifiant Un identifiant est un nom donné à une valeur. Exemple # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 # let x = 2 ; ; val x : int = 2 # y;; - : int = ? -9 ou 42 28 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Redéfinition d’un identifiant Un identifiant est un nom donné à une valeur. Exemple # let x = 53 ; ; val x : int = 53 # let y = x - 11 ; ; val y : int = 42 # let x = 2 ; ; val x : int = 2 # y;; - : int = ? -9 ou 42 On peut même écrire let x = x + 1 mais on ne peut pas s’en servir pour calculer (pas de boucles !) 28 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Compléments sur le let Variantes I Avec type spécifié let (a : t) = expr ; ; I Définitions multiples let a = 1 and b = 2 29 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Compléments sur le let Variantes I Avec type spécifié let (a : t) = expr ; ; I Définitions multiples let a = 1 and b = 2 Gare à la casse # let eta = 0 ; ; # let eTa = 1 ; ; # eta = eTa ; ; 29 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Compléments sur le let Variantes I Avec type spécifié let (a : t) = expr ; ; I Définitions multiples let a = 1 and b = 2 Gare à la casse # let eta = 0 ; ; # let eTa = 1 ; ; # eta = eTa ; ; - : bool = false 29 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Compléments sur le let Variantes I Avec type spécifié let (a : t) = expr ; ; I Définitions multiples let a = 1 and b = 2 Gare à la casse # let eta = 0 ; ; # let eTa = 1 ; ; # eta = eTa ; ; - : bool = false # let Eta = 2 ; ; Error : Unbound constructor Eta OCaml est sensible à la casse et les initiales majuscules sont réservées. 29 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Let local Le let précédent introduit une définition globale qui lie un nom à la valeur d’une expression let a = expr 1 expr 2 ⇒ a reste disponible Définition locale Une expression peut elle même commencer par une définition locale : identifiant visible uniquement dans cette expression let a = expr 1 in expr 2 ⇒ expr 1 écrite et évaluée une seule fois ⇒ Ce a est disponible seulement dans expr 2, puis est oublié évite des collisions ⇒ Nb : let a = expr 1 in expr 2 est une expression 30 / 31 Algorithmique et Programmation Fonctionnelle (APF) Définition d’un identifiant Bibliographie I I I I I I I Xavier Leroy et al. Objective Caml manual http: //caml.inria.fr/pub/docs/manual-ocaml/index.html The book Developing Applications With Objective Caml (by Emmanuel Chailloux, Pascal Manoury and Bruno Pagano) Approche fonctionnelle de la programmation, Michel Mauny , Guy Cousineau Pierre Weis and Xavier Leroy. Le langage Caml. Dunod, 1999. Apprentissage de la programmation avec OCaml Catherine Dubois & Valérie Ménissier-Morain Philippe Nardel. Programmation fonctionnelle, générique et objet : Une introduction avec le langage OCaml. Vuibert, 2005 Louis Gacogne. Programmation par l’exemple en Caml. Ellipse, 2004 31 / 31