Aller au contenu

Lambda-calcul simplement typé

Un article de Wikipédia, l'encyclopédie libre.

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[modifier | modifier le code]

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[modifier | modifier le code]

Il y a deux sorte d'objets 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[modifier | modifier le code]

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,

[note 1],[note 2]

Termes[modifier | modifier le code]

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[modifier | modifier le code]

On introduit la notation [1], où est une liste de paires de la forme 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[modifier | modifier le code]

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[modifier | modifier le code]

La -réduction possède la propriété d'autoréduction[3] (en anglais : subject reduction) : si et alors . On peut voir cela comme une propriété de préservation du typage par la réduction.

Normalisation forte[modifier | modifier le code]

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[5], c'est-à-dire que tous les termes sont fortement normalisables : il n'y a pas de suite infinie de réductions Ainsi tout terme peut, en un nombre fini (potentiellement nul) d'étapes, être réduit en une forme normale. On dit aussi que la réduction est fortement normalisante. 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[modifier | modifier le code]

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[6], mais la -réduction ne l'est pas, comme le montre l'exemple suivant[6], 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[6].

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 [6].

Types sommes[modifier | modifier le code]

On peut également introduire dans le lambda-calcul simplement typé des types représentant respectivement la proposition toujours fausse ou le type vide, ainsi que la disjonction de deux propositions ou la somme de deux types[7],[8]. Pour cela, on ajoute à la syntaxe le type , et si et sont deux types, aussi. Le type peut être vu comme des couples avec dans ou dans et une étiquette indiquant la provenance de  : ou .

De plus, on ajoute à la syntaxe les termes suivants :

  • Si est un type et un terme, est un terme, qui sera de type . En effet, si possède un élément, tous les autres types aussi.
  • Si et sont des types, et un terme, et sont des termes correspondant aux injections respectives de et dans .
  • Si et sont des types, , et des termes, alors est un terme qui correspond à un filtrage par motif.

Ces nouveaux termes se typent comme suit :

On peut également ajouter des règles de réduction[8], mais il faut ajouter un nouveau type de règles : les conversions commutatives, notées . Elles permettent d'identifier deux termes qui devraient désigner la même preuve, mais sont différents.

Les deux règles correspondent au calcul du filtrage : si provient de , on renvoie est remplacé par , et on fait de même avec et si provient de  :

  •  ;
  • .

Les cinq règles suivantes correspondent aux conversions commutatives pour  :

  •  ;
  •  ;
  •  ;
  •  ;
  • Si et sont de type , .

Ces cinq règles correspondent aux conversions commutatives pour la somme :

  • ;
  • ;
  •  ;
  •  ;
  • .

Enfin, on peut aussi définir des règles  : la première règle correspond à , la deuxième à la somme.

  •  ;
  • .

Les réductions et préservent le typage et sont fortement normalisantes. De plus, est confluente.

Correspondance de Curry-Howard[modifier | modifier le code]

Les règles de typage du lambda-calcul simplement typé correspondent, une pour une, aux règles d'introductions et d'éliminations de la déduction naturelle pour la logique intuitionniste[9],[10],[11]. Cela permet d'établir une correspondance formelle entre preuves et programmes. Par exemple, les règles de l'implication en déduction naturelle sont :

signifie que l'on « charge » l'hypothèse , c'est-à-dire qu'on a le droit de l'utiliser comme hypothèse uniquement au-dessus de la barre.

C'est encore plus flagrant si l'on considère la présentation de la déduction naturelle avec des séquents, qui correspond exactement aux règles du lambda-calcul dans lesquelles on a enlevé les termes et les variables pour ne garder que les types.

En déduction naturelle, il existe une notion de simplification des preuves, appelée élimination des coupures. Une coupure correspond à une règle d'introduction immédiatement suivie de la règle d'élimination correspondante. La procédure d'élimination des coupures correspond exactement à la relation , permettant de faire le lien entre un calcul et une simplification de preuves. Ainsi, les résultats précédents — comme la confluence, la préservation du typage et la normalisation forte — sont aussi valides pour la déduction naturelle.

Par exemple, si est de type et de type , la règle du lambda-calcul simplement typé correspond exactement, dans la déduction naturelle, à la règle :

Notes[modifier | modifier le code]

  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[modifier | modifier le code]

  1. a b c d et e Selinger 2013, p. 46-47
  2. a b c et d Nederpelt et Geuvers 2014, p. 34
  3. a et b Selinger 2013, p. 57
  4. Selinger 2013, p. 12
  5. Selinger 2013, p. 67
  6. a b c et d Selinger 2013, p. 58
  7. Selinger 2013, p. 61-63
  8. a et b Girard et al. 1989, p. 79-80
  9. Girard et al. 1989, p. 19-21
  10. Girard et al. 1989, p. 74
  11. Girard et al. 1989, p. 77-78

Bibliographie[modifier | modifier le code]

Articles connexes[modifier | modifier le code]