197
Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50

Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

  • Upload
    others

  • View
    25

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Programmation fonctionnelle

Julien Forest - ensiie - IPF 1/50

Page 2: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Fonctionnement du cours

Regles de vie :I pas d’ordinateur portable dans l’amphitheatre ou en TD,I ne pas hesiter a poser des questions (en cours, en TD,. . . ),I arriver a l’heure,I pas de reprise du cours en TD , en TP.

Regles d’examens :I Premiere session :

projet (1/3) + examen sur table (2/3)I Deuxieme session : Examen ecrit qui remplace tout

Julien Forest - ensiie - IPF 2/50

Page 3: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Introduction

Imperatif vs Fonctionnel vs Objet . . .

Partir du probleme ; choix structure ; paradigme ; langage.

Plan du cours :I Notions de base (1 cours)I Plusieurs parties :

I Structure de donneesI Outils

I Notions de modules

I Un peu d’imperatif a la fin et du mixage.

Machines : manipulation, mise en œuvre

Travaux diriges : aspects theoriques, interet

Julien Forest - ensiie - IPF 3/50

Page 4: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Introduction

Imperatif vs Fonctionnel vs Objet . . .

Partir du probleme ; choix structure ; paradigme ; langage.

Plan du cours :I Notions de base (1 cours)I Plusieurs parties :

I Structure de donneesI Outils

I Notions de modules

I Un peu d’imperatif a la fin et du mixage.

Machines : manipulation, mise en œuvre

Travaux diriges : aspects theoriques, interet

Julien Forest - ensiie - IPF 3/50

Page 5: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Introduction

Imperatif vs Fonctionnel vs Objet . . .

Partir du probleme ; choix structure ; paradigme ; langage.

Plan du cours :I Notions de base (1 cours)I Plusieurs parties :

I Structure de donneesI Outils

I Notions de modules

I Un peu d’imperatif a la fin et du mixage.

Machines : manipulation, mise en œuvre

Travaux diriges : aspects theoriques, interet

Julien Forest - ensiie - IPF 3/50

Page 6: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Biblio

I Developpement d’applications avec OCamlI Chailloux, Manoury, PaganoI O’ReillyI http://www.pps.jussieu.fr/Livres/ora/DA-OCAML/

I Purely Functional Data StructuresI OkasakiI Cambridge University Press

SML !

Julien Forest - ensiie - IPF 4/50

Page 7: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Biblio

I Approche fonctionnelle de la programmationI Cousineau, MaunyI Ediscience/Dunod

Camllight !

I Le langage CamlI Leroy, WeisI Dunod

Julien Forest - ensiie - IPF 5/50

Page 8: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Rappels/Mise au point

Julien Forest - ensiie - IPF 6/50

Page 9: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Introduction

Programmation fonctionnelle?I Tout est valeur expressions,fonctions,modules?I Persistance Aucune modification

I Code simple ; correctionI Efficacite

Similaire a mathematiques ; abstraction/haut niveau

Modele formel : λ-calcul x (M1 M2) λx .M →β

Preuves aisees et naturelles.

Julien Forest - ensiie - IPF 7/50

Page 10: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions

; valeurs

I Declaration

; noms

I Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typees

I Operations arithmetiques et logiques respectant les typesI Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 11: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions ; valeursI Declaration ; nomsI Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typees

I Operations arithmetiques et logiques respectant les typesI Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 12: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions ; valeursI Declaration ; nomsI Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typees

I Operations arithmetiques et logiques respectant les typesI Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 13: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions ; valeursI Declaration ; nomsI Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typeesI Operations arithmetiques et logiques respectant les types

I Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 14: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions ; valeursI Declaration ; nomsI Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typeesI Operations arithmetiques et logiques respectant les typesI Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 15: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : les fondements

Programme = listeI Expressions ; valeursI Declaration ; nomsI Separateurs (,) et ; ;

Valeurs predefinies :I Valeurs basiques (entiers, floatants,. . .) typeesI Operations arithmetiques et logiques respectant les typesI Comparaisons arguments de meme types

Typage fort⇒ pas d’erreur de segmentation

Julien Forest - ensiie - IPF 8/50

Page 16: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations

But : donner un nom a une valeur globalementlet x = expr (*x : nom de la valeur d’expr *)

let toto = 21 * 2 {(toto,42),. . . }Jamais modife apresidentificateur ; expression

let titi = toto {(titi,42), (toto,42),. . . }let toto = 3*222titi?

Julien Forest - ensiie - IPF 9/50

Page 17: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations

But : donner un nom a une valeur globalementlet x = expr (*x : nom de la valeur d’expr *)

let toto = 21 * 2 {(toto,42),. . . }Jamais modife apresidentificateur ; expression

let titi = toto {(titi,42), (toto,42),. . . }let toto = 3*222titi?

Julien Forest - ensiie - IPF 9/50

Page 18: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations

But : donner un nom a une valeur globalementlet x = expr (*x : nom de la valeur d’expr *)

let toto = 21 * 2 {(toto,42),. . . }Jamais modife apresidentificateur ; expression

let titi = toto {(titi,42), (toto,42),. . . }let toto = 3*222titi?

Julien Forest - ensiie - IPF 9/50

Page 19: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations

But : donner un nom a une valeur globalementlet x = expr (*x : nom de la valeur d’expr *)

let toto = 21 * 2 {(toto,42),. . . }Jamais modife apresidentificateur ; expression

let titi = toto {(titi,42), (toto,42),. . . }let toto = 3*222 {(toto,666),(titi,42), (toto,42),. . . }titi?

Julien Forest - ensiie - IPF 9/50

Page 20: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations

But : donner un nom a une valeur globalementlet x = expr (*x : nom de la valeur d’expr *)

let toto = 21 * 2 {(toto,42),. . . }Jamais modife apresidentificateur ; expression

let titi = toto {(titi,42), (toto,42),. . . }let toto = 3*222 {(toto,666),(titi,42), (toto,42),. . . }titi? 42

Julien Forest - ensiie - IPF 9/50

Page 21: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let = 84 / 2 in {(,42),(toto,666)}* 2 {(,42),(toto,666)}

{(toto,666)}

Julien Forest - ensiie - IPF 10/50

Page 22: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}

let titi = 84 / 2 in {(titi,42),(toto,666)}titi = * 2 {(titi,42),(toto,666)}

{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 23: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let titi = 84 / 2 in {(titi,42),(toto,666)}

titi = * 2 {(titi,42),(toto,666)}{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 24: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let titi = 84 / 2 in {(titi,42),(toto,666)}titi = titi* 2 {(titi,42),(toto,666)}

{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 25: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let titi = 84 / 2 in {(titi,42),(toto,666)}titi = titi* 2 {(titi,42),(toto,666)}

{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 26: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let titi = 84 / 2 in {(titi,42),(toto,666)}titi = titi* 2 {(titi,42),(toto,666)}

{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 27: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let titi = 84 / 2 in {(titi,42),(toto,666)}titi = toto* 2 {(titi,42),(toto,666)}

{(toto,666)}

identificateur visible uniquement dans la partie in portee

Julien Forest - ensiie - IPF 10/50

Page 28: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel : declarations locales

But : donner un nom a une valeur localementlet x = e1 in e2 (*x : nom de la valeur d’expr *)

{(toto,666)}let toto = 84 / 2 in {(toto,42),(toto,666)}toto* 2 {(toto,42),(toto,666)}

{(toto,666)}

CAPTURE

Julien Forest - ensiie - IPF 10/50

Page 29: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations

Enchaıner les declarations

let x = e1 inlet y = e2 in...

Declarations simultanees

let x = e1and y = e2 in...

Donner un nom ou pas

let _ = e1let _ = e1 in e2

Julien Forest - ensiie - IPF 11/50

Page 30: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations

Enchaıner les declarations

let x = e1 inlet y = e2 in...

Declarations simultanees

let x = e1and y = e2 in...

Donner un nom ou pas

let _ = e1let _ = e1 in e2

Julien Forest - ensiie - IPF 11/50

Page 31: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations

Enchaıner les declarations

let x = e1 inlet y = e2 in...

Declarations simultanees

let x = e1and y = e2 in...

Donner un nom ou pas

let _ = e1let _ = e1 in e2

Julien Forest - ensiie - IPF 11/50

Page 32: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions branchement

if e1 then e2 else e3

Types :I e1 : bool,I e2 et e3 meme type ⇒ else “obligatoire”

Valeur :I e2 si e1 vaut trueI e3 si e1 vaut false

if 666 < 42 then 666 else 42;; (*vaut 42 *)

Rq : branchement 6= fonction logique

if cond then true else false;;

Julien Forest - ensiie - IPF 12/50

Page 33: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions branchement

if e1 then e2 else e3

Types :I e1 : bool,I e2 et e3 meme type ⇒ else “obligatoire”

Valeur :I e2 si e1 vaut trueI e3 si e1 vaut false

if 666 < 42 then 666 else 42;; (*vaut 42 *)

Rq : branchement 6= fonction logique

if cond then true else false;;

Julien Forest - ensiie - IPF 12/50

Page 34: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions branchement

if e1 then e2 else e3

Types :I e1 : bool,I e2 et e3 meme type ⇒ else “obligatoire”

Valeur :I e2 si e1 vaut trueI e3 si e1 vaut false

if 666 < 42 then 666 else 42;; (*vaut 42 *)

Rq : branchement 6= fonction logique

if cond then true else false;;

Julien Forest - ensiie - IPF 12/50

Page 35: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions branchement

if e1 then e2 else e3

Types :I e1 : bool,I e2 et e3 meme type ⇒ else “obligatoire”

Valeur :I e2 si e1 vaut trueI e3 si e1 vaut false

if 666 < 42 then 666 else 42;; (*vaut 42 *)

Rq : branchement 6= fonction logiqueif cond then true else false;;

Julien Forest - ensiie - IPF 12/50

Page 36: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions branchement

if e1 then e2 else e3

Types :I e1 : bool,I e2 et e3 meme type ⇒ else “obligatoire”

Valeur :I e2 si e1 vaut trueI e3 si e1 vaut false

if 666 < 42 then 666 else 42;; (*vaut 42 *)

Rq : branchement 6= fonction logique

if cond then true else false;;

cond;;

Julien Forest - ensiie - IPF 12/50

Page 37: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions imbrication

(0x29a = 42) || (3 < 666);;

3+(if 42 < 666 then 1 else 322);;

(float_of_int 3) < 2.5 ; ;

I Manipulation d’expressionsI Bon typageI Pas de conversion implicite

Julien Forest - ensiie - IPF 13/50

Page 38: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions imbrication

(0x29a = 42) || (3 < 666);;

3+(if 42 < 666 then 1 else 322);;

3 < 2.5 ; ;

I Manipulation d’expressionsI Bon typageI Pas de conversion implicite

Julien Forest - ensiie - IPF 13/50

Page 39: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions imbrication

(0x29a = 42) || (3 < 666);;

3+(if 42 < 666 then 1 else 322);;

(float_of_int 3) < 2.5 ; ;

I Manipulation d’expressionsI Bon typageI Pas de conversion implicite

Julien Forest - ensiie - IPF 13/50

Page 40: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e

parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation

1. Remplacement de le corps du parametre formel par une valeur2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 41: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation

1. Remplacement de le corps du parametre formel par une valeur2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 42: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation

1. Remplacement de le corps du parametre formel par une valeur2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 43: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation

1. Remplacement de le corps du parametre formel par une valeur2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 44: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation1. Remplacement de le corps du parametre formel par une valeur

2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 45: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les expressions les fonctions

fonction : valeur comme les autresfun x -> e parametre formel x + corps e

Typage : α→ β si e de type β quand x de type α

Application :I Syntaxte (my_fonc my_arg)

I Evaluation1. Remplacement de le corps du parametre formel par une valeur2. Evaluation du corps.

Julien Forest - ensiie - IPF 14/50

Page 46: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)

let f = fun x -> e1

En parametre. . .

lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

M

Type : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .

let f = fun x -> (fun y -> e3)Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 47: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)

let f = fun x -> e1

En parametre. . .

lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

M

Type : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .

let f = fun x -> (fun y -> e3)Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 48: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)let f = fun x -> e1

En parametre. . .

lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

M

Type : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .

let f = fun x -> (fun y -> e3)Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 49: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)let f = fun x -> e1

En parametre. . .lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

M

Type : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .

let f = fun x -> (fun y -> e3)Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 50: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)let f = fun x -> e1

En parametre. . .lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

M

Type : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .let f = fun x -> (fun y -> e3)

Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 51: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)let f = fun x -> e1

En parametre. . .lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

MType : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .let f = fun x -> (fun y -> e3)

Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 52: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : valeurs comme les autres

Nomage . . . (y compris localement)let f = fun x -> e1

En parametre. . .lef f = fun g ->(...(g e2)...)︸ ︷︷ ︸

MType : (α→ β)→ γ si e2 : α et M : γ quand x : α→ β

Retourner comme resultat (valeur). . .let f = fun x -> (fun y -> e3)Type : α→ (β → γ) si e3 : γ quand x : α et y : β

(α→ β)→ γ 6=α→ (β → γ)

Julien Forest - ensiie - IPF 15/50

Page 53: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : subtilites

let f = fun x1 -> fun x2 -> . . . -> fun xn -> e

Application partielle (tq→ dans type) (f e1 . . . ek); nouvelle fonction dependant des valeurs a la creation

let ex = fun x -> fun y -> x + y

ex 42 ; fun y -> 42 + yex 666 ; fun y -> 666 + y

Pas d’evalution “sous des fun”let f1 = fun x -> fun y -> 2 * x + 2 * ylet f2 = fun x ->let x1= 2 * x in fun y -> x1+ 2 * yf1 42;fun y -> 2 * 42 + 2*yf2 42;fun y -> 84 + 2*y

Julien Forest - ensiie - IPF 16/50

Page 54: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : subtilites

let f = fun x1 -> fun x2 -> . . . -> fun xn -> e

Application partielle (tq→ dans type) (f e1 . . . ek); nouvelle fonction dependant des valeurs a la creation

let ex = fun x -> fun y -> x + y

ex 42 ; fun y -> 42 + yex 666 ; fun y -> 666 + y

Pas d’evalution “sous des fun”let f1 = fun x -> fun y -> 2 * x + 2 * ylet f2 = fun x ->let x1= 2 * x in fun y -> x1+ 2 * yf1 42;fun y -> 2 * 42 + 2*yf2 42;fun y -> 84 + 2*y

Julien Forest - ensiie - IPF 16/50

Page 55: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : subtilites

let f = fun x1 -> fun x2 -> . . . -> fun xn -> e

Application partielle (tq→ dans type) (f e1 . . . ek); nouvelle fonction dependant des valeurs a la creation

let ex = fun x -> fun y -> x + y

ex 42 ; fun y -> 42 + yex 666 ; fun y -> 666 + y

Pas d’evalution “sous des fun”let f1 = fun x -> fun y -> 2 * x + 2 * ylet f2 = fun x ->let x1= 2 * x in fun y -> x1+ 2 * y

f1 42;fun y -> 2 * 42 + 2*yf2 42;fun y -> 84 + 2*y

Julien Forest - ensiie - IPF 16/50

Page 56: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Les fonctions : subtilites

let f = fun x1 -> fun x2 -> . . . -> fun xn -> e

Application partielle (tq→ dans type) (f e1 . . . ek); nouvelle fonction dependant des valeurs a la creation

let ex = fun x -> fun y -> x + y

ex 42 ; fun y -> 42 + yex 666 ; fun y -> 666 + y

Pas d’evalution “sous des fun”let f1 = fun x -> fun y -> 2 * x + 2 * ylet f2 = fun x ->let x1= 2 * x in fun y -> x1+ 2 * yf1 42;fun y -> 2 * 42 + 2*yf2 42;fun y -> 84 + 2*yJulien Forest - ensiie - IPF 16/50

Page 57: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1

else (fact (n -1)) * n

v * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 58: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1

else (fact (n -1)) * n

v * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 59: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1

else (fact (n -1)) * n

v * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 60: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1else let v = fact (n-1) in

v * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 61: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1else let v = fact (n-1) inv * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 62: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Fonction recursive : cas de base + hypothese de recurrencelet rec f = . . . f . . .

Exemple : la factorielleI Cas de base : 0 ! = 1I Cas recurrence : hypothese n! = v ; (n + 1)! = v × (n + 1)

let rec fact = fun n ->if n = 0then 1else (fact (n -1)) * n

v * n

Rq recursion non terminale : pile d’appel non bornee ; risque

Julien Forest - ensiie - IPF 18/50

Page 63: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Ex : factorielleDef plus generale : ∀a,∀n, (f a n) = a× n!

I Cas de base : ∀a, f a 0 = aI Cas de recurrence : hyp : ∀a, f a n = a× n!

; ∀a, f a (n+1) = f (a× (n+1)) n = a× (n+1)×n! = a× (n+1)!

let rec fact_gen = fun acc n ->if n = 0 then accelse fact_gen (acc * n) (n-1)let fact2 = fact_gen 1

Rq recursion terminale : pile d’appel bornee

Julien Forest - ensiie - IPF 19/50

Page 64: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Ex : factorielleDef plus generale : ∀a,∀n, (f a n) = a× n!

I Cas de base : ∀a, f a 0 = aI Cas de recurrence : hyp : ∀a, f a n = a× n!

; ∀a, f a (n+1) = f (a× (n+1)) n = a× (n+1)×n! = a× (n+1)!

let rec fact_gen = fun acc n ->if n = 0 then accelse fact_gen (acc * n) (n-1)

let fact2 = fact_gen 1

Rq recursion terminale : pile d’appel bornee

Julien Forest - ensiie - IPF 19/50

Page 65: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel recursion

Ex : factorielleDef plus generale : ∀a,∀n, (f a n) = a× n!

I Cas de base : ∀a, f a 0 = aI Cas de recurrence : hyp : ∀a, f a n = a× n!

; ∀a, f a (n+1) = f (a× (n+1)) n = a× (n+1)×n! = a× (n+1)!

let rec fact_gen = fun acc n ->if n = 0 then accelse fact_gen (acc * n) (n-1)let fact2 = fact_gen 1

Rq recursion terminale : pile d’appel bornee

Julien Forest - ensiie - IPF 19/50

Page 66: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 67: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 68: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 69: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 70: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 71: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 72: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel terminale/non terminale

fact 4 fact2 4

fact 3 * 4 fact gen 1 4

fact 2 * 3 * 4 fact gen 4 3

fact 1 * 2 * 3 * 4 fact gen 12 2

fact 0 * 1 * 2 * 3 * 4 fact gen 24 1

1 * 1 * 2 * 3 * 4 fact gen 24 0

24 24

Julien Forest - ensiie - IPF 20/50

Page 73: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel Inference

let rec f = fun g -> fun n -> fun x ->if n = 0 then xelse f g (n-1) (g x)

Type de f?

(α→ α)→ int → α→ α

Julien Forest - ensiie - IPF 21/50

Page 74: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel Inference

let rec f = fun g -> fun n -> fun x ->if n = 0 then xelse f g (n-1) (g x)

Type de f?

(α→ α)→ int → α→ α

Julien Forest - ensiie - IPF 21/50

Page 75: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel types produits

Etendre les types de base. . .t1* . . .*tn type des tuples (x1,· · ·,xn) avec xi : ti

Rq : α ∗ (β ∗ γ) 6= α ∗ β ∗ γ 6= (α ∗ β) ∗ γRq : (α ∗ β)→ γ 6= α→ β → γ

Construction : let triplet = (42,true,"pfff");;Destructuration : let (a,b,c) = triplet;;

Cas particulier : les couples fst: α ∗ β → α, snd: α ∗ β → β

Julien Forest - ensiie - IPF 22/50

Page 76: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel types produits

Etendre les types de base. . .t1* . . .*tn type des tuples (x1,· · ·,xn) avec xi : ti

Rq : α ∗ (β ∗ γ) 6= α ∗ β ∗ γ 6= (α ∗ β) ∗ γRq : (α ∗ β)→ γ 6= α→ β → γ

Construction : let triplet = (42,true,"pfff");;Destructuration : let (a,b,c) = triplet;;

Cas particulier : les couples fst: α ∗ β → α, snd: α ∗ β → β

Julien Forest - ensiie - IPF 22/50

Page 77: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel types produits

Etendre les types de base. . .t1* . . .*tn type des tuples (x1,· · ·,xn) avec xi : ti

Rq : α ∗ (β ∗ γ) 6= α ∗ β ∗ γ 6= (α ∗ β) ∗ γRq : (α ∗ β)→ γ 6= α→ β → γ

Construction : let triplet = (42,true,"pfff");;Destructuration : let (a,b,c) = triplet;;

Cas particulier : les couples fst: α ∗ β → α, snd: α ∗ β → β

Julien Forest - ensiie - IPF 22/50

Page 78: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel types produits

Etendre les types de base. . .t1* . . .*tn type des tuples (x1,· · ·,xn) avec xi : ti

Rq : α ∗ (β ∗ γ) 6= α ∗ β ∗ γ 6= (α ∗ β) ∗ γRq : (α ∗ β)→ γ 6= α→ β → γ

Construction : let triplet = (42,true,"pfff");;Destructuration : let (a,b,c) = triplet;;

Cas particulier : les couples fst: α ∗ β → α, snd: α ∗ β → β

Julien Forest - ensiie - IPF 22/50

Page 79: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations de types

Permet de creer ses propres types. . .Declaration : type t = . . .Affirmation : (expr : t)

type int_quad = int * int * int * int;;let t1 = 1,2,3,4;;let t2 : int_quad = 4,3,2,1;;

Enregistrements produits avec noms de champstype compl = { real : float; im : float };;let i = { real = 0.0; im = 1.0 };;let i_real = i.real;;

Julien Forest - ensiie - IPF 23/50

Page 80: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations de types

Permet de creer ses propres types. . .Declaration : type t = . . .Affirmation : (expr : t)

type int_quad = int * int * int * int;;let t1 = 1,2,3,4;;let t2 : int_quad = 4,3,2,1;;

Enregistrements produits avec noms de champstype compl = { real : float; im : float };;let i = { real = 0.0; im = 1.0 };;let i_real = i.real;;

Julien Forest - ensiie - IPF 23/50

Page 81: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations de types

Permet de creer ses propres types. . .Declaration : type t = . . .Affirmation : (expr : t)

type int_quad = int * int * int * int;;let t1 = 1,2,3,4;;let t2 : int_quad = 4,3,2,1;;

Enregistrements produits avec noms de champs

type compl = { real : float; im : float };;let i = { real = 0.0; im = 1.0 };;let i_real = i.real;;

Julien Forest - ensiie - IPF 23/50

Page 82: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel declarations de types

Permet de creer ses propres types. . .Declaration : type t = . . .Affirmation : (expr : t)

type int_quad = int * int * int * int;;let t1 = 1,2,3,4;;let t2 : int_quad = 4,3,2,1;;

Enregistrements produits avec noms de champstype compl = { real : float; im : float };;let i = { real = 0.0; im = 1.0 };;let i_real = i.real;;

Julien Forest - ensiie - IPF 23/50

Page 83: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel constructeurs

Definir types structures enumeration, union,. . .

type couleur = (* Ex enumeration *)| Pique | Coeur (* Majuscule en debut du nom *)| Carreau | Trefle

type rang =| Roi | Dame | Valet| Ordinaire of int (* Etiquette contenant int *)

Recuperation : filtrage sur la structure et pas sur la valeur !

match valeur with (* Une seule expression *)| motif1 -> e1 (* motif : constructeurs + variables*)| motif2 -> e2| · · · (* motifs testes DANS L’ORDRE ! *)

Filtrer : ∃? un remplacement des variables pour retrouver la valeur

Julien Forest - ensiie - IPF 24/50

Page 84: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel constructeurs

Definir types structures enumeration, union,. . .

type couleur = (* Ex enumeration *)| Pique | Coeur (* Majuscule en debut du nom *)| Carreau | Trefle

type rang =| Roi | Dame | Valet| Ordinaire of int (* Etiquette contenant int *)

Recuperation : filtrage sur la structure et pas sur la valeur !

match valeur with (* Une seule expression *)| motif1 -> e1 (* motif : constructeurs + variables*)| motif2 -> e2| · · · (* motifs testes DANS L’ORDRE ! *)

Filtrer : ∃? un remplacement des variables pour retrouver la valeur

Julien Forest - ensiie - IPF 24/50

Page 85: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel constructeurs

Definir types structures enumeration, union,. . .

type couleur = (* Ex enumeration *)| Pique | Coeur (* Majuscule en debut du nom *)| Carreau | Trefle

type rang =| Roi | Dame | Valet| Ordinaire of int (* Etiquette contenant int *)

Recuperation : filtrage sur la structure et pas sur la valeur !

match valeur with (* Une seule expression *)| motif1 -> e1 (* motif : constructeurs + variables*)| motif2 -> e2| · · · (* motifs testes DANS L’ORDRE ! *)

Filtrer : ∃? un remplacement des variables pour retrouver la valeur

Julien Forest - ensiie - IPF 24/50

Page 86: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel constructeurs

Definir types structures enumeration, union,. . .

type couleur = (* Ex enumeration *)| Pique | Coeur (* Majuscule en debut du nom *)| Carreau | Trefle

type rang =| Roi | Dame | Valet| Ordinaire of int (* Etiquette contenant int *)

Recuperation : filtrage sur la structure et pas sur la valeur !

match valeur with (* Une seule expression *)| motif1 -> e1 (* motif : constructeurs + variables*)| motif2 -> e2| · · · (* motifs testes DANS L’ORDRE ! *)

Filtrer : ∃? un remplacement des variables pour retrouver la valeurJulien Forest - ensiie - IPF 24/50

Page 87: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

motif : constructeurs + variables Filtrer : ∃? remplacement

Pas de nom de valeur dans les motifsFiltrage exhaustif

let x = · · ·let y = 2match x with| Roi -> Printf.printf "Wow"| Ordinaire -> Printf.printf "Bof"| _ -> Printf.printf "Ok"(*En dernier : ORDRE *)

Julien Forest - ensiie - IPF 25/50

Page 88: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

motif : constructeurs + variables Filtrer : ∃? remplacement

Pas de nom de valeur dans les motifsFiltrage exhaustif

let x = · · ·

let y = 2

match x with| Roi -> Printf.printf "Wow"| Ordinaire toto -> Printf.printf "Bof"

| _ -> Printf.printf "Ok"(*En dernier : ORDRE *)

Julien Forest - ensiie - IPF 25/50

Page 89: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

motif : constructeurs + variables Filtrer : ∃? remplacementPas de nom de valeur dans les motifs

Filtrage exhaustif

let x = · · ·let y = 2match x with| Roi -> Printf.printf "Wow"| Ordinaire y -> Printf.printf "Bof"

| _ -> Printf.printf "Ok"(*En dernier : ORDRE *)

Julien Forest - ensiie - IPF 25/50

Page 90: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

motif : constructeurs + variables Filtrer : ∃? remplacementPas de nom de valeur dans les motifsFiltrage exhaustif

let x = · · ·

let y = 2

match x with| Roi -> Printf.printf "Wow"| Ordinaire toto -> Printf.printf "Bof"| Dame | Valet -> Printf.printf "Ok"(*Meme valeur *)

Julien Forest - ensiie - IPF 25/50

Page 91: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

motif : constructeurs + variables + _ Filtrer : ∃? remplacementPas de nom de valeur dans les motifsFiltrage exhaustif

let x = · · ·

let y = 2

match x with| Roi -> Printf.printf "Wow"| Ordinaire toto -> Printf.printf "Bof"| _ -> Printf.printf "Ok"(*En dernier : ORDRE *)

Julien Forest - ensiie - IPF 25/50

Page 92: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

C’est une expression⇒ utilisable partout

let f = fun x -> match x with · · ·

Structure profonde :

type carte = C of (Couleur * rang)

match x with| C(Coeur,Dame) -> Printf.printf "Ok"| C(_,Ordinaire n) -> Printf.printf "valeur = %d" n| _ -> · · ·

Julien Forest - ensiie - IPF 26/50

Page 93: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

C’est une expression⇒ utilisable partout

let f = fun x -> match x with · · ·

Structure profonde :

type carte = C of (Couleur * rang)

match x with| C(Coeur,Dame) -> Printf.printf "Ok"| C(_,Ordinaire n) -> Printf.printf "valeur = %d" n| _ -> · · ·

Julien Forest - ensiie - IPF 26/50

Page 94: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel filtrage

C’est une expression⇒ utilisable partout

let f = fun x -> match x with · · ·

Structure profonde :

type carte = C of (Couleur * rang)

match x with| C(Coeur,Dame) -> Printf.printf "Ok"| C(_,Ordinaire n) -> Printf.printf "valeur = %d" n| _ -> · · ·

Julien Forest - ensiie - IPF 26/50

Page 95: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel inductifs

cf. cours de logiqueType : ensemble inductif def par les constructeurs.

type entier =| Z| S of entier

match . . . with| Z -> . . .| S e -> . . .

let rec int_of_entier = fun e ->match e with| Z -> 0| S e’ -> 1 + int_of_entier e’

Julien Forest - ensiie - IPF 27/50

Page 96: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel inductifs

cf. cours de logiqueType : ensemble inductif def par les constructeurs.

type entier =| Z| S of entier

match . . . with| Z -> . . .| S e -> . . .

let rec int_of_entier = fun e ->match e with| Z -> 0| S e’ -> 1 + int_of_entier e’

Julien Forest - ensiie - IPF 27/50

Page 97: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel inductifs

cf. cours de logiqueType : ensemble inductif def par les constructeurs.

type entier =| Z| S of entier

match . . . with| Z -> . . .| S e -> . . .

let rec int_of_entier = fun e ->match e with| Z -> 0| S e’ -> 1 + int_of_entier e’

Julien Forest - ensiie - IPF 27/50

Page 98: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau fonctionnel inductifs

cf. cours de logiqueType : ensemble inductif def par les constructeurs.

type entier =| Z| S of entier

match . . . with| Z -> . . .| S e -> . . .

let rec int_of_entier = fun e ->match e with| Z -> 0| S e’ -> 1 + int_of_entier e’

Julien Forest - ensiie - IPF 27/50

Page 99: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero

. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calculet peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;exception Autre of string

Levee :raise Mon_exceptionraise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 100: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calculet peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;exception Autre of string

Levee :raise Mon_exceptionraise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 101: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calcul

et peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;exception Autre of string

Levee :raise Mon_exceptionraise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 102: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calculet peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;exception Autre of string

Levee :raise Mon_exceptionraise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 103: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calculet peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;

exception Autre of string

Levee :raise Mon_exception

raise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 104: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Comme en objet : valeur en cas d’erreur1/0;;Exception: Division_by_zero. . . affinage du typage (fonctions partielle)

. . . pour interrompre le calculet peut-etre le reprendre plus tard autrement

Definition :exception Mon_exception;;exception Autre of string

Levee :raise Mon_exceptionraise (Autre "Impossible de faire le calcul")

Julien Forest - ensiie - IPF 28/50

Page 105: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Rattrapage : cf objet try e1 with Motif_exc -> e2

1. Evalutation de e1 sans exception ; valeur de e1

2. Exception dans e1a Filtree par Motif_exc ; valeur de e2b Non filtree : exception propagee

Julien Forest - ensiie - IPF 29/50

Page 106: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Rattrapage : cf objet try e1 with Motif_exc -> e2

1. Evalutation de e1 sans exception ; valeur de e1

2. Exception dans e1a Filtree par Motif_exc ; valeur de e2b Non filtree : exception propagee

Julien Forest - ensiie - IPF 29/50

Page 107: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Noyau (pas tres fonctionnel) exceptions

Rattrapage : cf objet try e1 with Motif_exc -> e2

1. Evalutation de e1 sans exception ; valeur de e1

2. Exception dans e1a Filtree par Motif_exc ; valeur de e2b Non filtree : exception propagee

Julien Forest - ensiie - IPF 29/50

Page 108: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI VaccuiteI AppartenanceI Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 109: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI VaccuiteI AppartenanceI Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 110: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en tete

I VaccuiteI AppartenanceI Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 111: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI Vaccuite

I AppartenanceI Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 112: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI VaccuiteI Appartenance

I Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 113: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI VaccuiteI AppartenanceI Concatenation

PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 114: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

Structure dynamique

Structure :I VideI Ajout de e en tete de l

Fonction :I Ajout en teteI VaccuiteI AppartenanceI Concatenation PB : temps de calcul

Julien Forest - ensiie - IPF 30/50

Page 115: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant

+ FILO : ordre d’entree conserve- Appartenance lineaire- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 116: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant+ FILO : ordre d’entree conserve

- Appartenance lineaire- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 117: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant+ FILO : ordre d’entree conserve- Appartenance lineaire

- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 118: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant+ FILO : ordre d’entree conserve- Appartenance lineaire- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 119: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant+ FILO : ordre d’entree conserve- Appartenance lineaire- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 120: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

+ Ajout en tete : temps constant+ FILO : ordre d’entree conserve- Appartenance lineaire- Concatenation lineaire

Type ’a list natif dans Ocaml :I Liste vide : []I Constructeur : ::

Utilsables dans le filtrage

Notation : [a;b;. . .;k]⇔ a::b::. . .::[]

Julien Forest - ensiie - IPF 31/50

Page 121: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes

iterateurs

map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[])

; (f a1)::. . .::(f an)::[]

Type :

(α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 122: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elements

map f (a1::. . .::an::[])

; (f a1)::. . .::(f an)::[]

Type :

(α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 123: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[])

; (f a1)::. . .::(f an)::[]Type :

(α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 124: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]

Type :

(α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 125: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]Type :

(α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 126: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]Type : (α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 127: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]Type : (α→ β)→ α list→ β list

Equation :

I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 128: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]Type : (α→ β)→ α list→ β list

Equation :I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 129: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs map

Parcours de structure et construction de resultat portants sur lastructure

map : liste de resultat d’application de fonction sur les elementsmap f (a1::. . .::an::[]) ; (f a1)::. . .::(f an)::[]Type : (α→ β)→ α list→ β list

Equation :I ∀f, map f [] =[]

I Hyp : ∀f,map f l = v(f)∀e, ∀f,map f (e::l) =(f e)::v(f)

Julien Forest - ensiie - IPF 32/50

Page 130: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[])

;

f(. . .(f acc a1). . .)an

Type :

(α→ β → α)→ α→ βlist→ α Terminal

I fold_right f (a1::. . .::an::[]) acc

;

f a1(. . .(f an acc). . .)

Type :

(α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 131: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possibles

I fold_left f acc(a1::. . .::an::[])

;

f(. . .(f acc a1). . .)an

Type :

(α→ β → α)→ α→ βlist→ α Terminal

I fold_right f (a1::. . .::an::[]) acc

;

f a1(. . .(f an acc). . .)

Type :

(α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 132: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[])

;

f(. . .(f acc a1). . .)an

Type :

(α→ β → α)→ α→ βlist→ α TerminalI fold_right f (a1::. . .::an::[]) acc

;

f a1(. . .(f an acc). . .)

Type :

(α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 133: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[]) ;

f(. . .(f acc a1). . .)anType :

(α→ β → α)→ α→ βlist→ α TerminalI fold_right f (a1::. . .::an::[]) acc ;

f a1(. . .(f an acc). . .)Type :

(α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 134: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[]) ;

f(. . .(f acc a1). . .)anType : (α→ β → α)→ α→ βlist→ α

TerminalI fold_right f (a1::. . .::an::[]) acc ;

f a1(. . .(f an acc). . .)Type :

(α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 135: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[]) ;

f(. . .(f acc a1). . .)anType : (α→ β → α)→ α→ βlist→ α

Terminal

I fold_right f (a1::. . .::an::[]) acc ;

f a1(. . .(f an acc). . .)Type : (α→ β → β)→ αlist→ β → β

Non terminal

Julien Forest - ensiie - IPF 33/50

Page 136: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Listes iterateurs fold

Parcours de structure et construction de resultat portants sur lastructure

fold : composition d’application de fonction sur les elements

listes : deux sens possiblesI fold_left f acc(a1::. . .::an::[]) ;

f(. . .(f acc a1). . .)anType : (α→ β → α)→ α→ βlist→ α Terminal

I fold_right f (a1::. . .::an::[]) acc ;

f a1(. . .(f an acc). . .)Type : (α→ β → β)→ αlist→ β → β Non terminal

Julien Forest - ensiie - IPF 33/50

Page 137: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutiles

Sol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> int

Julien Forest - ensiie - IPF 34/50

Page 138: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutilesSol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> int

Julien Forest - ensiie - IPF 34/50

Page 139: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutilesSol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> int

Julien Forest - ensiie - IPF 34/50

Page 140: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutilesSol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :

leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> int

Julien Forest - ensiie - IPF 34/50

Page 141: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutilesSol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> int

Julien Forest - ensiie - IPF 34/50

Page 142: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Zipper

Listes : ajout au milieu + persistance⇒ copies inutilesSol : avoir un point de vue local (cf. liste doublement chaınees)

type ’a zipper = {left : ’a list;pos : int; (* position courrante *)right : ’a list; } (* valeur courante dans right *)

Fonctions :leftmost, rightmost, is_empty : ’a zipper -> boolempty : ’a zipperinsert : ’a -> ’a zipper -> ’a zipper;

delete : ’a zipper -> ’a zipper; (*peut echouer *)go_left : ’a zipper -> ’a zipper; (*peut echouer *)go_right : ’a zipper -> ’a zipper; (*peut echouer *)get : ’a zipper -> ’a; (*peut echouer *)pos : ’a zipper -> intJulien Forest - ensiie - IPF 34/50

Page 143: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres

: binaires polymorphes

e1 e2 . . . en

f2 . . .

. . .

type ’a arbre=| Empty| Node of (’a arbre*’a*’a arbre)

plus des fonctions de parcours, . . .

Julien Forest - ensiie - IPF 35/50

Page 144: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : binaires polymorphes

e1 e2 . . . en

f2 . . .

. . .

type ’a arbre=| Empty| Node of (’a arbre*’a*’a arbre)

plus des fonctions de parcours, . . .

Julien Forest - ensiie - IPF 35/50

Page 145: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : binaires polymorphes

e1 e2 . . . en

f2 . . .

. . .

type ’a arbre=| Empty

| Node of (’a arbre*’a*’a arbre)

plus des fonctions de parcours, . . .

Julien Forest - ensiie - IPF 35/50

Page 146: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : binaires polymorphes

e1 e2 . . . en

f2 . . .

. . .

type ’a arbre=| Empty| Node of (’a arbre*’a*’a arbre)

plus des fonctions de parcours, . . .

Julien Forest - ensiie - IPF 35/50

Page 147: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : binaires polymorphes

e1 e2 . . . en

f2 . . .

. . .

type ’a arbre=| Empty| Node of (’a arbre*’a*’a arbre)

plus des fonctions de parcours, . . .

Julien Forest - ensiie - IPF 35/50

Page 148: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : n-aires

Nombres variables de fils.

type ’a arbre=| Empty

(*Ne peut pas etre sous arbre d’un arbre non vide *)

| Node of ’a * (’a arbre list)

Plusieurs representations d’un meme arbre.

Contraindre la representation dans les commentaires. ⇒ fonctions deconstruction

Julien Forest - ensiie - IPF 36/50

Page 149: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : n-aires

Nombres variables de fils.

type ’a arbre=| Empty

(*Ne peut pas etre sous arbre d’un arbre non vide *)

| Node of ’a * (’a arbre list)

Plusieurs representations d’un meme arbre.

Contraindre la representation dans les commentaires. ⇒ fonctions deconstruction

Julien Forest - ensiie - IPF 36/50

Page 150: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : n-aires

Nombres variables de fils.

type ’a arbre=| Empty(*Ne peut pas etre sous arbre d’un arbre non vide *)| Node of ’a * (’a arbre list)

Plusieurs representations d’un meme arbre.

Contraindre la representation dans les commentaires.

⇒ fonctions deconstruction

Julien Forest - ensiie - IPF 36/50

Page 151: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : n-aires

Nombres variables de fils.

type ’a arbre=| Empty(*Ne peut pas etre sous arbre d’un arbre non vide *)| Node of ’a * (’a arbre list)

Plusieurs representations d’un meme arbre.

Contraindre la representation dans les commentaires. ⇒ fonctions deconstruction

Julien Forest - ensiie - IPF 36/50

Page 152: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : n-aires (2)

Nombres variables de fils.

type ’a ne_arbre=| Node of ’a * (’a ne_arbre list)

type ’a arbre=| Empty| Ne of ’a ne_arbre

Julien Forest - ensiie - IPF 37/50

Page 153: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : specialises

Pour un type de donnees particulier.

type bexpr =| Val of bool| And of bexpr * bexpr| Or of bexpr * bexpr| Not of bexpr

let rec eval be =match be with| Val b -> b| And(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 && v2

| Or(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 || v2

| Not b -> let v = eval b in not v

Julien Forest - ensiie - IPF 38/50

Page 154: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : specialises

Pour un type de donnees particulier.

type bexpr =| Val of bool| And of bexpr * bexpr| Or of bexpr * bexpr| Not of bexpr

let rec eval be =match be with| Val b -> b| And(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 && v2

| Or(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 || v2

| Not b -> let v = eval b in not v

Julien Forest - ensiie - IPF 38/50

Page 155: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Arbres : specialises

Pour un type de donnees particulier.

type bexpr =| Val of bool| And of bexpr * bexpr| Or of bexpr * bexpr| Not of bexpr

let rec eval be =match be with| Val b -> b| And(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 && v2

| Or(b1,b2) ->let v1 = eval b1 in let v2 = eval b2 in v1 || v2

| Not b -> let v = eval b in not v

Julien Forest - ensiie - IPF 38/50

Page 156: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Constatation

Conflits de noms

Representation concrete polluante

Duplication

; Modules

Julien Forest - ensiie - IPF 39/50

Page 157: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Constatation

Conflits de noms

Representation concrete polluante

Duplication

; Modules

Julien Forest - ensiie - IPF 39/50

Page 158: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes

: maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 159: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 160: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)

Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 161: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )

Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 162: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 163: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 164: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Generalites

Gros code ; petites unites coherentes : maintenance + reutilisation

Module = Corp(prive) + Interface(publique)Interface : com. avec exterieur (main, peau,yeux,. . . )Corp : fonctionnement du module (foie, poumons, rate, cerveau?)

Julien Forest - ensiie - IPF 40/50

Page 165: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Principes

Interfacedeclaration/definition typesdeclaration de fonctions

CorpsDefinition typesDefinition fonctions

Interface :I Declaration des types (abstrait) et des fonctions a exporter.I Definition des types concrets a exporter.

Corps :I au moins types declares et/ou definis dans interfaceI au moins definitions fonctions declarees dans interfaces.

Julien Forest - ensiie - IPF 41/50

Page 166: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Schema

interface

:typesprof. func.

corps

:def. typesdef. func.

M1

profil

interface

corpsprofil

M2

utilise

Julien Forest - ensiie - IPF 42/50

Page 167: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Schema

interface :typesprof. func.

corps :def. typesdef. func.

M1

profil

interface

corpsprofil

M2

utilise

Julien Forest - ensiie - IPF 42/50

Page 168: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Schema

interface

:typesprof. func.

corps

:def. typesdef. func.

M1

profil

interface

corpsprofil

M2

utilise

Julien Forest - ensiie - IPF 42/50

Page 169: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Schema

interface

:typesprof. func.

corps

:def. typesdef. func.

M1

profil

interface

corpsprofil

M2

utilise

Julien Forest - ensiie - IPF 42/50

Page 170: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Schema

interface

:typesprof. func.

corps

:def. typesdef. func.

M1

profil

interface

corpsprofil

M2

utilise

Julien Forest - ensiie - IPF 42/50

Page 171: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Modules Fichiers

.mli = interface Informations publiques

.ml = implantation Cambouis

Compilation separee avec ocamlc -c (ou ocamlopt -c)D’abord .mli ; .cmiEnsuite .ml ; .cmo (ou .cmx) Verification de conformite

Utilisation : denomination par majusculeUn seul fichier a compiler : le fichier modifie (sauf si interface)

Julien Forest - ensiie - IPF 43/50

Page 172: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles

Structure dynamique

Fonctions :I Vide + test vacuiteI AjoutI AppartenanceI #,

⋃,⋂

I RetraitI . . .

Organisation : ordonner les ∈; savoir ou chercher

Julien Forest - ensiie - IPF 44/50

Page 173: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles

Structure dynamique

Fonctions :I Vide + test vacuiteI AjoutI AppartenanceI #,

⋃,⋂

I RetraitI . . .

Organisation : ordonner les ∈; savoir ou chercher

Julien Forest - ensiie - IPF 44/50

Page 174: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles

Structure dynamique

Fonctions :I Vide + test vacuiteI AjoutI AppartenanceI #,

⋃,⋂

I RetraitI . . .

Organisation : ordonner les ∈; savoir ou chercher

Julien Forest - ensiie - IPF 44/50

Page 175: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles

Structure dynamique

Fonctions :I Vide + test vacuiteI AjoutI AppartenanceI #,

⋃,⋂

I RetraitI . . .

Organisation : ordonner les ∈; savoir ou chercher

Julien Forest - ensiie - IPF 44/50

Page 176: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles

Structure dynamique

Fonctions :I Vide + test vacuiteI AjoutI AppartenanceI #,

⋃,⋂

I RetraitI . . .

Organisation : ordonner les ∈; savoir ou chercher

Julien Forest - ensiie - IPF 44/50

Page 177: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles profils

type int_set

val empty : int_set

val is_empty : int_set -> bool

val mem : int -> int_set -> bool

val cardinal : int_set -> int

val union : int_set -> int_set -> int_set

val inter : int_set -> int_set -> int_set

val remove : int -> int_set -> int_set

Julien Forest - ensiie - IPF 45/50

Page 178: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles Listes

I Facile a implanter

I Temps de recherche/insertion

Julien Forest - ensiie - IPF 46/50

Page 179: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles Listes

I Facile a implanter

I Temps de recherche/insertion

Julien Forest - ensiie - IPF 46/50

Page 180: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles Listes

I Facile a implanter

I Temps de recherche/insertion

Julien Forest - ensiie - IPF 46/50

Page 181: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

type int_set = Empty | Node (int_set*int*int_set)

r

< r >r

MAINTENIR L’INVARIANT?

Constructeur fute

I Recherche et construction ; max : profondeurI Reduire cout⇒ reduire profondeur (pour une autre fois).

Julien Forest - ensiie - IPF 47/50

Page 182: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

type int_set = Empty | Node (int_set*int*int_set)

r

< r >r

MAINTENIR L’INVARIANT?

Constructeur fute

I Recherche et construction ; max : profondeurI Reduire cout⇒ reduire profondeur (pour une autre fois).

Julien Forest - ensiie - IPF 47/50

Page 183: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

type int_set = Empty | Node (int_set*int*int_set)

r

< r >r

MAINTENIR L’INVARIANT? Constructeur fute

I Recherche et construction ; max : profondeurI Reduire cout⇒ reduire profondeur (pour une autre fois).

Julien Forest - ensiie - IPF 47/50

Page 184: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

type int_set = Empty | Node (int_set*int*int_set)

r

< r >r

MAINTENIR L’INVARIANT? Constructeur fute

I Recherche et construction ; max : profondeur

I Reduire cout⇒ reduire profondeur (pour une autre fois).

Julien Forest - ensiie - IPF 47/50

Page 185: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

type int_set = Empty | Node (int_set*int*int_set)

r

< r >r

MAINTENIR L’INVARIANT? Constructeur fute

I Recherche et construction ; max : profondeurI Reduire cout⇒ reduire profondeur (pour une autre fois).

Julien Forest - ensiie - IPF 47/50

Page 186: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

Subtilites :I Ajout/recherche : on compare la valeur a la racine et on part du

bon cote

I Retrait idee :1. rechercher la valeur a retirer2. retirer min sous-arbre droit3. mettre min sous-arbre droit a la racine locale

Julien Forest - ensiie - IPF 48/50

Page 187: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait

de 12

: le slide secret

10

9 12

11 18

15

13

14

Recherche valeurRecherche min sous arbre droitremplacement

Julien Forest - ensiie - IPF 49/50

Page 188: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 12

11 18

15

13

14

Recherche valeur

Recherche min sous arbre droitremplacement

Julien Forest - ensiie - IPF 49/50

Page 189: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 12

11 18

15

13

14

Recherche valeur

Recherche min sous arbre droitremplacement

Julien Forest - ensiie - IPF 49/50

Page 190: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 12

11 18

15

13

14

Recherche valeur

Recherche min sous arbre droit

remplacement

Julien Forest - ensiie - IPF 49/50

Page 191: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 12

11 18

15

13

14

Recherche valeur

Recherche min sous arbre droit

remplacement

Julien Forest - ensiie - IPF 49/50

Page 192: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 12

11 18

15

13

14

Recherche valeur

Recherche min sous arbre droit

remplacement

Julien Forest - ensiie - IPF 49/50

Page 193: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

ABR : Retrait de 12 : le slide secret

10

9 13

11 18

15

14

Recherche valeur

Recherche min sous arbre droitremplacement

Julien Forest - ensiie - IPF 49/50

Page 194: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

I Moins facile a implanter

I Temps de recherche/insertion meilleurs (parfois)

I Tests generiques : toujours pas de solution

Julien Forest - ensiie - IPF 50/50

Page 195: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

I Moins facile a implanter

I Temps de recherche/insertion meilleurs (parfois)

I Tests generiques : toujours pas de solution

Julien Forest - ensiie - IPF 50/50

Page 196: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

I Moins facile a implanter

I Temps de recherche/insertion meilleurs (parfois)

I Tests generiques : toujours pas de solution

Julien Forest - ensiie - IPF 50/50

Page 197: Programmation fonctionnelleweb4.ensiie.fr/~stefania.dumbrava/IPF/cours.pdf · Programmation fonctionnelle Julien Forest - ensiie - IPF 1/50. Fonctionnement du cours Regles de vie

Ensembles ABR

I Moins facile a implanter

I Temps de recherche/insertion meilleurs (parfois)

I Tests generiques : toujours pas de solution

Julien Forest - ensiie - IPF 50/50