18/01/17 1 B) Outils d'analyse et composants du langage deux points de vues complémentaires : outils d'analyse ; composants du langage B.I) Briques de base ; les expressions bien typées B.II) Simplification de l'analyse ; nommer une expression B.III) Analyse modulaire ; les fonctions B.IV) Analyse par cas ; reconnaissance de motifs inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 2 B) Outils d'analyse et composants du langage B.IV) Analyse par cas et reconnaissance de motifs Considérons un feux tricolore à trois états ● état 1 : le feux est rouge ● état 2 : le feux est orange clignotant ● état 3 : le feux est vert DÉFINITION D'UN ENS feux tricolore feux3 = {1, 2, 3} déf implémentation type feux3 = int (* restreint à 1, 2 et 3 *) inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 3 B) Outils d'analyse et composants du langage Expression algébrique affichant la couleur de f:feux3 ? Solution 1 : Analyse par cas grâce à la composition conditionnelle if f = 1 then "rouge" else if f = 2 then "orange clignotant" else (* nécessairement f = 3 *) "vert" inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 4 B) Outils d'analyse et composants du langage Expression algébrique affichant la couleur de f:feux3 ? Solution 2 : Analyse par cas grâce à la reconnaissance (ou filtrage) de motifs («pattern matching» en anglais) reconnaître f parmi les motifs suivants : ● motif 1 reconnu → renvoyer "rouge" ● motif 2 reconnu → renvoyer "orange clignotant" ● motif 3 reconnu → renvoyer "vert" inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 5 B) Outils d'analyse et composants du langage Expression algébrique affichant la couleur de f:feux3 ? Solution 2 : Analyse par cas grâce à la reconnaissance de motifs match f with | 1 -> "rouge" | 2 -> "orange clignotant" | 3 -> "vert" On dit aussi que match ... with opére un filtrage inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 6 B) Outils d'analyse et composants du langage NB : composition conditionnelle = cas particulier de filtrage sur motifs booléens if expr_bool then <partie_alors> else match expr_bool with ⇔ <partie_sinon> inf201 : algorithmique et programmation fonctionnelle | true -> <partie_alors> | false -> <partie_sinon> part. 1 : types, expressions et fonctions 18/01/17 7 B) Outils d'analyse et composants du langage Ex : maximum de 2 valeurs if x < y then y else match x < y with ⇔ x | true -> y | false -> x ☞ On préfèrera la composition conditionnelle au filtrage en cas de motifs booléens ! inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 8 B) Outils d'analyse et composants du langage match expr with Règles de typage de : | motif1 -> expr1 | ... | motifn -> exprn 1) inférence des types de expr, motif1, ..., motifn 2) vérification de la compatibilité de ces types 3) inférence des types de expr1, ..., exprn 4) vérification de la compatibilité de ces types : T expri 5) type de l'ensemble du filtrage : (match ... with) : Texpri inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 9 B) Outils d'analyse et composants du langage match f with Exemple : | 1 -> "rouge" | 2 -> "orange clignotant" | 3 -> "vert" 1) inférence des types de f (feux3) et 1, 2, 3 (ℕ) 2) ces types sont compatibles : feux3 est un synonyme du type entier 3) inférence des types de "rouge", ..., "vert" (chaîne) 4) vérification de la compatibilité de ces types 5) type de l'ensemble du filtrage : (match ... with) : chaîne inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 10 B) Outils d'analyse et composants du langage Exo : spécifier puis réaliser la fonction transformant un caractère en l'entier correspondant grâce à un filtrage On pourra s'appuyer sur la hiérarchie de types suivante : DÉFINITION D'ENSEMBLES déf chiffreCar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} chiffreEnt = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Correction : au tableau inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 11 B) Outils d'analyse et composants du langage Contre-exemple : soit c un caractère. Le filtrage suivant n'est pas typable : match '0' <= c && c <= '9' with | true -> int_of_char(c) - int_of_char('0') | false -> "ce n'est pas un chiffre" ------------------------This expression has type string but is here used with type int inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 12 B) Outils d'analyse et composants du langage match expr with Règles d'évaluation de : | motif1 -> expr1 | ... | motifn -> exprn 1) évaluation de expr : valexpr 2) évaluation de motif1 : valmotif1 3) si valmotif1 reconnaît valexpr renvoyer expr1 et arrêter, sinon recommencer l'étape 2) avec motif2, ... inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 13 B) Outils d'analyse et composants du langage Exemple : let f:feux3 = 2 ;; match f with | 1 -> "rouge" | 1+1 -> "orange clignotant" | 3 -> "vert" 1) évaluation de f donne 2 2) évaluation de 1 donne 1 ; 1 ne reconnaît pas 2 3) évaluation de 1+1 donne 2 ; 2 reconnaît 2 arrêt et renvoi de "orange clignotant" Motif 3 non examiné inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 14 B) Outils d'analyse et composants du langage Regroupement de motifs possible : match f with | 1|2 -> freiner() | 3 -> continuer() inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 15 B) Outils d'analyse et composants du langage match expr with Règle de complétude de : | motif1 -> expr1 | ... | motifn -> exprn motif1, ..., motifn doivent couvrir tous les cas possibles pour expr On dit que le filtrage doit être exhaustif inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 16 B) Outils d'analyse et composants du langage Attention aux motifs manquants : filtrage non exhaustif Ex : nombres de jours d'un mois de l'année SPÉCIFICATION Sémantique les mois de l'année Définition mois = {1, ..., 12 } Implantation type mois = int (* restreint à 1, ..., 12 *) inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 17 B) Outils d'analyse et composants du langage SPÉCIFICATION NOMBRE DE JOURS D'UN MOIS Profil nbjours : mois ℕ Sémantique nbjours (m) est le nombre de jours du mois m dans une année non bissextile (a) nbjours(1) = 31 (b) nbjours(2) = 28 (c) nbjours(4) = 30 Ex et prop inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 18 B) Outils d'analyse et composants du langage RÉALISATION Algorithme analyse par cas par reconnaissance de motifs Implantation : incorrecte bien que correctement typée! type mois = int (* restreint à 1, ..., 12 *) let nbjours (m:mois) : int = match m with | 1|3|5|7|8|10|12 -> 31 | 4|6|9 -> 30 | 2 -> 28 inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 19 B) Outils d'analyse et composants du langage RÉALISATION Tests : # nbjours(1) = 31 ;; - : bool = # nbjours(2) = 28 ;; - : bool = # nbjours(4) = 30 ;; - : bool = # nbjours(11) = 30 ;; Exception: true true true Match_failure Filtrage non exhaustif : il manque un motif ! inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 20 B) Outils d'analyse et composants du langage Implantation correcte : let nbjours (m:mois) : int = match m with | 1|3|5|7|8|10|12 -> 31 | 4|6|9|11 -> 30 | 2 -> 28 inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 21 B) Outils d'analyse et composants du langage RÉALISATION Tests : # nbjours # nbjours # nbjours # nbjours 1 = 31 ;; 2 = 28 ;; 4 = 30 ;; 11 = 30 ;; - : : : : bool bool bool bool = = = = true true true true OK inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 22 B) Outils d'analyse et composants du langage Remarque : filtrage non exhaustif normal, et autorisé implémentation dégradée de mois = {1, ..., 12} en int ⇒ avertissement normal de l'interpréteur : # let nbjours (m:mois) : int = match m with | 1|3|5|7|8|10|12 -> 31 | 4|6|9|11 -> 30 | 2 -> 28 Warning: pattern-matching non exhaustive. Example of a value that is not matched: 0 inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 23 B) Outils d'analyse et composants du langage Le motif anonyme : _ = tous les autres motifs Ex : nature d'une lettre minuscule SPÉCIFICATION Profil Ex et prop natureLettre : minuscule string (a) natureLettre('e') = "voyelle" (b) natureLettre('y') = "semi-voyelle" (c) natureLettre('b') = "consonne" inf201 : algorithmique et programmation fonctionnelle part. 1 : types, expressions et fonctions 18/01/17 24 B) Outils d'analyse et composants du langage Le motif anonyme : _ = tous les autres motifs type minuscule = char (* restreint aux minuscules *) let natureLettre (lettre:minuscule) : string = match lettre with | 'a'|'e'|'i'|'o'|'u' -> "voyelle" | 'y'|'w' -> "semi-voyelle" | _ -> "consonne" # natureLettre 'e' ;; # natureLettre 'b' ;; inf201 : algorithmique et programmation fonctionnelle - : string = "voyelle" - : string = "consonne" part. 1 : types, expressions et fonctions 18/01/17 25 B) Outils d'analyse et composants du langage ATTENTION à l'utilisation du motif anonyme Revenons à la version incorrecte de nbjours let nbjours (m:mois) : int = match m with | 1|3|5|7|8|10|12 -> 31 | 4|6|9 -> 30 | _ (* février *) -> 28 # nbjours(2) = 28 ;; # nbjours(11) = 30 ;; # nbjours(11) ;; inf201 : algorithmique et programmation fonctionnelle - : bool = true - : bool = false - : int = 28 ??? !!! part. 1 : types, expressions et fonctions 18/01/17 26 B) Outils d'analyse et composants du langage Le motif _ rend le filtrage artificiellement exhaustif. L'avertissement (pattern-matching non-exhaustive) de l'interpréteur dispararaît! ☞ le programmeur doit assurer l'exhaustivité du filtrage let nbjours (m:mois) : int = match m with | 1|3|5|7|8|10|12 -> 31 | 4|6|9|11 -> 30 | _ (* février *) -> 28 # nbjours(2) = 28 ;; # nbjours(11) = 30 ;; inf201 : algorithmique et programmation fonctionnelle - : bool = true - : bool = true OK part. 1 : types, expressions et fonctions 18/01/17 27 B) Outils d'analyse et composants du langage Langages au typage strict et statique (Ocaml, ...) : erreurs conceptuelles détectées à la mise au point Langages au typage relâché et/ou dynamique (C, Java, PHP, Pyhton ...) : erreurs conceptuelles non détectées ; plantage à l'exécution (segmentation error, arithmetic error, ...) inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 28 C) Modélisation de l'information Pourquoi modéliser ? Ex : Pourquoi classer les mots selon leur nature (nom, verbe, article, ...) ? Pourquoi les définir dans un dictionnaire ? Pourquoi les y ranger alphabétiquement ? Comment modéliser ? en définissant des types de données en définissant des fonctions les manipulant inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 29 C) Modélisation de l'information C.1) C.2) C.3) C.4) C.5) Nommer et définir un nouveau type Type synonyme Type énuméré Type produit Type somme inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 30 C) Modélisation de l'information C.1) Nommer et définir un nouveau type Présentation systématique : DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf t=… DÉFINITION INFORMATIQUE D'UN TYPE type t = … (* contrainte *) Exemple : DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf texte = séq(caractères) DÉFINITION INFORMATIQUE D'UN TYPE type texte = char list inf201 : algorithmique et programmation fonctionnelle (voir cours 5 et 6) chap. 1 : expression fonctionnelle 18/01/17 31 C) Modélisation de l'information C.2) Types synonymes Exemple : DÉFINITIONS MATHÉMATIQUES D'ENSEMBLES déf déf prix = ℝ*+ taux = {0, ..., 99} DÉFINITIONS INFORMATIQUES DE TYPES type prix = float (* > 0 *) type taux = int (* restreint à 0, ..., 99 *) prix est un synonyme de : float (* > 0 *) taux est un synonyme de : int (* restreint à ... *) inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 32 C) Modélisation de l'information SPÉCIFICATION PRIX AVEC RÉDUCTION Profil prixRéduit : prix → taux prix Sémantique (prixRéduit p t) correspond à p réduit de t% Ex et prop (prixRéduit 100 25) = 75 Profil : prixRéduit : prix → taux → prix beaucoup plus explicite que le profil anonyme : prixRéduit : float → int → float inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 33 C) Modélisation de l'information RÉALISATION PRIX AVEC RÉDUCTION Implantation : let prixRéduit (p:prix) (t:taux) : prix = let réduc = p *. (float_of_int t) /. 100.0 in p -. réduc Tests : # let p1:prix = 100.0 and t1:taux = 25 in prixRéduit p1 p1 ;; This expression has type prix but is here used with type taux Type prix=float not compatible with type taux=int inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 34 C) Modélisation de l'information Message d'erreur : This expression has type prix but is here used with type taux Type prix=float not compatible with type taux=int beaucoup plus explicite que le message anonyme : This expression has type float but is here used with type int inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 35 C) Modélisation de l'information C.3) Types énumérés Exemple : on appelle enseigne dans un jeu de cartes ♠, ♣, ♥, ♦ DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf enseigne = {♠, ♣, ♥, ♦} DÉFINITION INFORMATIQUE D'UN TYPE type enseigne = Pique|Trèfle|Coeur|Carreau ;; inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 36 C) Modélisation de l'information C.3) Types énumérés ● ● ● enseigne est un ensemble défini par énumération enseigne est un type énuméré Que sont Pique, ..., Carreau ? pas des chaînes (manque les ") pas des variables (pas de let Pique = ...) ☞ constantes symboliques # "Pique" ;; - : string = Pique # Pique ;; - : enseigne = Pique inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 37 C) Modélisation de l'information C.3) Types énumérés Pique, ..., Carreau sont de type enseigne Pique, ..., Carreau construisent des valeurs de type enseigne ☞ Pique, ..., Carreau sont des constructeurs de valeurs Propriété : Les constructeurs de valeurs sont uniques : # Pique = Trèfle - : bool = false inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 38 C) Modélisation de l'information C.3) Types énumérés Analyse par cas des valeurs d'un type énuméré : expression conditionnelle ou filtrage Exemple : SPÉCIFICATION Couleur d'une enseigne Profil couleurEns : enseigne string Sémantique couleurEns (e) est la couleur de e Ex et prop (couleurEns ♦) = "rouge" inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 39 C) Modélisation de l'information C.3) Types énumérés RÉALISATION Couleur d'une enseigne Algorithme 1 : analyse par cas par composition conditionnelle Implantation 1 : let couleurEns1 (e:enseigne) : string = if e=Carreau || e=Coeur then "rouge" else (* nécessairement, e=Pique ou Trèfle *) "noir" inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 40 C) Modélisation de l'information C.3) Types énumérés RÉALISATION Algorithme 2 : Couleur d'une enseigne analyse par cas par filtrage Implantation 2 : let couleurEns2 (e:enseigne) : string = match e with | Carreau|Coeur -> "rouge" | Pique|Trèfle -> "noir" inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 41 C) Modélisation de l'information C.3) Types énumérés Exercice : amélioration de la modélisation des cartes Q0) Définir un type énuméré modélisant la couleur des enseignes Q1) Donner la nouvelle spécification de couleurEns Q2) Donner la nouvelle réalisation de couleurEns inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 42 C) Modélisation de l'information C.1) C.2) C.3) C.4) C.5) Nommer et définir un nouveau type Type synonyme Type énuméré Type produit Type somme inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 43 C) Modélisation de l'information Rappels (inf111) Math ● produit cart. d'ens. : E1 x ... x En Info ● où t1, ..., tn types où E1, ..., En ensembles ● éléments d'un produit : vecteurs (e1, ..., en) ∈ E1 x ... x En inf201 : algorithmique et programmation fonctionnelle produit cart. de types : t1 * ... * tn ● éléments d'un produit : nuplets e1, ..., en : t1 * ... * tn chap. 1 : expression fonctionnelle 18/01/17 44 C) Modélisation de l'information Exemple : modélisation d'un jeu de 32 cartes Chaque carte d'un jeu de 32 : ● appartient à une enseigne (♠, ♣, ♥, ♦) ● est une petite (ex : 7 de ♠, 10 de ♥) ou un honneur (ex : roi de ♥, as de ♣) inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 45 C) Modélisation de l'information énumération DÉFINITIONS MATH D'ENSEMBLES déf déf déf énumération enseigne = { ♠, ♣, ♥, ♦ } (intervalle) petite = { 7, 8, 9, 10 } x enseigne honneur = { As, Roi, Dame, Valet } x enseigne produits cartésiens inf201 : algorithmique et programmation fonctionnelle énumération chap. 1 : expression fonctionnelle 18/01/17 46 C) Modélisation de l'information déf déf déf enseigne = { ♠, ♣, ♥, ♦ } petite = { 7, 8, 9, 10 } x enseigne honneur = { As, Roi, Dame, Valet } x enseigne Exo : ● Nature des éléments de petite et honneur ? couples ● Énumérer les éléments de petite : { (7,♠), ..., (10,♠), (7,♣), ..., (10, ♣), (7,♥), ..., (10,♥), (7,♦), ..., (10,♦) } ● Point commun entre petite et honneur ? type de la 2ème composante : enseigne Ex : (Roi,♥) et (9,♦) inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 47 C) Modélisation de l'information DÉFINITIONS INFO DE TYPES type énuméré type enseigne = Pique|Trèfle|Coeur|Carreau type intervalle type petite = int (* restreint à 7, 8, 9, 10 *) * enseigne (* Nommage de l'énumération {As,Roi,Dame,Valet}: *) type tête = As|Roi|Dame|Valet type honneur = tête * enseigne type produit inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 48 C) Modélisation de l'information Exo 1 : Chaque joueur détient exactement 5 cartes tout au long du jeu. Q1) Définir une constante QFRC modélisant la quinte flush royale à cœur (poker) : Q2) QFRC ∈ ? Q3) Implémentation ? inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 49 C) Modélisation de l'information Q1) DÉF DE CONSTANTE QFRC = ( (As,♥), (Roi,♥), (Dame,♥), (Valet,♥), (10,♥) ) Q2) QFRC ∈ honneur4 x petite Q3) IMPLÉMENTATION let cst_QFRC : honneur*honneur*honneur*honneur*petite = ( (As,Coeur), (Roi,Coeur), (Dame,Coeur), (Valet,Coeur), (10,Coeur) ) inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 50 C) Modélisation de l'information Limitation modélisation cartes par types produit : comment manipuler à la fois (Dame,♥) : honneur et (7,♣) : petite Fonction f s'appliquant sur des petites et des honneurs : f : petite → α (α type quelconque), ou bien f : honneur → α ? ⇒ f : (honneur U petite) → t inf201 : algorithmique et programmation fonctionnelle !?! chap. 1 : expression fonctionnelle 18/01/17 51 C) Modélisation de l'information nécessité d'un nouveau type carte réunissant petites et honneurs ensemble des carte : union des ensembles petite et honneur On parle de type somme. somme inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle 18/01/17 52 C) Modélisation de l'information C.1) C.2) C.3) C.4) C.5) Nommer et définir un nouveau type Type synonyme Type énuméré Type produit Type somme inf201 : algorithmique et programmation fonctionnelle chap. 1 : expression fonctionnelle