Programmation fonctionnelle

Documents pareils
# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Recherche dans un tableau

Cours de Programmation 2

Classes et Objets en Ocaml.

Machines virtuelles fonctionnelles (suite) Compilation ML Java

TP3 : Manipulation et implantation de systèmes de fichiers 1

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Programme Compte bancaire (code)

modules & compilation

Arbres binaires de recherche

Présentation du langage et premières fonctions

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Présentation Windows Azure Hadoop Big Data - BI

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

STAGE IREM 0- Premiers pas en Python

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Vérification de programmes et de preuves Première partie. décrire des algorithmes

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TP 1. Prise en main du langage Python

Les arbres binaires de recherche

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmer en JAVA. par Tama

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Java 1.5 : principales nouveautés

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

KL5121. Pour activer des sorties en fonction de la position d'un codeur

ACTIVITÉ DE PROGRAMMATION

Corrigé des exercices sur les références

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Examen Médian - 1 heure 30

Conventions d écriture et outils de mise au point

Cours 1 : La compilation

Rappels d architecture

Algorithmique et Programmation, IMA

TD3: tableaux avancées, première classe et chaînes

Notions fondamentales du langage C# Version 1.0

Rappel sur les bases de données

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Analyse de sécurité de logiciels système par typage statique

2 Comment fonctionne un ordinateur, dans les grandes lignes

Programmation. fonctionnelle, impérative, logique et orientée objet

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Utilisation d objets : String et ArrayList

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

Logiciel Libre Cours 2 Fondements: Programmation

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Langage Java. Classe de première SI

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

lundi 3 août 2009 Choose your language What is Document Connection for Mac? Communautés Numériques L informatique à la portée du Grand Public

Algorithmique et programmation : les bases (VBA) Corrigé

GOL502 Industries de services

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation Objet Java Correction

Flux de données Lecture/Ecriture Fichiers

Programmation avec des objets : Cours 7. Menu du jour

Guide d'installation rapide TFM-560X YO.13

Structurer ses données : les tableaux. Introduction à la programmation

Licence Sciences et Technologies Examen janvier 2010

Découverte de Python

Programmation C++ (débutant)/instructions for, while et do...while


OCL - Object Constraint Language

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Chapitre 2 Devine mon nombre!

Le langage C. Séance n 4

Introduction au langage C

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

INF 321 : mémento de la syntaxe de Java

France SMS+ MT Premium Description

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Paginer les données côté serveur, mettre en cache côté client

Premiers Pas en Programmation Objet : les Classes et les Objets

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Développement Logiciel

Le prototype de la fonction main()

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Principes des langages de programmation INF 321. Eric Goubault

Thank you for choosing the Mobile Broadband USB Stick. With your USB Stick, you can access a wireless network at high speed.

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

4 Exemples de problèmes MapReduce incrémentaux

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Cours 14 Les fichiers

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Java Licence Professionnelle CISII,

Transcription:

1/21 Programmation fonctionnelle Notes de cours Cours 5 31 Octobre 2012 Sylvain Conchon sylvain.conchon@lri.fr

2/21 Le programme de cette semaine Le mode T9 des téléphones portables

3/21 Les notions abordées avec ce programme Exceptions Dictionnaires Arbres de préfixes

4/21 Les exceptions # 1 / 0 ;; Exception: Division by zero. # let x = [ 1 ];; val x : int array = [ 1 ] ;; # x.(1);; Exception: Invalid argument "index out of bounds". # int of string "bonjour" ;; Exception: Failure "int of string". Le mécanisme d exception permet de gérer le problème des fonctions partielles : une exception est levée si aucune valeur ne peut être renvoyée par la fonction. Si l exception n est pas rattrapée (voir ci-après), le programme se termine.

5/21 Les exceptions : déclaration et typage # exception Fin ;; exception Fin # raise Fin; print int 10 ;; Exception: Fin. # exception E of int ;; exception E of int # let f x = if x = 0 then raise (E(x)) else 10 / x ;; val f : int -> int = <fun> # f 0 ;; Exception: E(0) Une exception est définie à l aide du mot-clé exception. Comme pour les constructeurs, elle commence par une majuscule et elle peut attendre des arguments. On lève une exception à l aide de la fonction raise. Ce mécanisme est transparent au typage.

6/21 Les exceptions : rattrapage # let f x = if x = 10 then raise (E(10)) else 10 / x ;; # try f 0 with Division by zero -> 0 E x -> x ;; - : int = 0 Une exception peut être rattrapée à l aide de la construction try-with qui permet de définir des gestionnaires d exceptions. Comme pour un pattern-matching, un gestionnaire permet de récupérer les arguments associés aux exceptions.

7/21 Dictionnaires Un dictionnaire est une structure de données qui permet d associer des clefs (de type a) à des valeurs (de type b). La manière la plus simple de réaliser un dictionnaire est d utiliser une liste de paires ( a * b) list. La bibliothèque OCaml fournit un certain nombre de fonctions permettant de manipuler de tels dictionnaires. En particulier, la fonction List.assoc renvoie la valeur associée à une clef (elle lève l exception Not found si aucune valeur n est associée) a -> ( a * b) list -> b la fonction List.remove assoc supprime la première association liée à une clef a -> ( a * b) list -> ( a * b) list

8/21 Dictionnaires : changement d association Pour changer l association liée à une clef dans un dictionnaire, on définit la fonction change assoc de type a -> b -> ( a * b) list -> ( a * b) list de sorte que change assoc i v l change l association liée à i dans la liste l par le couple (i, v) let rec change assoc i v l = match l with [] -> [ (i, v) ] (x, )::l when x=i -> (i, v)::l z::l -> z::(change assoc i v l)

9/21 Les arbres de préfixes Structure de données pour représenter des ensembles de mots. Par mots, il faut comprendre toute valeur ocaml pouvant être décomposée comme une suite de lettres : les valeurs de type string sont des mots dont les lettres sont de type char les entiers de type int sont également des mots dont les lettres peuvent être simplement les chiffres 0 et 1 etc.

10/21 Décomposition On utilise cette décomposition en lettres pour représenter des ensembles de mots de la manière suivante : chaque branche est étiquetée par une lettre chaque nœud contient un booléen qui indique si la séquence de lettres menant de la racine de l arbre à ce nœud est un mot appartenant à l ensemble

11/21 Exemple L arbre de préfixes correspondant au dictionnaire {if, in, do, done} i false d n false f false o true true true n false e true

12/21 Pourquoi une telle structure? Le temps de recherche d un élément dans un arbre de préfixes est borné à la longueur du mot le plus long de cet ensemble, quelque soit le nombre de mots qu il contient. Cette propriété est garantie si toutes les feuilles d un arbre de préfixes représentent bien un mot de l ensemble, c est-à-dire si elles contiennent toutes une valeur booléenne à vrai.

13/21 L interface du module Trie type a t type a word = a list val empty : a t val is empty : a t -> bool val mem : a word -> a t -> bool val add : a word -> a t -> a t val remove : a word -> a t -> a t val inter : a t -> a t -> a t val union : a t -> a t -> a t val cardinal : a t -> int a t est le type (abstrait) des arbres de préfixe dont les lettres sont de type a les mots sont représentés par des listes de lettres a word

14/21 Implémentation du module Trie type a t = { is a word : bool ; branches : ( a * a t) list } Les valeurs de ce type sont les nœuds des arbres. Le champ is a word contient la valeur booléenne indiquant la présence d un mot dans l arbre. Le champ branches contient les fils d un nœud. Il s agit d une liste d associations qui associe des sous-arbres à des lettres.

15/21 Implémentation du module Trie L arbre de préfixes vide empty est représenté par un arbre réduit à un unique nœud où le champ is a word vaut false et branches est une liste vide : let empty = { is a word = false; branches = [] } La fonction is empty pour tester qu un arbre de préfixes est vide est alors définie de la manière suivante : let is empty t = not t.is a word && t.branches = []

16/21 Recherche d un élément let rec mem x t = match x with [] -> t.is a word i::l -> try mem l (List.assoc i t.branches) with Not found -> false La recherche d un élément x procède récursivement de la façon suivante : si le mot x est la liste vide, la recherche se termine en renvoyant la valeur booléenne associée à la racine de l arbre t Sinon, la recherche se poursuit récursivement dans le sous-arbre associé à la branche étiquetée par la première lettre i du mot x. Dans le cas où cette branche n existe pas, la recherche se termine immédiatement sur un échec.

17/21 Insertion d un élément let rec add x t = match x with [] -> { t with is a word = true } i::l -> let b = try List.assoc i t.branches with Not found -> empty in { t with branches = change assoc i (add l b) t.branches }

18/21 Insertion d un élément L insertion d un mot x dans un arbre de préfixes t consiste à descendre le long de la branche étiquetée par les lettres de x. Si x est vide, on renvoie un arbre t avec un champ is a word à vrai afin d indiquer que x appartient désormais à cet ensemble. Si x est de la forme i::l, on ajoute récursivement l dans le sous-arbre b associé à lettre i dans t. Si b n existe pas, on réalise l ajout à partir d un arbre vide. L insertion se termine en associant l arbre ainsi obtenu à la lettre i.

19/21 Suppression d un élément let rec remove x t = match x with [] -> { t with is a word = false } i::l -> try let s = remove l (List.assoc i t.branches) in let new branches = if is empty s then remove assoc i t.branches else change assoc i s t.branches in { t with branches = new branches } with Not found -> t

20/21 Suppression d un élément La suppression d un élément x dans un arbre t procède encore une fois avec le même parcours récursif que pour l insertion. La principale subtilité de cette opération est de maintenir la bonne formation de l arbre renvoyé. Si x est la liste vide, il est supprimé de t simplement en passant le champ is a word à faux. Sinon, x est de la forme i::l on procède ainsi : On commence par supprimer récursivement le reste du mot l dans le sous-arbre associé à i. Si ce sous-arbre n existe pas, la fonction se termine en renvoyant directement t. Puis, selon que l arbre s ainsi obtenu est vide ou non, on supprime la branche associée à i dans t ou on lui associe s. Cela permet de garantir qu aucune branche de t ne pointe vers un arbre vide. Enfin, la fonction se termine en associant ces nouvelles branches à t.

21/21 Cardinal let cardinal t = let n = ref 0 in let rec count t = if t.is a word then incr n; List.iter (fun (, t) -> count t) t.branches in count t;!n La fonction cardinal renvoie le nombre de mot contenu dans un arbre de préfixe. Il s agit simplement d un parcours en profondeur d un arbre pendant lequel on compte le nombre de nœuds ayant un champ is a word à true.