Algorithmique et Programmation Fonctionnelle

publicité
Algorithmique et Programmation Fonctionnelle
Algorithmique et Programmation Fonctionnelle
RICM3
Cours 9 : Lambda-calcul
Benjamin Wack
Polytech
2013 - 2014
1 / 37
Algorithmique et Programmation Fonctionnelle
La dernière fois
I
Typage
I
Polymorphisme
I
Inférence de type
I
Ordre supérieur
2 / 37
Algorithmique et Programmation Fonctionnelle
Correction de l’exercice
let flop f x y = f y x
On pose x : α
On pose y : β
f y est typable seulement si f : β → γ et alors f y : γ
f y x = (f y) x est typable seulement si γ = α → δ
et alors f y x : δ
D’où f : β → α → δ
D’où flop : (β → α → δ) → (α → β → δ)
3 / 37
Algorithmique et Programmation Fonctionnelle
Plan
Contexte
λ-termes
Évaluation
Modélisation
Récursivité
Conclusion
4 / 37
Algorithmique et Programmation Fonctionnelle
Contexte
Historique
L’informatique n’est pas une science nouvelle
I
Représentation symbolique de l’information
calculi = petits cailloux
I
Algorithmes
al-Khwarizmi 783-850, Euclide -300, Babylone -1800
I
Langages symboliques
Musique, équations, chimie
I
Machines
Boulier (mémoire), Pascaline (calculatrice), métier Jacquard
(programmable)... mais ce ne sont pas des ordinateurs !
6 / 37
Algorithmique et Programmation Fonctionnelle
Contexte
Le premier ordinateur
ENIAC 1946
Première machine universelle (capable d’exécuter tout programme)
ENIAC modifié 1948
Programme stocké en mémoire (architecture de Von Neumann)
Machine de Turing 1937
I
un ruban infini (' mémoire)
I
une tête de lecture / écriture (' bus)
I
une “table d’actions” (' processeur)
I
modèle théorique de ce qu’est un algorithme...
I
...mais il existe une machine capable de toutes les simuler
7 / 37
L’ordinateur n’a pas été découvert, il a été inventé !
Algorithmique et Programmation Fonctionnelle
Contexte
Qu’est-ce qu’un langage de programmation ?
Un langage commun entre l’homme et la machinela machine
Assembleur
Un langage commun entre l’homme et un modèle de la machine
I
Variables = mémoire ruban infini (et même à accès direct)
I
Conditionnelle = branchement enchaînement d’un calcul et
d’une action
I
Boucle = manipulation du registre PC cycle dans la table
d’action
I
...
8 / 37
Algorithmique et Programmation Fonctionnelle
Contexte
À quel machine correspond un langage fonctionnel ?
Aucune !
I
Au modèle fonctionnel : le λ-calcul
I
proposé par Alonzo Church en 1936 pour modéliser ce qu’est
une fonction calculable (i.e. par une machine)
I
Les deux modèles ont été montrés équivalents en 1937 par
Turing.
9 / 37
Algorithmique et Programmation Fonctionnelle
λ-termes
Syntaxe
Notations
I
x , y , z... sont des variables
I
A, B, C ...M, N sont des termes
Termes
Un terme peut être :
I
une variable x
I
une abstraction λx .A où A est un terme et x une variable
(équivaut à fun x -> A)
I
une application A B où A et B sont deux termes
I
et c’est tout !
11 / 37
Algorithmique et Programmation Fonctionnelle
λ-termes
Conventions
Application prioritaire
λx .x y = λx .(x y ) et pas (λx .x ) y
Application associative à gauche
(AB1 B2 . . . Bk ) = (. . . ((AB1 )B2 ) . . . Bk )
Abréviation des abstractions
(λx1 .λx2 . . . . λxk .A) = (λx1 .(λx2 . . . . (λxk .A) . . .)
= (λx1 x2 . . . xk .A)
Quizz
I
A B C = ((A B) C )
I
f (λx .x ) y = (f (λx .x )) y
I
λx .(λy .y z) x = λx .((λy .(y z)) x )
12 / 37
Algorithmique et Programmation Fonctionnelle
λ-termes
Notion de variable liée
Quelle différence y a-t-il entre fun x -> x et fun y -> y ?
Aucune, ce qui importe n’est pas le nom de la variable mais les
endroits où elle est présente.
Situations similaires omniprésentes en informatique et en
mathématiques :
I
∀x .P(x )
I
for (int i=0 ; i<n ; i++) { ... }
I
Rb
a
f (x )dx
On parle de variable liée, ou aussi variable muette.
13 / 37
Algorithmique et Programmation Fonctionnelle
λ-termes
α-conversion
Peut-on vraiment choisir un nom arbitraire pour une variable liée ?
λx .x y 6= λy .y y (capture)
α-conversion = renommer une variable liée sans utiliser une
variable déjà présente dans le terme
Exemple :
λx .xy =α λz.zy
14 / 37
Algorithmique et Programmation Fonctionnelle
λ-termes
Substitution
On note A[x := B] pour « remplacer les occurrences de x par B
dans A ».
Précautions :
I
(λx z.y )[x := A] = λA.y
??
λA.y n’est pas valide DONC ne pas remplacer après un λ.
I
(λx z.x z)[x := y ] = λx .y
??
x est liée au λ DONC ne pas la remplacer.
I
(λx z.y )[y := x ] = λx .x
??
y n’est pas liée mais le devient DONC renommer avant
Bref : toujours effectuer une α-conversion avant de substituer.
15 / 37
Algorithmique et Programmation Fonctionnelle
Évaluation
β-réduction
Les λ-termes sont des expressions qui ont donc vocation à être
évaluées.
Une règle locale
(λx .A) B →β A[x := B]
peut être appliquée partout dans le terme, répétée...
Exemples :
(λx .x ) B →β B
(λx .x y ) λz.z →β (λz.z) y →β y
(fun x ->
x )
- : int =
6
6 ;;
17 / 37
Algorithmique et Programmation Fonctionnelle
Évaluation
Notations
I
→ pour →β
I
→∗ la clôture réflexive transitive :
A →∗ B ssi
∃n ≥ 0, A0 , . . . , An ,
A = A0 → A1 → . . . → An = B
→ passe au contexte :
I
si A → B alors AC → BC et CA → CB
I
si A → B alors λx .A → λx .B
18 / 37
Algorithmique et Programmation Fonctionnelle
Évaluation
Exercices
I
(λx .xx )(λy .y ) →β (λy .y )(λy .y ) →β λy .y
I
(λx .(λy .xy ))y =α (λx .(λz.xz))y →β λz.yz
19 / 37
Algorithmique et Programmation Fonctionnelle
Évaluation
η-réduction
(λx .Ax ) B →β A B pour tout B
mais λx .Ax 6→β A
d’où une autre réduction λx .Ax →η A si x n’apparaît pas dans A
Aucun intérêt pour le calcul, mais utile pour le typage.
20 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Expressivité
Que peut-on calculer avec ça ?
I
“Tout” ! (thèse de Church-Turing)
I
En particulier tout ce qui constitue les algorithmes
Structures de contrôle
I
Conditionnelle
I
Boucles ?
22 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Expressivité *
Données
I
Booléens
I
Entiers
I
n-uplets
I
Et bien sûr, fonctions
23 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Booléens
vrai = λxy .x
faux = λxy .y
24 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Conditionnelle
ifthenelse = λbuv .buv
Vérifions ifthenelse vrai A B →∗ A
ifthenelse vrai A B
=
(λbuv .buv ) vrai A B
→
(λuv .vrai uv ) A B
→∗
(vrai A B)
=
(λxy .x )A B
→∗
A
Exercice : ifthenelse faux A B →∗ B
25 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Exercice : définir les connecteurs logiques
non
non = λb.ifthenelse b faux vrai →∗ λb.b faux vrai
et
et = λab.ifthenelse a b faux →∗ λab.a b faux
ou
ou = λab.ifthenelse a vrai b →∗ λab.a vrai b
26 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Couples
Le couple (A, B) est représenté par
λz.zAB
Projections
π1 = λs.s vrai
Vérifier que π1 λz.zAB →∗ A
π2 = λs.s faux
Vérifier que π2 λz.zAB →∗ B
27 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
Entiers de Church
0 = λfx .x
1 = λfx .fx
2 = λfx .f (fx )
et d’une manière générale :
n = λfx .f (f (...(fx )...)) = λfx .f n x
avec f itérée n fois.
Exemple : si n = λfx .f n x comment écrire A tel que An →∗ 2n ?
λnfx .n(λy .f (f y )) x
28 / 37
Algorithmique et Programmation Fonctionnelle
Modélisation
En TD
I
Successeur
1. soit en ajoutant un f en tête,
2. soit en queue.
I
addition
I
multiplication
I
exponentielle
I
test à zéro
29 / 37
Algorithmique et Programmation Fonctionnelle
Récursivité
Une première boucle
Soit ω = λx .xx
et Ω = ωω = (λx .xx )(λx .xx )
(λx .xx )(λx .xx ) →β (λx .xx )(λx .xx )
Donc Ω →β Ω →β . . .
Propriété
La β-réduction ne termine pas en général.
31 / 37
Algorithmique et Programmation Fonctionnelle
Récursivité
Notion de point fixe
Théorème
Tout λ-terme F a un point fixe x , x =β Fx
Définition
Un λ-terme Y tel que pour tout F , YF soit un point fixe de F est
un combinateur de point fixe.
I
Combinateur Y de Church (YF =β F (YF ) )
I
Combinateur Θ de Turing (ΘF →∗ F (ΘF ) )
32 / 37
Algorithmique et Programmation Fonctionnelle
Récursivité
Point fixe de Church Y
Comment trouver Y tel que YF =β F (YF ) ?
Indice : partir de (λx .xx )(λx .xx )
Y = λf .(λx .f (xx ))(λx .f (xx ))
33 / 37
Algorithmique et Programmation Fonctionnelle
Récursivité
Point fixe de Turing Θ
Comment trouver Θ tel que ΘF →∗ F (ΘF )
Θ = (λg.λh.h(ggh))(λg.λh.h(ggh))
34 / 37
Algorithmique et Programmation Fonctionnelle
Conclusion
Aujourd’hui
I
Lambda-calcul
36 / 37
Algorithmique et Programmation Fonctionnelle
Conclusion
Prochaine fois
I
Traits impératifs
I
Compléments
37 / 37
Téléchargement