Lambda-calcul simplement typé

Le lambda-calcul simplement typé est une variante du lambda-calcul qui se différencie de ce dernier par la présence de types. Il a été développé par Alonzo Church pour pallier l'incohérence du lambda-calcul non typé, due au paradoxe de Curry, et servir de fondements aux mathématiques.

Le lambda-calcul simplement typé partage un lien fort avec la logique propositionnelle minimale au travers de l'isomorphisme de Curry-Howard. Il peut également être vu comme une version simplifiée d'un langage de programmation fonctionnelle. De plus, toutes les fonctions définissables dans le lambda-calcul simplement typé terminent : le lambda-calcul est fortement normalisant.

Introduction

Pour un article plus général, voir Lambda-calcul.

Le lambda-calcul pose comme primitive la notion de fonction. Si M {\displaystyle M} est une expression, λ x . M {\displaystyle \lambda x.M} représente la fonction f {\displaystyle f} définie par l'équation f ( x ) = M {\displaystyle f(x)=M} , et si M {\displaystyle M} et N {\displaystyle N} sont deux expressions, M N {\displaystyle MN} désigne l'application de M {\displaystyle M} à N {\displaystyle N} . Enfin, le lambda-calcul possède une notion dite de réduction qui correspond à effectuer une étape de calcul.

Par analogie, λ x .2 x {\displaystyle \lambda x.2x} pourrait désigner la fonction qui renvoie le double de son argument, et ( λ x .2 x ) 3 2 3 6 {\displaystyle (\lambda x.2x)3\to 2\cdot 3\to 6} est la suite des étapes de calcul pour calculer cette fonction en 3 {\displaystyle 3} . On peut définir et utiliser des types de données dans le lambda-calcul, notamment les entier naturels, les paires ou les listes. Néanmoins, tous les calculs ne terminent pas : Ω = ( λ x . x x ) ( λ x . x x ) {\displaystyle \Omega =(\lambda x.xx)(\lambda x.xx)} présente la propriété que Ω Ω {\displaystyle \Omega \to \Omega } , et de plus, si F {\displaystyle F} est un terme, il existe un terme M {\displaystyle M} tel que F M M {\displaystyle FM\to ^{*}M} . Pour reprendre l'analogie précédente, pour F = λ x . x + 1 {\displaystyle F=\lambda x.x+1} , un tel M {\displaystyle M} vérifierait M = M + 1 {\displaystyle M=M+1} , ce qui est impossible pour un entier naturel. L'introduction d'une discipline de types permet de résoudre ces deux problèmes, au prix d'une expressivité moindre.

Syntaxe

Il y a deux objets principaux dans le lambda-calcul simplement typé : les types, qui correspondent à des types de donnée en informatique et à des propositions en logique, et les termes qui correspondent à des programmes ou à des démonstrations.

Types

On suppose donné un ensemble de variables de types, qu'on note par des lettres grecques α , β , {\displaystyle \alpha ,\beta ,\dots } Les types du lambda-calcul simplement typé sont désignés par les lettres T , U , {\displaystyle T,U,\dots } et sont formés par[1],[2] :

  • Les variables de types α , β , {\displaystyle \alpha ,\beta ,\ldots }  ;
  • Le type unité 1 {\displaystyle 1} , qui possède un unique élément ;
  • Si T {\displaystyle T} et U {\displaystyle U} sont des types, T U {\displaystyle T\to U} est le type des fonctions de T {\displaystyle T} vers U {\displaystyle U}  ;
  • Si T {\displaystyle T} et U {\displaystyle U} sont des types, T × U {\displaystyle T\times U} est le produit des types T {\displaystyle T} et U {\displaystyle U} , dont les éléments sont des paires composées d'un élément de T {\displaystyle T} et d'un de U {\displaystyle U} .

Plus simplement,

T , U , ::= α , β , | 1 | T U | T × U {\displaystyle T,U,\ldots ::=\alpha ,\beta ,\ldots \;|\;1\;|\;T\to U\;|\;T\times U} [note 1],[note 2]

Termes

Les variables seront notées par des lettres minuscules x , y , {\displaystyle x,y,\dots } tandis que les termes seront notés M , N , {\displaystyle M,N,\dots } Les termes sont formés ainsi[1],[2] :

  • Les variables x , y , {\displaystyle x,y,\ldots } sont des termes.
  • L'unique terme du type unité est {\displaystyle *} .
  • Si A {\displaystyle A} est un type et M {\displaystyle M} un terme, λ x A . M {\displaystyle \lambda x^{A}.M} est un terme qui représente la fonction qui à x {\displaystyle x} de type A {\displaystyle A} associe l'expression M {\displaystyle M} . On peut voir ça comme l'abstraction de x {\displaystyle x} dans l'expression M {\displaystyle M} .
  • Si M {\displaystyle M} et N {\displaystyle N} sont des termes, M N {\displaystyle MN} est un terme qui correspond à l'application de la fonction M {\displaystyle M} à l'expression N {\displaystyle N} .
  • Si M {\displaystyle M} et N {\displaystyle N} sont des termes, M , N {\displaystyle \langle M,N\rangle } est un terme représentant la paire dont la première composante est M {\displaystyle M} et la deuxième N {\displaystyle N} .
  • Si M {\displaystyle M} est un terme et i = 1   ou   2 {\displaystyle i=1~{\textrm {ou}}~2} , π i ( M ) {\displaystyle \pi _{i}(M)} est un terme qui désigne la i {\displaystyle i} -ème projection de la paire M {\displaystyle M} .

Plus simplement,

M , N , ::= x , y , | | λ x A . M | M N | M , N | π 1 ( M ) | π 2 ( M ) {\displaystyle M,N,\ldots ::=x,y,\ldots \;|\;*\;|\;\lambda x^{A}.M\;|\;MN\;|\;\langle M,N\rangle \;|\;\pi _{1}(M)\;|\;\pi _{2}(M)}

De plus, on considèrera que l'application est associative à gauche, c'est-à-dire qu'on notera M N O {\displaystyle MNO} pour ( M N ) O {\displaystyle (MN)O} .

Règles de typage

On introduit la notation Γ M : A {\displaystyle \Gamma \vdash M:A} [1], où Γ {\displaystyle \Gamma } est une liste de paires de la forme x : B {\displaystyle x:B} x {\displaystyle x} est une variable et B {\displaystyle B} un type, M {\displaystyle M} est un terme et A {\displaystyle A} un type. Elle se lit « dans le contexte Γ {\displaystyle \Gamma } , le terme M {\displaystyle M} a pour type A {\displaystyle A}  ». Par exemple, x : A λ y : B . x , y : B A × B {\displaystyle x:A\vdash \lambda y:B.\langle x,y\rangle :B\to A\times B} se lit « si x {\displaystyle x} est une variable de type A {\displaystyle A} , la fonction qui à y {\displaystyle y} de type B {\displaystyle B} associe la paire x , y {\displaystyle \langle x,y\rangle } est une fonction qui envoie les éléments de B {\displaystyle B} sur les paires de A {\displaystyle A} et de B {\displaystyle B}  ».

Une règle de la forme Γ 1 M 1 : A 1 Γ n M n : A n Γ M : A {\displaystyle {\frac {\Gamma _{1}\vdash M_{1}:A_{1}\dots \Gamma _{n}\vdash M_{n}:A_{n}}{\Gamma \vdash M:A}}} doit se comprendre comme « si Γ 1 M 1 : A 1 {\displaystyle \Gamma _{1}\vdash M_{1}:A_{1}} , ..., Γ n M n : A n {\displaystyle \Gamma _{n}\vdash M_{n}:A_{n}} alors Γ M : A {\displaystyle \Gamma \vdash M:A}  ». En particulier, Γ M : A {\displaystyle {\frac {}{\Gamma \vdash M:A}}} signifie que Γ M : A {\displaystyle \Gamma \vdash M:A} est toujours vrai.

( v a r ) Γ , x : A , Γ x : A {\displaystyle (var)\;{\frac {}{\Gamma ,x:A,\Gamma '\vdash x:A}}}
( a b s ) Γ , x : A M : B Γ λ x A . M : A B {\displaystyle (abs)\;{\frac {\Gamma ,x:A\vdash M:B}{\Gamma \vdash \lambda x^{A}.M:A\to B}}}
( a p p ) Γ M : A B Γ N : A Γ M N : B {\displaystyle (app)\;{\frac {\Gamma \vdash M:A\to B\quad \Gamma \vdash N:A}{\Gamma \vdash MN:B}}}
( p a i r ) Γ M : A Γ N : B Γ M , N : A × B {\displaystyle (pair)\;{\frac {\Gamma \vdash M:A\quad \Gamma \vdash N:B}{\Gamma \vdash \langle M,N\rangle :A\times B}}}
( π 1 ) Γ M : A × B Γ π 1 ( M ) : A {\displaystyle (\pi _{1})\;{\frac {\Gamma \vdash M:A\times B}{\Gamma \vdash \pi _{1}(M):A}}}
( π 2 ) Γ M : A × B Γ π 2 ( M ) : B {\displaystyle (\pi _{2})\;{\frac {\Gamma \vdash M:A\times B}{\Gamma \vdash \pi _{2}(M):B}}}
( ) Γ : 1 {\displaystyle (*)\;{\frac {}{\Gamma \vdash *:1}}}

Réduction

Tout comme le lambda-calcul non typé, le lambda-calcul simplement typé identifie les termes α {\displaystyle \alpha } -équivalents et définit la substitution de façon similaire. De même, on peut définir pour le lambda-calcul simplement typé une notion de réduction[3], qui représente une étape de calcul :

  • ( λ x . M ) N β M [ x := N ] {\displaystyle (\lambda x.M)N\to _{\beta }M[x:=N]}  ;
  • π 1 ( M , N ) β M {\displaystyle \pi _{1}(\langle M,N\rangle )\to _{\beta }M}  ;
  • π 2 ( M , N ) β N {\displaystyle \pi _{2}(\langle M,N\rangle )\to _{\beta }N}  ;
  • λ x . M x η M {\displaystyle \lambda x.Mx\to _{\eta }M} si x {\displaystyle x} n'est pas libre dans M {\displaystyle M}  ;
  • π 1 x , π 2 x η x {\displaystyle \langle \pi _{1}x,\pi _{2}x\rangle \to _{\eta }x}  ;
  • M η {\displaystyle M\to _{\eta }*} si M {\displaystyle M} est de type 1 {\displaystyle 1} .

Certaines règles sont étiquetées β {\displaystyle \beta } , elles correspondent à des règles de calcul. La réduction associée est nommée β {\displaystyle \beta } -réduction. D'autres sont étiquetées η {\displaystyle \eta } , elles correspondent à des simplifications : si M η N {\displaystyle M\to _{\eta }N} , M {\displaystyle M} et N {\displaystyle N} se « comportent » pareil. On nomme cette réduction η {\displaystyle \eta } -réduction. On note M β η N {\displaystyle M\to _{\beta \eta }N} si M β N {\displaystyle M\to _{\beta }N} ou M η N {\displaystyle M\to _{\eta }N}  : c'est la β η {\displaystyle \beta \eta } -réduction.

Enfin, si R {\displaystyle \to _{R}} est une réduction, R {\displaystyle \to _{R}^{*}} est sa clôture réflexive et transitive et = R {\displaystyle =_{R}} sa clôture réflexive, symétrique et transitive, c'est-à-dire que M R N {\displaystyle M\to _{R}^{*}N} s'il existe M 1 , , M n {\displaystyle M_{1},\ldots ,M_{n}} tels que M = M 1 R R M n = N {\displaystyle M=M_{1}\to _{R}\ldots \to _{R}M_{n}=N} et M = R N {\displaystyle M=_{R}N} s'il existe M 1 , , M n {\displaystyle M_{1},\ldots ,M_{n}} tels que M = M 1 {\displaystyle M=M_{1}} , M n = N {\displaystyle M_{n}=N} et pour tout i {\displaystyle i} entre 1 {\displaystyle 1} et n 1 {\displaystyle n-1} , M i R M i + 1 {\displaystyle M_{i}\to _{R}M_{i+1}} ou M i R M i + 1 {\displaystyle M_{i}\leftarrow _{R}M_{i+1}} .

Autoréduction

La β η {\displaystyle \beta \eta } -réduction possède la propriété d'autoréduction[3] (ou subject reduction) : si Γ M : T {\displaystyle \Gamma \vdash M:T} et M β η N {\displaystyle M\to _{\beta \eta }N} alors Γ N : T {\displaystyle \Gamma \vdash N:T} . On peut voir cela comme une propriété de préservation du typage par la réduction.

Normalisation forte

Un terme est dit en forme normale s'il ne peut pas se réduire d'avantage[4]. La β η {\displaystyle \beta \eta } -réduction possède la propriété de normalisation forte : tout terme peut se réduire, en un nombre fini d'étapes (potentiellement nul), en un terme en forme normale. On dit aussi qu'il est fortement normalisant. Si M R N {\displaystyle M\to _{R}^{*}N} et que N {\displaystyle N} est en forme normale pour R {\displaystyle \to _{R}} , on dit que N {\displaystyle N} est une forme normale de M {\displaystyle M} . Comme l’énonce le paragraphe suivant, cette forme est unique pour la β {\displaystyle \beta } -réduction.

Confluence

Une réduction est dite confluente si pour tout termes M {\displaystyle M} , N 1 {\displaystyle N_{1}} et N 2 {\displaystyle N_{2}} tels que M N 1 {\displaystyle M\to ^{*}N_{1}} et M N 2 {\displaystyle M\to ^{*}N_{2}} , il existe un terme O {\displaystyle O} tel que N 1 O {\displaystyle N_{1}\to ^{*}O} et N 2 O {\displaystyle N_{2}\to ^{*}O} . La β {\displaystyle \beta } -réduction est confluente[5], mais la β η {\displaystyle \beta \eta } -réduction ne l'est pas, comme le montre l'exemple suivant[5], où x : A × 1 {\displaystyle x:A\times 1}  :

  • π 1 x , π 2 x η π 1 x , {\displaystyle \langle \pi _{1}x,\pi _{2}x\rangle \to _{\eta }\langle \pi _{1}x,*\rangle }  ;
  • π 1 x , π 2 x η x {\displaystyle \langle \pi _{1}x,\pi _{2}x\rangle \to _{\eta }x}  ;
  • mais π 1 x , {\displaystyle \langle \pi _{1}x,*\rangle } et x {\displaystyle x} sont tous deux en forme normale, donc ils ne peuvent pas se réduire vers un terme commun.

Si on considère le lambda-calcul simplement typé sans le type unité, la β η {\displaystyle \beta \eta } -réduction est confluente[5].

La confluence assure l'unicité de la forme normale pour la β {\displaystyle \beta } -réduction : en effet, supposons M β N 1 {\displaystyle M\to _{\beta }^{*}N_{1}} et M β N 2 {\displaystyle M\to _{\beta }^{*}N_{2}} avec N 1 {\displaystyle N_{1}} et N 2 {\displaystyle N_{2}} en forme normale. Si N 1 β O {\displaystyle N_{1}\to _{\beta }^{*}O} alors N 1 = O {\displaystyle N_{1}=O} puisque N 1 {\displaystyle N_{1}} ne peut pas se réduire. De même, si N 2 β O {\displaystyle N_{2}\to _{\beta }^{*}O} alors N 2 = O {\displaystyle N_{2}=O} . Donc N 1 = N 2 {\displaystyle N_{1}=N_{2}} .

Cela signifie qu'en partant d'un terme donné, l'ordre des β {\displaystyle \beta } -réductions n'importe pas : quel que soit l'ordre de réduction choisi, en un nombre fini d'étapes, on atteindra une forme normale qui ne dépend pas de l'ordre des réductions. En revanche, l'ordre de réduction peut avoir une influence sur le nombre de réductions. Par exemple, si y : A , t : B ( λ x B . y ) ( ( λ z B . z ) t ) {\displaystyle y:A,t:B\vdash (\lambda x^{B}.y)((\lambda z^{B}.z)t)} , alors ( λ x B . y ) ( ( λ z B . z ) t ) y {\displaystyle (\lambda x^{B}.y)((\lambda z^{B}.z)t)\to y} atteint une forme normale en une étape en réduisant d'abord le premier rédex, tandis que ( λ x B . y ) ( ( λ z B . z ) t ) ( λ x B . y ) t y {\displaystyle (\lambda x^{B}.y)((\lambda z^{B}.z)t)\to (\lambda x^{B}.y)t\to y} atteint la même forme normale en deux étapes, en réduisant d'abord le deuxième rédex.

De plus, on peut choisir de faire les η {\displaystyle \eta } -réductions après les β {\displaystyle \beta } -réductions ou bien faire les β {\displaystyle \beta } -réductions après les η {\displaystyle \eta } -réductions : si M η N β O {\displaystyle M\to _{\eta }N\to _{\beta }O} , alors le β {\displaystyle \beta } -rédex réduit dans la deuxième réduction était déjà présent dans M {\displaystyle M} , et si M {\displaystyle M} est en β {\displaystyle \beta } -forme normale, il existe un terme N {\displaystyle N} (non nécessairement unique) en β η {\displaystyle \beta \eta } -forme normale tel que M η N {\displaystyle M\to _{\eta }^{*}N} [5].

Notes

  1. Certains auteurs[1] incluent aussi un ou plusieurs types de bases, dont on ne précise pas les éléments, tandis que d'autres[2] ne le font pas.
  2. Certains auteurs[1] considèrent le lambda-calcul simplement typé avec types produits et unité, tandis que d'autres[2] le restreignent aux types de fonctions.

Références

  1. a b c d et e Selinger 2013, p. 51-52
  2. a b c et d Rob Nederpelt et Herman Geuvers 2013, p. 34
  3. a et b Selinger 2013, p. 62
  4. Selinger 2013, p. 17
  5. a b c et d Selinger 2013, p. 63

Bibliographie

  • (en) Henk Barendregt, The Lambda Calculus : Its Syntax and Semantics, Amsterdam, North-Holland, coll. « Studies in Logic and the Foundations of Mathematics » (no 103), , 621 p. (ISBN 978-0-444-87508-2, lire en ligne), Appendice A.
  • Jean-Louis Krivine, Lambda-calcul : types et modèles, Masson, , 206 p. (ISBN 978-2-225-82091-5, lire en ligne), chapitre 3, section 2.
  • (en) Rob Nederpelt et Herman Geuvers, Type Theory and Formal Proof : An Introduction, Cambridge University Press, (ISBN 978-1-107-03650-5, DOI 10.1017/CBO9781139567725, lire en ligne). Ouvrage utilisé pour la rédaction de l'article
  • (en) Peter Selinger, Lecture Notes on the Lambda Calculus, , 2e éd. (1re éd. 2008), 120 p. (arXiv abs/0804.3434, lire en ligne). Ouvrage utilisé pour la rédaction de l'article

Articles connexes

  • icône décorative Portail de l'informatique théorique
  • icône décorative Portail de la logique