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 est une expression, représente la fonction définie par l'équation , et si et sont deux expressions, désigne l'application de à . Enfin, le lambda-calcul possède une notion dite de réduction qui correspond à effectuer une étape de calcul.
Par analogie, pourrait désigner la fonction qui renvoie le double de son argument, et est la suite des étapes de calcul pour calculer cette fonction en . 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 : présente la propriété que , et de plus, si est un terme, il existe un terme tel que . Pour reprendre l'analogie précédente, pour , un tel vérifierait , 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 Les types du lambda-calcul simplement typé sont désignés par les lettres et sont formés par[1],[2] :
- Les variables de types ;
- Le type unité , qui possède un unique élément ;
- Si et sont des types, est le type des fonctions de vers ;
- Si et sont des types, est le produit des types et , dont les éléments sont des paires composées d'un élément de et d'un de .
Plus simplement,
Termes
Les variables seront notées par des lettres minuscules tandis que les termes seront notés Les termes sont formés ainsi[1],[2] :
- Les variables sont des termes.
- L'unique terme du type unité est .
- Si est un type et un terme, est un terme qui représente la fonction qui à de type associe l'expression . On peut voir ça comme l'abstraction de dans l'expression .
- Si et sont des termes, est un terme qui correspond à l'application de la fonction à l'expression .
- Si et sont des termes, est un terme représentant la paire dont la première composante est et la deuxième .
- Si est un terme et , est un terme qui désigne la -ème projection de la paire .
Plus simplement,
De plus, on considèrera que l'application est associative à gauche, c'est-à-dire qu'on notera pour .
Règles de typage
On introduit la notation [1], où est une liste de paires de la forme où est une variable et un type, est un terme et un type. Elle se lit « dans le contexte , le terme a pour type ». Par exemple, se lit « si est une variable de type , la fonction qui à de type associe la paire est une fonction qui envoie les éléments de sur les paires de et de ».
Une règle de la forme doit se comprendre comme « si , ..., alors ». En particulier, signifie que est toujours vrai.
Réduction
Tout comme le lambda-calcul non typé, le lambda-calcul simplement typé identifie les termes -é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 :
- ;
- ;
- ;
- si n'est pas libre dans ;
- ;
- si est de type .
Certaines règles sont étiquetées , elles correspondent à des règles de calcul. La réduction associée est nommée -réduction. D'autres sont étiquetées , elles correspondent à des simplifications : si , et se « comportent » pareil. On nomme cette réduction -réduction. On note si ou : c'est la -réduction.
Enfin, si est une réduction, est sa clôture réflexive et transitive et sa clôture réflexive, symétrique et transitive, c'est-à-dire que s'il existe tels que et s'il existe tels que , et pour tout entre et , ou .
Autoréduction
La -réduction possède la propriété d'autoréduction[3] (ou subject reduction) : si et alors . 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 -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 et que est en forme normale pour , on dit que est une forme normale de . Comme l’énonce le paragraphe suivant, cette forme est unique pour la -réduction.
Confluence
Une réduction est dite confluente si pour tout termes , et tels que et , il existe un terme tel que et . La -réduction est confluente[5], mais la -réduction ne l'est pas, comme le montre l'exemple suivant[5], où :
- ;
- ;
- mais et 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 -réduction est confluente[5].
La confluence assure l'unicité de la forme normale pour la -réduction : en effet, supposons et avec et en forme normale. Si alors puisque ne peut pas se réduire. De même, si alors . Donc .
Cela signifie qu'en partant d'un terme donné, l'ordre des -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 , alors atteint une forme normale en une étape en réduisant d'abord le premier rédex, tandis que 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 -réductions après les -réductions ou bien faire les -réductions après les -réductions : si , alors le -rédex réduit dans la deuxième réduction était déjà présent dans , et si est en -forme normale, il existe un terme (non nécessairement unique) en -forme normale tel que [5].
Notes
- ↑ 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.
- ↑ 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
- ↑ a b c d et e Selinger 2013, p. 51-52
- ↑ a b c et d Rob Nederpelt et Herman Geuvers 2013, p. 34
- ↑ a et b Selinger 2013, p. 62
- ↑ Selinger 2013, p. 17
- ↑ 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).
- (en) Peter Selinger, Lecture Notes on the Lambda Calculus, , 2e éd. (1re éd. 2008), 120 p. (arXiv abs/0804.3434, lire en ligne).
Articles connexes
Portail de l'informatique théorique
Portail de la logique