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[1]. 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 simplement typé 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 sortes 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. On notera λ {\displaystyle \lambda ^{\to }} ce système.

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[2],[3] :

  • les variables de types α , β , {\displaystyle \alpha ,\beta ,\ldots }  ;
  • 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} .

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[2],[3] :

  • Les variables x , y , {\displaystyle x,y,\ldots } sont des termes ;
  • 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} .

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} [2], 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, f : A B λ y : A . f x : A B {\displaystyle f:A\to B\vdash \lambda y:A.fx:A\to B} se lit « si f {\displaystyle f} est une variable de type A B {\displaystyle A\to B} , la fonction qui à x {\displaystyle x} de type A {\displaystyle A} associe la valeur f x {\displaystyle fx} est une fonction qui envoie les éléments de A {\displaystyle A} dans 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}}}

Le lambda-calcul présenté ici correspond, sous la correspondance de Curry-Howard, à la logique minimale.

Typage à la Church et typage à la Curry

La présentation ici donnée correspond au typage à la Church[4], ou typage explicite, c'est-à-dire qu'un terme donné a au plus un seul type. Il existe une autre façon de présenter le lambda-calcul simplement typé, c'est le typage à la Curry[4], ou typage implicite. Les règles de typage restent les mêmes, mais les termes sont ceux du lambda-calcul pur : notamment, l'abstraction se note λ x . M {\displaystyle \lambda x.M} . Par exemple, avec un typage à la Church, λ x A . x {\displaystyle \lambda x^{A}.x} a pour type A A {\displaystyle A\to A} , tandis qu'avec un typage à la Curry, λ x . x {\displaystyle \lambda x.x} a tous les types de la forme T T {\displaystyle T\to T} . L'opération qui consiste à trouver le type le plus général qui convient pour un lambda-terme donné, si un tel type existe, s'appelle l'inférence de types[5].

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[6], qui correspond à une opération de réécriture représentant une étape de calcul :

  • ( λ x . M ) N β M [ x := N ] {\displaystyle (\lambda x.M)N\to _{\beta }M[x:=N]}  ;
  • λ x . M x η M {\displaystyle \lambda x.Mx\to _{\eta }M} si x {\displaystyle x} n'est pas libre dans M {\displaystyle M}  ;

Une des règles est étiquetée β {\displaystyle \beta } , elle correspond à une règle de calcul. La réduction associée est nommée β {\displaystyle \beta } -réduction. L'autre est étiquetée η {\displaystyle \eta } , elle correspond à une 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}} .

Préservation du typage

La β η {\displaystyle \beta \eta } -réduction possède la propriété de préservation du typage[6] (en anglais : 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} .

Normalisation forte

Un terme est dit en forme normale s'il ne peut pas se réduire d'avantage[7]. La β η {\displaystyle \beta \eta } -réduction possède la propriété de normalisation forte[8], c'est-à-dire que tous les termes sont fortement normalisables : il n'y a pas de suite infinie de réductions M 0 M 1 {\displaystyle M_{0}\to M_{1}\to \dots } 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 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 R {\displaystyle R} -forme normale de M {\displaystyle M} . Comme l’énonce le paragraphe suivant, cette forme est unique pour la β η {\displaystyle \beta \eta } -réduction et la β {\displaystyle \beta } -réduction.

Confluence

Une réduction est dite confluente si pour tous 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 \eta } -réduction et la β {\displaystyle \beta } -réduction sont confluentes[9].

La confluence assure l'unicité de la forme normale pour la réduction : en effet, supposons M N 1 {\displaystyle M\to ^{*}N_{1}} et M N 2 {\displaystyle M\to ^{*}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 ^{*}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 ^{*}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} [9].

Types produits

On peut étendre la présentation précédente du lambda-calcul avec un typé unité et des produits de types[2], on le note alors λ , × , 1 {\displaystyle \lambda ^{\to ,\times ,1}} . On ajoute alors aux types un type unité 1 {\displaystyle 1} , qui possède un unique élément, et T {\displaystyle T} et U {\displaystyle U} sont des types, on ajoute le type T × U {\displaystyle T\times U} qui représente 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} .

De plus, on étend la syntaxe des termes :

  • L'unique terme du type unité, se note {\displaystyle *}  ;
  • Si M {\displaystyle M} et N {\displaystyle N} sont des termes, le terme M , N {\displaystyle \langle M,N\rangle } , représente 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} , la i {\displaystyle i} -ème projection de la paire M {\displaystyle M} se note π i ( M ) {\displaystyle \pi _{i}(M)} .

Les règles de typages correspondantes sont[2] :

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

On peut également ajouter des règles de calcul sur les produits[6], à savoir :

  • π 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} .

Il est aussi possible d'ajouter des règles η {\displaystyle \eta } à ce lambda-calcul[6] :

  • π 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} .

Mais celles-ci ne se comportent pas aussi bien que dans le cas sans type unité. En effet, si la β {\displaystyle \beta } -réduction reste confluente[9], la β η {\displaystyle \beta \eta } -réduction ne l'est plus, comme le montre l'exemple suivant[9], 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.

En revanche toutes ces réductions continuent à préserver le typage[6] et à être fortement normalisantes[8].

Types sommes

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[10],[11]. Pour cela, on ajoute à la syntaxe le type 0 {\displaystyle 0} , et si T {\displaystyle T} et U {\displaystyle U} sont deux types, T + U {\displaystyle T+U} aussi. Le type T + U {\displaystyle T+U} peut être vu comme des couples ( e , M ) {\displaystyle (e,M)} avec M {\displaystyle M} dans T {\displaystyle T} ou dans U {\displaystyle U} et e {\displaystyle e} une étiquette indiquant la provenance de M {\displaystyle M}  : T {\displaystyle T} ou U {\displaystyle U} . Ce système se note λ , × , 1 , + , 0 {\displaystyle \lambda ^{\to ,\times ,1,+,0}} .

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

  • Si T {\displaystyle T} est un type et M {\displaystyle M} un terme, T M {\displaystyle \square _{T}M} est un terme, qui sera de type T {\displaystyle T} . En effet, si 0 {\displaystyle 0} possède un élément, tous les autres types aussi.
  • Si T {\displaystyle T} et U {\displaystyle U} sont des types, et M {\displaystyle M} un terme, inl T , U M {\displaystyle \operatorname {inl} _{T,U}M} et inr T , U M {\displaystyle \operatorname {inr} _{T,U}M} sont des termes correspondant aux injections respectives de T {\displaystyle T} et U {\displaystyle U} dans T + U {\displaystyle T+U} .
  • Si T {\displaystyle T} et U {\displaystyle U} sont des types, M {\displaystyle M} , N {\displaystyle N} et O {\displaystyle O} des termes, alors case M of x T N y U O {\displaystyle \operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O} est un terme qui correspond à un filtrage par motif.

Ces nouveaux termes se typent comme suit :

( inl ) Γ M : T Γ inl T , U M : T + U {\displaystyle (\operatorname {inl} )\;{\frac {\Gamma \vdash M:T}{\Gamma \vdash \operatorname {inl} _{T,U}M:T+U}}}
( inr ) Γ M : U Γ inr T , U M : T + U {\displaystyle (\operatorname {inr} )\;{\frac {\Gamma \vdash M:U}{\Gamma \vdash \operatorname {inr} _{T,U}M:T+U}}}
( case ) Γ M : T + U Γ , x : T N : V Γ , y : U O : V Γ case M of x T N y U O : V {\displaystyle (\operatorname {case} )\;{\frac {\Gamma \vdash M:T+U\quad \Gamma ,x:T\vdash N:V\quad \Gamma ,y:U\vdash O:V}{\Gamma \vdash \operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O:V}}}
( ) Γ M : 0 Γ T M : T {\displaystyle (\square )\;{\frac {\Gamma \vdash M:0}{\Gamma \vdash \square _{T}M:T}}}

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

Les deux règles β {\displaystyle \beta } correspondent au calcul du filtrage : si M {\displaystyle M} provient de T {\displaystyle T} , on renvoie N {\displaystyle N} x {\displaystyle x} est remplacé par M {\displaystyle M} , et on fait de même avec O {\displaystyle O} et y {\displaystyle y} si M {\displaystyle M} provient de U {\displaystyle U}  :

  • case inl T , U M of x T N y U O β N [ x := M ] {\displaystyle \operatorname {case} \operatorname {inl} _{T,U}M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O\to _{\beta }N[x:=M]}  ;
  • case inr T , U M of x T N y U O β O [ y := M ] {\displaystyle \operatorname {case} \operatorname {inr} _{T,U}M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O\to _{\beta }O[y:=M]} .

Les cinq règles suivantes c c {\displaystyle cc} correspondent aux conversions commutatives pour 0 {\displaystyle 0}  :

  • π 1 ( T × U M ) c c T M {\displaystyle \pi _{1}(\square _{T\times U}M)\to _{cc}\square _{T}M}  ;
  • π 2 ( T × U M ) c c U M {\displaystyle \pi _{2}(\square _{T\times U}M)\to _{cc}\square _{U}M}  ;
  • ( T U M ) N c c U M {\displaystyle (\square _{T\to U}M)N\to _{cc}\square _{U}M}  ;
  • T ( 0 M ) c c T M {\displaystyle \square _{T}(\square _{0}M)\to _{cc}\square _{T}M}  ;
  • Si N {\displaystyle N} et O {\displaystyle O} sont de type V {\displaystyle V} , case T + U M of x T N y U O c c V M {\displaystyle \operatorname {case} \square _{T+U}M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O\to _{cc}\square _{V}M} .

Ces cinq règles c c {\displaystyle cc} correspondent aux conversions commutatives pour la somme :

  • π 1 ( case M of x T N y U O ) c c case M of x T π 1 ( N ) y U π 1 ( O ) {\displaystyle \pi _{1}(\operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O)\to _{cc}\operatorname {case} M\operatorname {of} x^{T}\Rightarrow \pi _{1}(N)\mid y^{U}\Rightarrow \pi _{1}(O)} ;
  • π 2 ( case M of x T N y U O ) c c case M of x T π 2 ( N ) y U π 2 ( O ) {\displaystyle \pi _{2}(\operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O)\to _{cc}\operatorname {case} M\operatorname {of} x^{T}\Rightarrow \pi _{2}(N)\mid y^{U}\Rightarrow \pi _{2}(O)} ;
  • ( case M of x T N y U O ) P c c case M of x T N P y U O P {\displaystyle (\operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O)P\to _{cc}\operatorname {case} M\operatorname {of} x^{T}\Rightarrow NP\mid y^{U}\Rightarrow OP}  ;
  • W ( case M of x T N y U O ) c c case M of x T W N y U W O {\displaystyle \square _{W}(\operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O)\to _{cc}\operatorname {case} M\operatorname {of} x^{T}\Rightarrow \square _{W}N\mid y^{U}\Rightarrow \square _{W}O}  ;
  • case ( case M of x T N y U O ) of x T N y U O c c case M of x T ( case N of x T N y U O ) y U ( case O of x T N y U O ) {\displaystyle {\begin{array}{l}\operatorname {case} (\operatorname {case} M\operatorname {of} x^{T}\Rightarrow N\mid y^{U}\Rightarrow O)\\\operatorname {of} x'^{T}\Rightarrow N'\mid y'^{U}\Rightarrow O'\\\end{array}}\to _{cc}{\begin{array}{l}\operatorname {case} M\operatorname {of} \\\quad x^{T}\Rightarrow (\operatorname {case} N\operatorname {of} x'^{T}\Rightarrow N'\mid y'^{U}\Rightarrow O')\\\quad y^{U}\Rightarrow (\operatorname {case} O\operatorname {of} x'^{T}\Rightarrow N'\mid y'^{U}\Rightarrow O')\\\end{array}}} .

Enfin, on peut aussi définir des règles η {\displaystyle \eta }  : la première règle η {\displaystyle \eta } correspond à 0 {\displaystyle 0} , la deuxième à la somme.

  • 0 M η M {\displaystyle \square _{0}M\to _{\eta }M}  ;
  • case M of x T inl T , U x y U inr T , U η M {\displaystyle \operatorname {case} M\operatorname {of} x^{T}\Rightarrow \operatorname {inl} _{T,U}x\mid y^{U}\Rightarrow \operatorname {inr} _{T,U}\to _{\eta }M} .

Les réductions β c c {\displaystyle \to _{\beta cc}} et β c c η {\displaystyle \to _{\beta cc\eta }} préservent le typage et sont fortement normalisantes. De plus, β c c {\displaystyle \to _{\beta cc}} est confluente.

Correspondance de Curry-Howard

Pour un article plus général, voir Correspondance de Curry-Howard.

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

( I ) [ A ] B A B {\displaystyle (I_{\to })\;{\frac {\begin{array}{c}[A]\\\vdots \\B\\\end{array}}{A\to B}}}
( E ) A B A B {\displaystyle (E_{\to })\;{\frac {A\to B\quad A}{B}}}

[ A ] {\displaystyle [A]} signifie que l'on « charge » l'hypothèse A {\displaystyle A} , 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.

( I ) Γ , A B Γ A B {\displaystyle (I_{\to })\;{\frac {\Gamma ,A\vdash B}{\Gamma \vdash A\to B}}}
( E ) Γ A B Γ A Γ B {\displaystyle (E_{\to })\;{\frac {\Gamma \vdash A\to B\quad \Gamma \vdash A}{\Gamma \vdash B}}}

En déduction naturelle, il existe une notion de simplification des preuves, appelée élimination des coupures[15],[16],[17]. 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 β c c {\displaystyle \to _{\beta cc}} [18], 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[18],[19].

Par exemple, si t {\displaystyle t} est de type A {\displaystyle A} et u {\displaystyle u} de type B {\displaystyle B} , la règle π 1 ( t , u ) t {\displaystyle \pi _{1}(\langle t,u\rangle )\to t} du lambda-calcul simplement typé correspond exactement, dans la déduction naturelle, à la règle :

A B A B A A {\displaystyle {\begin{array}{c}\vdots \quad \vdots \\A\quad B\\\hline A\land B\\\hline A\end{array}}\to {\begin{array}{c}\vdots \\A\end{array}}}

Sémantique

On peut définir différentes sémantiques pour le lambda-calcul simplement typé, qui permettent à la fois d'étudier le lambda-calcul en tant que tel, ou d'étudier d'autres objets en utilisant le lambda-calcul simplement typé.

Catégorie cartésienne fermée

On peut interpréter un jugement de typage du lambda-calcul simplement typé avec les produits λ , × , 1 {\displaystyle \lambda ^{\to ,\times ,1}} dans une catégorie cartésienne fermée[20]. Une catégorie cartésienne fermée est une catégorie qui possède un objet terminal, des produits et des objets exponentiels, qui représentent l'ensemble des morphismes d'un objet vers un autre. Cette correspondance entre lambda-calcul typé, déduction naturelle et catégorie cartésienne fermée est parfois connue sous le nom de correspondance de Curry-Howard-Lambek.

Plus généralement, Joachim Lambek et Dana Scott ont mis en évidence[21],[22] l'équivalence entre lambda-théories typées, c'est-à-dire les extensions de λ , × , 1 {\displaystyle \lambda ^{\to ,\times ,1}} avec éventuellement des constantes et des règles supplémentaires étendant = β η {\displaystyle =_{\beta \eta }} , et catégories cartésiennes fermées.

Si ρ {\displaystyle \rho } assigne à chaque variable de type un objet d'une catégorie C {\displaystyle {\mathcal {C}}} , on peut définir une sémantique [ [ ] ] {\displaystyle [\![\;]\!]} [20] qui associe à un séquent Γ M : A {\displaystyle \Gamma \vdash M:A} un morphisme [ [ Γ M : A ] ] : [ [ Γ ] ] [ [ A ] ] {\displaystyle [\![\Gamma \vdash M:A]\!]:[\![\Gamma ]\!]\to [\![A]\!]}  : l'interprétation des types envoie le type unité 1 {\displaystyle 1} sur l'objet terminal 1 {\displaystyle 1} , le produit de deux types T × U {\displaystyle T\times U} sur le produit catégorique des interprétations de chaque type [ [ T ] ] × [ [ U ] ] {\displaystyle [\![T]\!]\times [\![U]\!]} et le type T U {\displaystyle T\to U} est envoyé sur [ [ [ T ] ] , [ [ U ] ] ] {\displaystyle [[\![T]\!],[\![U]\!]]} , où [ A , B ] {\displaystyle [A,B]} désigne l'objet représentant les morphismes de A {\displaystyle A} vers B {\displaystyle B} dans la catégorie C {\displaystyle {\mathcal {C}}} . On peut étendre cette définition à un contexte : si Γ = x 1 : A 1 , , x n : A n {\displaystyle \Gamma =x_{1}:A_{1},\dots ,x_{n}:A_{n}} , [ [ Γ ] ] = [ [ A 1 ] ] × [ [ A n ] ] {\displaystyle [\![\Gamma ]\!]=[\![A_{1}]\!]\times \dots [\![A_{n}]\!]} . Pour les termes,

  • Si x {\displaystyle x} est une variable et Γ = Γ , x : A , Γ {\displaystyle \Gamma =\Gamma ',x:A,\Gamma ''} , [ [ Γ x : A ] ] = π A {\displaystyle [\![\Gamma \vdash x:A]\!]=\pi _{A}} est la projection de [ [ Γ ] ] {\displaystyle [\![\Gamma ]\!]} sur la composante représentée par x {\displaystyle x}  ;
  • Γ : 1 {\displaystyle \Gamma \vdash *:1} est envoyé sur l'unique morphisme de [ [ Γ ] ] {\displaystyle [\![\Gamma ]\!]} vers 1 {\displaystyle 1}  ;
  • Γ M , N : A × B {\displaystyle \Gamma \vdash \langle M,N\rangle :A\times B} est envoyé sur [ [ Γ M : A ] ] , [ [ Γ N : B ] ] {\displaystyle \langle [\![\Gamma \vdash M:A]\!],[\![\Gamma \vdash N:B]\!]\rangle } , qui désigne l'unique morphisme de Γ {\displaystyle \Gamma } vers [ [ A ] ] × [ [ B ] ] {\displaystyle [\![A]\!]\times [\![B]\!]} induit par [ [ Γ M : A ] ] {\displaystyle [\![\Gamma \vdash M:A]\!]} et [ [ Γ N : B ] ] {\displaystyle [\![\Gamma \vdash N:B]\!]}  ;
  • Γ π i ( M ) {\displaystyle \Gamma \vdash \pi _{i}(M)} est envoyé sur π i [ [ Γ M : A × B ] ] {\displaystyle \pi _{i}\circ [\![\Gamma \vdash M:A\times B]\!]} , qui désigne la i {\displaystyle i} -ème projection du morphisme [ [ Γ M : A × B ] ] {\displaystyle [\![\Gamma \vdash M:A\times B]\!]}  ;
  • Γ λ x A . M : A B {\displaystyle \Gamma \vdash \lambda x^{A}.M:A\to B} doit-être envoyé sur un morphisme [ [ Γ ] ] [ [ [ A ] ] , [ [ B ] ] ] {\displaystyle [\![\Gamma ]\!]\to [[\![A]\!],[\![B]\!]]} . Or [ [ Γ , x : A M : B ] ] {\displaystyle [\![\Gamma ,x:A\vdash M:B]\!]} est un morphisme [ [ Γ ] ] × [ [ A ] ] [ [ B ] ] {\displaystyle [\![\Gamma ]\!]\times [\![A]\!]\to [\![B]\!]} et dans une catégorie cartésienne fermée, pour tout morphisme f : X × Y Z {\displaystyle f:X\times Y\to Z} , il existe un unique morphisme f : X [ Y , Z ] {\displaystyle f^{*}:X\to [Y,Z]} représentant sa version curryfiée. On définit donc [ [ Γ λ x A . M : A B ] ] = [ [ Γ , x : A M : B ] ] {\displaystyle [\![\Gamma \vdash \lambda x^{A}.M:A\to B]\!]=[\![\Gamma ,x:A\vdash M:B]\!]^{*}} .
  • Pour déterminer Γ M N : B {\displaystyle \Gamma \vdash MN:B} , on remarque que [ [ Γ M : A B ] ] {\displaystyle [\![\Gamma \vdash M:A\to B]\!]} est un morphisme [ [ Γ ] ] [ [ [ A ] ] , [ [ B ] ] ] {\displaystyle [\![\Gamma ]\!]\to [[\![A]\!],[\![B]\!]]} , et [ [ Γ N : A ] ] {\displaystyle [\![\Gamma \vdash N:A]\!]} est un morphisme [ [ Γ ] ] [ [ A ] ] {\displaystyle [\![\Gamma ]\!]\to [\![A]\!]} . Or dans une catégorie cartésienne fermée, pour toute paire d'objets X {\displaystyle X} et Y {\displaystyle Y} il existe un morphisme d'évaluation ε : [ X , Y ] × X Y {\displaystyle \varepsilon :[X,Y]\times X\to Y} , qui est la counité de l'adjonction entre les foncteurs × X {\displaystyle \bullet \times X} et X {\displaystyle X\to \bullet } . On définit donc [ [ Γ M N : B ] ] = ε [ [ Γ M : A B ] ] , [ [ Γ N : A ] ] {\displaystyle [\![\Gamma \vdash MN:B]\!]=\varepsilon \circ \langle [\![\Gamma \vdash M:A\to B]\!],[\![\Gamma \vdash N:A]\!]\rangle } .

Cette sémantique est correcte[20] vis-à-vis de = β η {\displaystyle =_{\beta \eta }} , c'est-à-dire que si M = β η N {\displaystyle M=_{\beta \eta }N} alors [ [ M ] ] = [ [ N ] ] {\displaystyle [\![M]\!]=[\![N]\!]} . De plus, elle est également complète[20], c'est-à-dire que si [ [ M ] ] = [ [ N ] ] {\displaystyle [\![M]\!]=[\![N]\!]} pour toute interprétation alors M = β η N {\displaystyle M=_{\beta \eta }N} .

Dans cette sémantique, la substitution correspond à la composition[23] : si Γ , x : A M : B {\displaystyle \Gamma ,x:A\vdash M:B} et Γ N : A {\displaystyle \Gamma \vdash N:A} ,

[ [ Γ M [ x := N ] : B ] ] = [ [ Γ , x : A M ] ] i d Γ , [ [ Γ N : A ] ] : [ [ Γ ] ] [ [ B ] ] . {\displaystyle [\![\Gamma \vdash M[x:=N]:B]\!]=[\![\Gamma ,x:A\vdash M]\!]\circ \langle id_{\Gamma },[\![\Gamma \vdash N:A]\!]\rangle :[\![\Gamma ]\!]\to [\![B]\!].}

Ensembles

Les ensembles et les fonctions entre eux forment une catégorie cartésienne close, où l'objet terminal 1 {\displaystyle 1} est le singleton (il y n'en a qu'un seul à unique isomorphisme près), le produit A × B {\displaystyle A\times B} est le produit cartésien de A {\displaystyle A} et B {\displaystyle B} et l'objet exponentiel [ A , B ] {\displaystyle [A,B]} est l'ensemble des fonctions de A {\displaystyle A} dans B {\displaystyle B} . Harvey Friedman a montré que si ρ {\displaystyle \rho } n'a pour valeurs que des ensembles infinis, la sémantique induite par ρ {\displaystyle \rho } est complète[24],[25].

Domaines

La théorie des domaines fournit un certain nombre de catégories cartésiennes fermées, comme celles des dcpo et ω {\displaystyle \omega } -cpo, ainsi que leurs versions pointées[26]. Cette théorie a notamment permis à Dana Scott de construire un modèle non-trivial D {\displaystyle D_{\infty }} [27],[28] vérifiant D = D D {\displaystyle D_{\infty }=D_{\infty }\to D_{\infty }} , modèle qui peut servir à interpréter le lambda-calcul non typé[29].

Espace cohérents

Les espaces cohérents (en) forment également une catégorie cartésienne fermée. Ils ont été introduit par Jean-Yves Girard[30],[31] et c'est la découverte que le type des fonctions usuelles T U {\displaystyle T\to U} pouvait s'écrire ( ! T ) U {\displaystyle (!T)\multimap U} , où {\displaystyle \multimap } désigne l'implication linéaire et ! {\displaystyle !} une opération de copie, qui lui a inspiré la logique linéaire.

Extensions

Logique classique

Tout comme la logique intuitionniste, le lambda-calcul simplement typé ne démontre pas le tiers exclus P ¬ P {\displaystyle P\lor \neg P} , pas plus que l'élimination de la double négation ¬ ¬ P P {\displaystyle \neg \neg P\to P} ou la loi de Pierce ( ( P Q ) P ) P {\displaystyle ((P\to Q)\to P)\to P} . Il existe plusieurs façons d'étendre le lambda-calcul pour obtenir un système équivalent à la logique classique[32] par la correspondance de Curry-Howard.

Une première méthode est celle de Timothy G. Griffith[33], qui consiste à ajouter une version typée de l'opérateur C {\displaystyle {\mathcal {C}}} de Matthias Felleisen[34] : si M {\displaystyle M} est de type ¬ ¬ T {\displaystyle \neg \neg T} , où ¬ U {\displaystyle \neg U} est défini comme U {\displaystyle U\to \bot } , C M {\displaystyle {\mathcal {C}}M} est de type T {\displaystyle T} . Cet opérateur peut aussi être munie de règles de réduction[35] : C ( u v ) C ( λ k . u ( λ f . k ( f v ) ) {\displaystyle {\mathcal {C}}(uv)\to {\mathcal {C}}(\lambda k.u(\lambda f.k(fv))} et C ( λ k . k M ) M {\displaystyle {\mathcal {C}}(\lambda k.kM)\to M} si k {\displaystyle k} n'est pas libre dans M {\displaystyle M} . La variable k {\displaystyle k} désigne ici une continuation, et C {\displaystyle {\mathcal {C}}} est un opérateur proche de call-with-current-continuation (en). Cet opérateur peut être traduit dans le lambda-calcul non typé avec une traduction CPS (en).

La méthode précédente se base sur la déduction naturelle intuitionniste. Michel Parigot a proposé une variante du lambda-calcul basé sur la déduction naturelle classique, dans laquelle il peut y avoir plusieurs formules à droite de {\displaystyle \vdash }  : le lambda-mu calcul (en)[36]. Dans son calcul, il y a deux types de termes, les termes nommés qui correspondent aux formules à droite du {\displaystyle \vdash } et les termes innomés, qui correspondent aux termes à gauche du {\displaystyle \vdash } . Un terme innomé peut être nommé par la construction [ α ] M {\displaystyle [\alpha ]M} . Les termes innomés sont les termes du lambda-calcul usuel et ceux de la forme μ α . M {\displaystyle \mu \alpha .M} , qui permette d'abstraire un terme nommé α {\displaystyle \alpha } .

Le lemme de Joyal[37] montre qu'il n'y a pas de correspondance de Curry-Howard-Lambek pour la logique classique : il énonce que si C {\displaystyle {\mathcal {C}}} est une catégorie cartésienne fermée munie d'un objet dualisant, c'est-à-dire un objet {\displaystyle \bot } tel que pour tout A {\displaystyle A} , le morphisme A [ [ A , ] , ] {\displaystyle A\to [[A,\bot ],\bot ]} est un isomorphisme, alors C {\displaystyle {\mathcal {C}}} est un préordre. Cela signifie que toutes les preuves d'une même proposition sont égales, et donc que la réduction n'a pas d'intérêt.

Entiers naturels

Il est possible, comme dans le lambda-calcul non typé, de définir les entiers comme les entiers de Church, c'est-à-dire comme le type ( α α ) ( α α ) {\displaystyle (\alpha \to \alpha )\to (\alpha \to \alpha )} pour α {\displaystyle \alpha } un type de base. Un entier n {\displaystyle n} est alors représenté par n ¯ = λ f α α . λ x α . f n x {\displaystyle {\overline {n}}=\lambda f^{\alpha \to \alpha }.\lambda x^{\alpha }.f^{n}x} qui compose la fonction en argument n {\displaystyle n} fois avec elle-même. Mais cette représentation est limitée : en effet, seuls les polynômes généralisés, c'est-à-dire les fonctions obtenues par composition de polynôme et de la fonction if ( n , m , i ) = { n si  i = 0 m si  i 0 {\displaystyle \operatorname {if} (n,m,i)={\begin{cases}n&{\text{si }}i=0\\m&{\text{si }}i\neq 0\\\end{cases}}} , sont définissables avec cette présentation des entiers[38].

Pour pallier ce problème, on peut utiliser le système T de Gödel[39]. C'est une extension du lambda calcul simplement typé avec les produits λ , × , 1 {\displaystyle \lambda ^{\to ,\times ,1}} qui possède des booléens et des entiers naturels : il y a deux constantes booléennes T {\displaystyle T} et F {\displaystyle F} et une structure conditionnelle : si M {\displaystyle M} est un booléen et N {\displaystyle N} et O {\displaystyle O} sont de type A {\displaystyle A} , D A M N O {\displaystyle D_{A}MNO} est de type A {\displaystyle A} . On a de plus les règles D A T N O N {\displaystyle D_{A}TNO\to N} et D A F N O O {\displaystyle D_{A}FNO\to O} . De plus, il y a une constante 0 {\displaystyle 0} de type entier, et si M {\displaystyle M} est un entier, S M {\displaystyle SM} aussi, qui représente son successeur. Enfin, pour chaque type A {\displaystyle A} , il y a un une construction qui permet de produire une valeur par récurrence sur un entier : si M {\displaystyle M} est un entier, N {\displaystyle N} un terme de type A {\displaystyle A} , O {\displaystyle O} de type A N A {\displaystyle A\to \mathbb {N} \to A} , R A M N O {\displaystyle R_{A}MNO} est de type A {\displaystyle A} vérifiant pour tout M {\displaystyle M} , N {\displaystyle N} et O {\displaystyle O} , R A 0 M N M {\displaystyle R_{A}0MN\to M} et R A ( S M ) N O N ( R A M N O ) O {\displaystyle R_{A}(SM)NO\to N(R_{A}MNO)O} [40]. Système T a notamment permis de donner une preuve de l'arithmétique de Heyting, de laquelle on peut déduire l'arithmétique de Peano[39]. Notamment, les fonctions entre les entiers définissables dans le système T correspondent exactement aux fonctions prouvablement totales dans l'arithmétique de Peano[41], ou, ce qui revient au même, dans l'arithmétique de Heyting[42].

Combinateurs de points fixes

Le λ Y {\displaystyle \lambda Y} -calcul est une extension du lambda-calcul simplement typé avec produits λ , × , 1 {\displaystyle \lambda ^{\to ,\times ,1}} avec des combinateurs de points fixes, introduit par Dana Scott[43] et étudiée par Gordon Plotkin[44]. On ajoute pour chaque type T {\displaystyle T} une constante Y T {\displaystyle Y_{T}} de type ( T T ) T {\displaystyle (T\to T)\to T} et une constante Ω T {\displaystyle \Omega _{T}} de type T {\displaystyle T} , et la règle de réduction Y T M M ( Y T M ) {\displaystyle Y_{T}M\to M(Y_{T}M)} [45]. Le λ Y {\displaystyle \lambda Y} -calcul s'interprète notamment dans la catégorie des dcpo pointés et des fonctions continues entre eux. Cette catégorie cartésienne close, chaque objet a un plus petit élément {\displaystyle \bot } (qui sert à interpréter Ω T {\displaystyle \Omega _{T}} ) et chaque fonction continue d'un dcpo dans lui-même a un plus petit point fixe : Y T {\displaystyle Y_{T}} a alors pour sémantique la fonction qui a f {\displaystyle f} associe son plus petit point fixe.

PCF (en)[44],[46] est une variante du λ Y {\displaystyle \lambda Y} -calcul avec les types de fonctions et deux types de bases, les booléens et les entiers naturels, vu comme des domaines plats. Cela signifie que si N {\displaystyle \mathbb {N} } représente les entiers naturels usuels, les entiers de PCF sont N = N { } {\displaystyle \mathbb {N} _{\bot }=\mathbb {N} \cup \{\bot \}} , avec {\displaystyle \bot } le plus petit élément de N {\displaystyle \mathbb {N} _{\bot }} , les autres éléments étant incomparables entre eux. Une valeur {\displaystyle \bot } représente une valeur indéfinie. En plus des constantes Y {\displaystyle Y} et Ω {\displaystyle \Omega } pour chaque type, PCF possède également une constante pour chaque entier et pour chaque booléen, une structure conditionnelle if then else {\displaystyle \operatorname {if} \dots \operatorname {then} \dots \operatorname {else} \dots } , une fonction pour tester si un entier vaut zéro, ainsi que les fonctions successeur et prédécesseur. C'est un exemple minimal de langage de programmation fonctionnel, et il est Turing-complet[44].

Polymorphisme

Il est possible d'étendre le lambda-calcul simplement typé pour qu'il supporte des abstractions et des instanciations de type, c'est-à-dire ajouter du polymorphisme[47]. Le système formel obtenu se nomme le système F[48]. Très expressif, ce système permet de définir les produits, les sommes et le quantificateur existentiel, ainsi que les types inductifs comme les entiers ou les listes. Les fonctions définissables sur les entiers dans le système F sont exactement les fonctions prouvablement totales dans l'arithmétique du second ordre[49], ou de façon équivalente, dans l'arithmétique de Heyting du second ordre.

Types dépendants, types d'ordre supérieurs

On peut également étendre le système de types pour obtenir des types dépendants[50], c'est-à-dire des types qui dépendent de valeur, et des types d'ordre supérieur[51], c'est-à-dire des types qui dépendent d'autre types, formant ainsi le lambda-cube[52],[53]. De plus, on peut également considérer diverses théories des types possédant à la fois du polymorphisme, des types d'ordre supérieur et des types dépendants, comme par exemple la théorie des types de Martin-Löf MLTT[54], le calcul des constructions CoC[55],[56], ou enfin la théorie des types homotopiques HoTT[57].

Références

  1. (en) William Alvin Howard, « The Formulae-as-Types Notion of Construction », To HB Curry: essays on combinatory logic, lambda calculus and formalism, Academic Press,‎ (lire en ligne)
  2. a b c d et e Selinger 2013, p. 46-47
  3. a et b Nederpelt et Geuvers 2014, p. 34
  4. a et b Nederpelt et Geuvers 2014, p. 36
  5. Nederpelt et Geuvers 2014, p. 65-66
  6. a b c d et e Selinger 2013, p. 57
  7. Selinger 2013, p. 12
  8. a et b Selinger 2013, p. 67
  9. a b c et d Selinger 2013, p. 58
  10. Selinger 2013, p. 61-63
  11. a et b Girard et al. 1989, p. 79-80
  12. Girard et al. 1989, p. 10 règles du fragment conjonctif et implicatif
  13. Girard et al. 1989, p. 72 règles du fragment disjonctif
  14. Girard et al. 1989, p. 19
  15. Girard et al. 1989, p. 13 pour le fragment conjonctif et implicatif
  16. Girard et al. 1989, p. 74 pour le fragment disjonctif
  17. Girard et al. 1989, p. 77-78 conversions commutatives pour le fragment disjonctif
  18. a et b Girard et al. 1989, p. 20-21 pour le fragment conjonctif et implicatif
  19. Girard et al. 1989, p. 78-79 pour le fragment disjonctif
  20. a b c et d Lambek et Scott 1988, p. 76
  21. Lambek et Scott 1988, p. 79
  22. Amadio et Curien 1998, p. 102
  23. Amadio et Curien 1998, p. 97
  24. (en) Harvey Friedman, « Equality between functionals », Logic Colloquium, Springer,‎ , p. 22–37 (ISBN 978-3-540-37483-1, DOI 10.1007/BFb0064870, lire en ligne, consulté le )
  25. Amadio et Curien 1998, p. 107
  26. Amadio et Curien 1998, p. 95
  27. Lambek et Scott 1988, p. 107
  28. Amadio et Curien 1998, p. 61
  29. Amadio et Curien 1998, p. 118
  30. Girard, Taylor et Lafont 1989, p. 55
  31. Amadio et Curien 1998, p. 335
  32. Selinger 2013, p. 65-66
  33. Timothy G. Griffin, « A formulae-as-type notion of control », Proceedings of the 17th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, Association for Computing Machinery, pOPL '90,‎ , p. 47–58 (ISBN 978-0-89791-343-0, DOI 10.1145/96709.96714, lire en ligne, consulté le )
  34. (en) Matthias Felleisen, Daniel P. Friedman, Eugene Kohlbecker et Bruce Duba, « A syntactic theory of sequential control », Theoretical Computer Science, vol. 52, no 3,‎ , p. 205-237 (DOI https://doi.org/10.1016/0304-3975(87)90109-5)
  35. Jean Goubault-Larrecq, « Polycopié de lambda-calcul typé »
  36. (en) Michel Parigot, « λμ-Calculus: An algorithmic interpretation of classical natural deduction », Logic Programming and Automated Reasoning, Springer,‎ , p. 190–201 (ISBN 978-3-540-47279-7, DOI 10.1007/BFb0013061, lire en ligne, consulté le )
  37. (en) Samson Abramsky, « No-Cloning in Categorical Quantum Mechanics », dans Semantic Techniques in Quantum Computation, Cambridge University Press, , 1–28 p. (ISBN 978-0-521-51374-6, arXiv 0910.2401)
  38. (de) Helmut Schwichtenberg, « Definierbare Funktionen im λ-Kalkül mit Typen », Archiv für mathematische Logik und Grundlagenforschung, vol. 17, no 3,‎ , p. 113–114 (ISSN 1432-0665, DOI 10.1007/BF02276799)
  39. a et b (de) Kurt Gödel, « Über eine bisher noch nicht benützte Erweiterung des finiten Standpunktes », Dialectica, vol. 12, nos 3-4,‎ , p. 280–287 (DOI 10.1111/j.1746-8361.1958.tb01464.x Accès libre)
  40. Girard, Taylor et Lafont 1989, p. 47
  41. Girard, Taylor et Lafont 1989, p. 52
  42. (en) Harvey Friedman, « Classically and intuitionistically provably recursive functions », Higher Set Theory, Springer,‎ , p. 21–27 (ISBN 978-3-540-35749-0, DOI 10.1007/BFb0103100, lire en ligne, consulté le )
  43. (en) Dana S. Scott, « A type-theoretical alternative to ISWIM, CUCH, OWHY Author links open overlay », Theoretical Computer Science, vol. 121, nos 1–2,‎ , p. 411-440 (DOI 10.1016/0304-3975(93)90095-B)
  44. a b et c (en) Gordon Plotkin, « LCF considered as a programming language », Theoretical Computer Science, vol. 5, no 3,‎ , p. 223-255 (DOI 10.1016/0304-3975(77)90044-5)
  45. Amadio et Curien 1998, p. 145
  46. Amadio et Curien 1998, p. 149
  47. Nederpelt et Geuvers 2014, p. 69
  48. Girard, Taylor et Lafont 1989, p. 81
  49. Girard, Taylor et Lafont 1989, p. 123
  50. Nederpelt et Geuvers 2014, p. 103
  51. Nederpelt et Geuvers 2014, p. 85
  52. (en) Henk Barendregt, « Introduction to generalized type systems », Journal of Functional Programming, vol. 1, no 2,‎ , p. 125–154 (ISSN 0956-7968 et 1469-7653, DOI 10.1017/S0956796800020025)
  53. Nederpelt et Geuvers 2014, p. 125
  54. (en) Per Martin-Löf, « An Intuitionistic Theory of Types: Predicative Part », Studies in Logic and the Foundations of Mathematics, Elsevier, vol. 80,‎ , p. 73-118 (ISBN 9780444106421, ISSN 0049-237X, DOI https://doi.org/10.1016/S0049-237X(08)71945-1)
  55. (en) Thierry Coquand et Gérard Huet, « The calculus of constructions », Information and Computation, vol. 76, nos 2-3,‎ , p. 95-120 (DOI 10.1016/0890-5401(88)90005-3, lire en ligne)
  56. Nederpelt et Geuvers 2014, p. 123
  57. (en) The Univalent Foundations Program, Homotopy Type Theory: Univalent Foundations of Mathematics, Institute for Advanced Study, (lire en ligne)

Bibliographie

  • (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
  • (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) Jean-Yves Girard, Paul Taylor et Yves Lafont, Proofs and Types, Cambridge University Press, , 183 p. (ISBN 0-521-37181-3, lire en ligne). Ouvrage utilisé pour la rédaction de l'article
  • 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) Joachim Lambek et Dana S. Scott, Introduction to Higher-Order Categorical Logic, Cambridge University Press, (ISBN 9780521356534). Ouvrage utilisé pour la rédaction de l'article.
  • (en) Roberto M. Amadio et Pierre-Louis Curien, Domains and Lambda-Calculi, Cambridge University Press, coll. « Cambridge Tracts in Theoretical Computer Science », , 534 p. (ISBN 978-0-521-62277-6, 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