Lambda-calcul simplement typé

variante du lambda-calcul avec des types

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

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

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.

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]

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

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

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

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

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

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

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.

  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
  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

Bibliographie

modifier

Articles connexes

modifier