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.
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 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 .
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.
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 :
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 .
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.
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.
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].
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 où 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.
↑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.