2014-09-04
1
IFT359 – Programmation fonctionnelle
Thème #1
Introduction à la programmation fonctionnelle,
le λ-calcul
1
LES STYLES DE PROGRAMMATION
LA PROGRAMMATION FONCTIONNELLE
2
Les styles de programmation
Programmation impérative
programmation structurée
Programmation logique
Programmation objet
Programmation fonctionnelle
Ne pas confondre style de programmation et langage de
programmation.
Il est possible de faire de la programmation fonctionnelle en C et
inversement de faire de la programmation impérative en DrRacket.
Les langages sont conçus pour favoriser un style de programmation.
Dans ce cours, vous apprenez la programmation fonctionnelle
Apprendre à programmer avec DrRacket est le moyen préconisé pour
atteindre ce but
3
La programmation fonctionnelle
Un aperçu
Utilise sous sa forme stricte que deux formes syntaxiques
– fonction
application de fonction
Les fonctions sont des objets de première classe
La récursion est la principale structure de contrôle
Une grande attention est portée aux listes
sous une forme stricte, les listes sont définies comme une fonction
la récursion sur les sous-listes remplace les boucles
Plusieurs langages fonctionnelles déconseillent l’utilisation de
l’affectation
les effets de bord
Un programme n’est pas une séquence d’instructions mais une
expression à évaluer et des définitions de fonctions
4
2014-09-04
2
Les langages multiparadigmes
Plusieurs langages modernes ont intégré des concepts propres aux
langages fonctionnels.
– ramasse-miette
λ
–fermeture
–macro
immutabilité
Plusieurs langages fonctionnels intègrent les concepts de la
programmation objet et de la programmation logique.
Une version primitive des objets existait dans les premières versions de
LISP
5
LE λ-CALCUL
LE PLUS SIMPLE LANGAGE DE
PROGRAMMATION
6
Le λ-calcul : introduction
Conçu par Alonzo Church en 1941
Fondation formelle de la programmation fonctionnelle
Le λ-calcul est à la programmation fonctionnelle ce que la machine
de Turing est aux langages comme C, C++, Java
Le plus simple langage de programmation
Syntaxe minimal
λ-termes = variable | abstraction | application [| constante]
Les constantes ne sont pas nécessaires, elles symbolisent des fonctions connues
et permettent de simplifier les calculs
Une abstraction est une fonction
Exécution d’un programme
est une séquence de réduction
7
Le λ-calcul : syntaxe
Soit (pour cette diapositive et les suivantes)
a, b, c …des constantes,
u, v, w … des variables,
U, V, W … des λ-termes ( variable, constante, abstraction, application)
Les variables et les constantes sont des ensembles disjoints
d’identificateurs
abstraction = λ(x)V
elle est interprétée comme une fonction qui associe à x l’expression V
(qui contient généralement des occurrences de x)
x est une variable liée dont la portée est V
une variable liée peut être renommée sans conséquence
une variable non liée est dite libre
U V est un λ-terme nommé application
dans le cas où U est une abstraction, une application est interprétée
comme l’application d’une fonction U à un argument V
8
2014-09-04
3
Le λ-calcul : syntaxe
La portée d’une variable liée par une λ s’étend le plus loin à droite
La portée est statique, la valeur de la liaison est la même pour toute la
portée
Attention λ(x)x Y (λ(x)U x V) x = λ(x1)x1Y (λ(x2) U x2V) x1
Les λs’associe à droite
λ(x)λ(y)U =λ(x)(λ(y)U).
On supprime les () et les λ intermédiaires dans des abstractions qui se
suivent
λ(x)λ(y)U = λ(xy)U
Les applications s’associe à gauche
X1X2... Xn=
((X1X2) ... Xn)
x2est l’argument de la fonction x1et le résultat ultime de l’application de x1à
x2est une fonction dont l’argument est x3
Les applications ont précédence sur les abstractions
λ(x) X Y Z = λ(x)(X Y) Z = (λ(x)((X Y) Z))
9
Le λ-calcul : syntaxe
Dans la littérature, la syntaxe traditionnelle utilise le . pour séparer
les variables d’une abstraction de son corps.
U   . U
  . .  . 
10
Le λ-calcul : syntaxe
pour simplifier l’écriture, on écrira souvent
U V plutôt que (U V)
U V W plutôt que ((U V) W)
–…
–(λ(x1x2) U) a1a2plutôt que (((λ(x1) (λ(x2) U)) a1) a2)
–…
Par contre, nous distinguerons entre U et (U)
Si U = x y z alors (U) est (((x y) z)) et non pas ((x y) z)
i.e. x y z est une abréviation de ((x y) z)
11
λ-calcul : Exemple de λ-termes
Pour simplifier, on considère que +, 2 et 3 sont des λ-termes
La fonction f: x
x+2 sera dénotée (λ (x)(+ x 2))
L'application de f à 3s'écrit ((λ (x) (+ x 2))3)
L’évaluation de ((λ (x) (+ x 2))3) est (+ 3 2) = ((+ 3) 2).
Le reste dépend des fonctions qui sont représentées par + 3 2
La fonction identité f: x
x est (λ (x) x)
La fonction constante f: x
2 est (λ (x) 2)
La est une fonction qui retourne une fonction
constante
L’application 2s’évalue comme étant 2
La notion d’évaluation d’une application sera définie formellement dans
les diapositives qui suivent et sera appelée la β-réduction
12
2014-09-04
4
Le λ-calcul : variable liée et libre
Variables liées
Varlié(a) = {}
si on ne donne pas la définition de a, on fait abstraction des variables que sa
définition peut contenir.
Varlié(x) = {}
Varlié(XY)= Varlié(X) U Varlié(Y)
Varlié ((λ (x) X)= Varlié(X) U {x}
Variables libres
une variable non liée est dite libre
Dans l'expression ((λ (x) x) x), il y a 2 occurences de x mais ce sont
deux variables différentes
il faut lire ((λ (x1) x1) x)
–x
1est liée
x est libre
13
Le λ-calcul : un programme
Un programme est un λ-terme.
Pour simplifier l’écriture, on crée souvent plusieurs définitions
L’exécution d’un programme est une séquence de réduction
–X Y signifie que X a été réduit à Y
l’exécution s’arrête lorsqu’il n’y a plus d’applications qui peuvent être
réduites (aucune substitution non triviale peut être appliquée).
–le λ-terme résultant est dit dans la forme normale de X
L’opération primitive permettant la réduction est la substitution
On dit alors souvent évaluation par substitution
Comme on fait avec un éditeur des copy-paste pour effectuer une
substitution, alors j’associe souvent la substitution au copy-paste.
Vous serez étonné de la puissance de calcul du copy-paste.
14
Le λ-calcul : α-conversion
α-conversion
deux λ-termes sont équivalents s’il est possible de les rendre identiques
après avoir renommer les variables liées dans une expression par une
autre qui n’est pas libre dans cette expression
si y n’est pas libre dans M alors λ(x)M αλ(y)M et λ(x)M αλ(y)M
on renomme que les variables x qui sont liés par un λ
–Exemple
•(λ(x)((λ(y)y) x)) α(λ(y)((λ(y)y) y)) est correcte parce que y n’est pas libre
dans ((λ(y)y) x). Plus précisément en dépit du même nom, nous avons deux
variables y différentes.
inutile cependant de jouer avec le feux
15
Le λ-calcul : substitution
Substitution notée T[x := U]
la substitution dans T de la variable x par U et se définit par récurrence
sur T :
1. si T est une constante alors T[x := U]=T
2. si T=x alors T[x := U]=U
3. si Tx et T est une variable alors T[x := U]=T
4. si T = V W alors T[x := U] = V[x := U] W[x := U]
5. si T = λ(y)V et yx et y est non libre dans U alors T[x := U] = λ(y)(V[x := U])
6. si T = λ(y)V et yx et y est libre dans U alors T[x := U] = λ(z)((V[y:=z])[x := U])
7. si T = λ(y)V et x=y alors T[x := U] = T
#6 consiste à utiliser l’ α-conversion avant d’appliquer 5. L’ α-conversion est
nécessaire parce que le résultat d’une substitution ne doit pas entrainer de
confusion entre deux variables qui portent le même nom. Cette confusion
entraîne la capture d’une variable libre y dans U par le λ(y)
La substitution est l’opération d’évaluation primitive
16
2014-09-04
5
Le λ-calcul : substitution
Exemple du cas 5 : y est non libre dans U
–T ==λ(y)V
U == λ(y)xyz
V == azyx
on suppose ici que le z de U et le z de V est la même variable;
i.e. on suppose que celui qui a composé la question ou le problème n'avait
pas l'intention de se tirer dans le pied.
T[x := U] == λ(y)V[x:=U]
== (λ(y) azyx)[x:=U]
== (λ(y) azyx [x:=U]) ;;; application de 5
== λ(y)a[x:=U] z[x:=U] y[x:=U] x[x:=U] ;;; application de 4
== λ(y)a z y λ(y)xyz ;;; application de 1,2,3
17
Le λ-calcul : substitution
Exemple du cas 6 : y est libre dans U
–T==λ(y)V
U == xyz
V == azyx
T[x := U] == (λ(y) V) [x := U]
== λ(w)((V[y:=w])[x:U]) ;;; -conversion
== λ(w)((azyx [y:=w])[x:U])
== λ(w)((a[y:=w]z[y:=w]y[y:=w]x[y:=w])[x:U]) ;;;application 4
== λ(w)(azwx [x:=U]) ;;; application de 1,2,3
== λ(w)a[x:=U] z[x:=U] w[x:=U] x[x:=U] ;;; application 5 puis 4
== λ(w)a z w xyz ;;; application de 1,2,3
18
Le λ-calcul : substitution
exemple du cas 6 : y == x
i.e. la variable à substituer est la variable de l’abstraction
–T==λ(y)V
U == xyz
V == azyx
T[y := U] == (λ(y)azyx)[y:=U] {ne pas confondre avec λ(y)(azyx)[y:=U] *
== (λ(y)azyx)
* la substition s’applique au tout vs la sustitution s’applique à azyx
19
Le λ-calcul : β-conversion
β-réduction
ne s’applique qu’aux expressions réductibles que l’on nomme rédex et
qui ont toujours la forme (λ(x)M) N
–(λ(x)M) N βM[x :=N]
–Exemple
•(λ(x)xy)a β (xy)[x := a] = ay
•((λ(x)x x)(λ(y)y)) β(x x) [x := (λ(y)y)) ] =(λ(y)y) (λ(y)y)
βy[y:= (λ(y)y))]=λ(y) y
•((λ(x)(λy(x) y))y) α((λ(x)(λ(y1)x y1))y) β(λ(y1)x y1) [x:=y] = (λ(y1)y y1)
Remarque dans ((λ(x)(λ(y)x y))y) le y de (λ(y)x y) est lié alors que celui à
l’extérieur est libre, ce n’est donc pas la même variable bien que leurs noms
soient identiques. Le renommage est nécessaire pour éviter la capture après
la β-réduction. Nous avons implicitement utilisé le cas 6 de la réduction.
β-abstraction
M[x :=N] β(λ(x)M) N
20
1 / 15 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !