Système T

À l'instar de la récursion primitive ou le lambda-calcul, le système T ou l'arithmétique dans les types finis est un système formel. Il a été inventé par le logicien Kurt Gödel[1] pour montrer la cohérence de l'arithmétique de Heyting au moyen de son interprétation Dialectica (en).

Ce système consiste en une extension du lambda-calcul simplement typé avec des entiers naturels et la possibilité de définir des fonctions par récurrence. Le système T est plus expressif que le lambda-calcul simplement typé et que la récursion primitive étant donné qu'il permet de définir la fonction d'Ackermann. En fait, les fonctions définissables dans le système T sont exactement les fonctions prouvablement totales dans l'arithmétique de Peano, ou de façon équivalente, dans l'arithmétique de Heyting.

Le principe est simple : on garde les schémas récursifs primitifs :

f ( 0 , y ) = g ( y ) {\displaystyle f(0,{\vec {y}})=g({\vec {y}})}

f ( S u c c ( x ) , y ) = h ( x , f ( x , y ) , y ) {\displaystyle f(Succ(x),{\vec {y}})=h(x,f(x,{\vec {y}}),{\vec {y}})}

La différence majeure est que l'on autorise les paramètres y {\displaystyle {\vec {y}}} à être des fonctions. Par rapport à la récursion primitive, il est alors possible, par exemple, de faire une récurrence sur plusieurs paramètres.

Formalisme

Le formalisme se base sur celui du lambda-calcul simplement typé. On y ajoute un type représentant les entiers naturels, N a t {\displaystyle {\mathsf {Nat}}} , ainsi qu'un type représentant les booléens, B o o l {\displaystyle {\mathsf {Bool}}} [2].

Pour les booléens, on considère deux constantes, True {\displaystyle \operatorname {True} } (Vrai en anglais) et False {\displaystyle \operatorname {False} } (Faux en anglais), ainsi qu'une construction if A u   v   w {\displaystyle \operatorname {if} _{A}u~v~w} avec u {\displaystyle u} un booléen et v {\displaystyle v} et w {\displaystyle w} de même type A {\displaystyle A} . Cette opération représente une instruction conditionnelle : si u {\displaystyle u} est vrai, on renvoie v {\displaystyle v} , sinon w {\displaystyle w} . Cela se traduit par les règles if A True v   w v {\displaystyle \operatorname {if} _{A}\operatorname {True} v~w\to v} et if A False v   w w {\displaystyle \operatorname {if} _{A}\operatorname {False} v~w\to w} .

( T ) Γ True : B o o l {\displaystyle (\operatorname {T} )\;{\frac {}{\Gamma \vdash \operatorname {True} :{\mathsf {Bool}}}}}
( F ) Γ False : B o o l {\displaystyle (\operatorname {F} )\;{\frac {}{\Gamma \vdash \operatorname {False} :{\mathsf {Bool}}}}}
( if ) Γ u : B o o l Γ v : A Γ w : A Γ if A u   v   w : A {\displaystyle (\operatorname {if} )\;{\frac {\Gamma \vdash u:{\mathsf {Bool}}\quad \Gamma \vdash v:A\quad \Gamma \vdash w:A}{\Gamma \vdash \operatorname {if} _{A}u~v~w:A}}}

Les entiers sont construits soit à partir de la constante 0 {\displaystyle 0} , soit comme le successeur S u {\displaystyle \operatorname {S} u} d'un autre entier u {\displaystyle u} , qui représente u + 1 {\displaystyle u+1} . Ainsi, si n {\displaystyle n} est un entier naturel usuel, il sera représenté dans le système T par le terme S n 0 = S S n   0 {\displaystyle \operatorname {S} ^{n}0=\overbrace {\operatorname {S} \cdots \operatorname {S} } ^{n}~0} , qui consiste en n {\displaystyle n} applications successives de S {\displaystyle \operatorname {S} } au terme 0 {\displaystyle 0} .

Si u {\displaystyle u} est un entier, v {\displaystyle v} a pour type A {\displaystyle A} et w {\displaystyle w} est une fonction qui prend un entier et un élément de type A {\displaystyle A} et renvoie un élément de type A {\displaystyle A} , rec A u   v   w {\displaystyle \operatorname {rec} _{A}u~v~w} est de type A {\displaystyle A} . L'idée derrière rec {\displaystyle \operatorname {rec} } est que le terme λ u N a t . rec A u   v   w {\displaystyle \lambda u^{\mathsf {Nat}}.\operatorname {rec} _{A}u~v~w} représente la fonction f {\displaystyle f} définie par récurrence avec f ( 0 ) = u {\displaystyle f(0)=u} et f ( n + 1 ) = w ( n , f ( n ) ) {\displaystyle f(n+1)=w(n,f(n))}  : on considère donc les règles de réduction rec A 0   v   w v {\displaystyle \operatorname {rec} _{A}0~v~w\to v} et rec A ( S u )   v   w w u ( rec A u   v   w ) {\displaystyle \operatorname {rec} _{A}(\operatorname {S} u)~v~w\to wu(\operatorname {rec} _{A}u~v~w)} .

( 0 ) Γ 0 : N a t {\displaystyle (0)\;{\frac {}{\Gamma \vdash 0:{\mathsf {Nat}}}}}
( S ) Γ u : N a t Γ S   u : N a t {\displaystyle (\operatorname {S} )\;{\frac {\Gamma \vdash u:{\mathsf {Nat}}}{\Gamma \vdash \operatorname {S} ~u:{\mathsf {Nat}}}}}
( rec ) Γ u : N a t Γ v : A Γ w : N a t A A Γ rec A u   v   w : A {\displaystyle (\operatorname {rec} )\;{\frac {\Gamma \vdash u:{\mathsf {Nat}}\quad \Gamma \vdash v:A\quad \Gamma \vdash w:{\mathsf {Nat}}\to A\to A}{\Gamma \vdash \operatorname {rec} _{A}u~v~w:A}}}

On peut noter que la réduction est confluente, préserve les types et est fortement normalisante[3]. On peut de plus montrer que les termes clos — c'est-à-dire sans variable libre — de type N a t {\displaystyle {\mathsf {Nat}}} sont tous de la forme S n 0 {\displaystyle \operatorname {S} ^{n}0} pour un certain entier naturel n {\displaystyle n} , et les termes clos de type B o o l {\displaystyle {\mathsf {Bool}}} sont True {\displaystyle \operatorname {True} } et False {\displaystyle \operatorname {False} } [4].

La relation de réduction est confluente et fortement normalisante[5].

Combinateurs typés

L'article originel de Gödel[1] présente un formalisme basé sur des combinateurs typés plutôt que sur le lambda-calcul simplement typé. Tait considère que c'est parce qu'il est plus facile de raisonner avec des combinateurs plutôt qu'avec le lambda-calcul, qui évitent de devoir gérer la substitution et les variables libres et liées[5], mais Troelstra[6] et lui définissent les lambda-termes à partir des combinateurs. Girard quant à lui présente le système T uniquement avec le lambda-calcul dans sa thèse[7] et dans son livre[2], en ajoutant un type des booléens et un type produit.

Exemples

Le prédécesseur

La fonction prédécesseur vérifie les équations suivantes[8] :

  • P r e d   0 = 0 {\displaystyle {\mathsf {Pred}}~0=0}  ;
  • P r e d   ( S n ) = n {\displaystyle {\mathsf {Pred}}~(\operatorname {S} n)=n} .

On peut donc l'écrire sous forme de terme comme :

P r e d = λ n N a t . rec N a t n   0   ( λ n N a t . λ r N a t . n ) . {\displaystyle {\mathsf {Pred}}=\lambda n^{\mathsf {Nat}}.\operatorname {rec} _{\mathsf {Nat}}n~0~\left(\lambda n'^{\mathsf {Nat}}.\lambda r^{\mathsf {Nat}}.n'\right).}

Un minimum efficace

En récursion primitive, on ne peut pas faire une fonction qui retourne le minimum de deux entiers en temps de calcul minimum de ces deux entiers[9]. C'est très contraignant si on calcule, par exemple, le minimum de 2 et 1 000 000. Comme le système T permet les récursions sur plusieurs paramètres, on peut trouver un algorithme plus efficace.

Intuitivement, la fonction minimum vérifie les équations suivantes :

  • M i n   0   0 = 0 {\displaystyle {\mathsf {Min}}~0~0=0}  ;
  • M i n   ( S 0 )   0 = 0 {\displaystyle {\mathsf {Min}}~(\operatorname {S} 0)~0=0}  ;
  • M i n   ( S m )   ( S n ) = S ( M i n   m   n ) {\displaystyle {\mathsf {Min}}~(\operatorname {S} m)~(\operatorname {S} n)=\operatorname {S} ({\mathsf {Min}}~m~n)} .

En transformant un peu on obtient des équations utilisant le schéma souhaité :

  • M i n   0 = λ m N a t .   0 {\displaystyle {\mathsf {Min}}~0=\lambda m^{\mathsf {Nat}}.~0}  ;
  • M i n   ( S m ) = λ n N a t . M i n ( M i n   m )   n {\displaystyle {\mathsf {Min}}~(\operatorname {S} m)=\lambda n^{\mathsf {Nat}}.{\mathsf {Min'}}({\mathsf {Min}}~m)~n}  ;
  • M i n f   0 = 0 {\displaystyle {\mathsf {Min'}}f~0=0}  ;
  • M i n f   ( S   n ) = S ( f   n ) {\displaystyle {\mathsf {Min'}}f~(\operatorname {S} ~n)=\operatorname {S} (f~n)} .

Le terme voulu est :

M i n = λ m N a t . rec N a t N a t m   ( λ n N a t .   0 )   ( λ m N a t . λ f N a t N a t . λ n N a t . rec N a t n   0   ( λ n N a . λ r N a t . S ( f   n ) ) ) . {\displaystyle {\mathsf {Min}}=\lambda m^{\mathsf {Nat}}.\operatorname {rec} _{{\mathsf {Nat}}\to {\mathsf {Nat}}}m~(\lambda n^{\mathsf {Nat}}.~0)~\left(\lambda m'^{\mathsf {Nat}}.\lambda f^{{\mathsf {Nat}}\to {\mathsf {Nat}}}.\lambda n^{\mathsf {Nat}}.\operatorname {rec} _{\mathsf {Nat}}n~0~\left(\lambda n'^{\mathsf {Na}}.\lambda r^{\mathsf {Nat}}.\operatorname {S} (f~n')\right)\right).}

De la même manière, on peut obtenir facilement un programme optimisé pour l'addition et la soustraction.

La fonction d'Ackermann

La fonction d'Ackermann est définie ainsi :

  • A c k ( m , n ) = { n + 1 si  m = 0 A c k ( m 1 , 1 ) si  m > 0  et  n = 0 A c k ( m 1 , A c k ( m , n 1 ) ) si  m > 0  et  n > 0. {\displaystyle {\mathsf {Ack}}(m,n)={\begin{cases}n+1&{\mbox{si }}m=0\\{\mathsf {Ack}}(m-1,1)&{\mbox{si }}m>0{\mbox{ et }}n=0\\{\mathsf {Ack}}(m-1,{\mathsf {Ack}}(m,n-1))&{\mbox{si }}m>0{\mbox{ et }}n>0.\end{cases}}}

On remarque que cette définition n'est pas une instance valide du schéma de récurrence primitive récursive : en effet, la récurrence primitive n'autorise pas à définir par récurrence une fonction qui renvoie autre chose qu'un entier (en l'occurence, il faudrait pouvoir renvoyer une fonction), mais ce n'est pas une limitation de système T. En fait, la fonction d'Ackermann n'est pas une fonction primitive récursive[10].

Ainsi, en modifiant un peu la définition, on obtient la forme désirée :

  • A c k   0 = λ n N a t . S n {\displaystyle {\mathsf {Ack}}~0=\lambda n^{\mathsf {Nat}}.\operatorname {S} n}  ;
  • A c k   ( S m ) = λ n N a t . A c k   ( A c k   m )   n {\displaystyle {\mathsf {Ack}}~(\operatorname {S} m)=\lambda n^{\mathsf {Nat}}.{\mathsf {Ack'}}~({\mathsf {Ack}}~m)~n}  ;
  • A c k   f   0 = f ( S 0 ) {\displaystyle {\mathsf {Ack'}}~f~0=f(\operatorname {S} 0)}  ;
  • A c k   f   ( S n ) = f ( A c k   f   n ) {\displaystyle {\mathsf {Ack'}}~f~(\operatorname {S} n)=f({\mathsf {Ack'}}~f~n)} .

Dans la fonction auxiliaire, la variable f {\displaystyle f} contient la fonction A c k   m {\displaystyle {\mathsf {Ack}}~m} . Il n'y a plus qu'à écrire cela sous forme de terme :

A c k = λ m N a t . rec N a t N a t   m   ( λ n N a t . S n )   ( λ m N a t . λ f N a t N a t . λ n N a t . rec N a t   n   ( f   ( S 0 ) )   ( λ n N a t . λ r N a t . f r ) ) . {\displaystyle {\mathsf {Ack}}=\lambda m^{\mathsf {Nat}}.\operatorname {rec} _{{\mathsf {Nat}}\to {\mathsf {Nat}}}~m~\left(\lambda n^{\mathsf {Nat}}.\operatorname {S} n\right)~\left(\lambda m'^{\mathsf {Nat}}.\lambda f^{{\mathsf {Nat}}\to {\mathsf {Nat}}}.\lambda n^{\mathsf {Nat}}.\operatorname {rec} _{\mathsf {Nat}}~n~\left(f~(\operatorname {S} 0)\right)~\left(\lambda n'^{\mathsf {Nat}}.\lambda r^{\mathsf {Nat}}.fr\right)\right).}

Formules

On peut introduire une théorie dont les termes sont décrits par ceux de système T[1],[5],[11],[12]. Les formules sont alors formées par quantification universelle et existentielle, conjonction, disjonction, négation et implication, à partir des formules atomiques {\displaystyle \top } (la formule toujours vraie), {\displaystyle \bot } (la formule toujours fausse) et s = T t {\displaystyle s=_{T}t} T {\displaystyle T} est un type et s {\displaystyle s} et t {\displaystyle t} deux termes de types T {\displaystyle T} , qui désigne la formule vraie si s {\displaystyle s} et t {\displaystyle t} sont égaux et fausse s'ils sont différents. Les règles de démonstration sont celles de la déduction naturelle dans sa variante intuitionniste, c'est-à-dire sans la règle de démonstration par l'absurde. Les règles de démonstration comprennent également la récurrence sur les entiers, qui énonce que

A [ x := 0 ] ( n N a t , A [ x := n ] A [ x := S n ] ) n N a t , A [ x := n ] {\displaystyle A[x:=0]\land (\forall n^{\mathsf {Nat}},A[x:=n]\implies A[x:=\operatorname {S} n])\implies \forall n^{\mathsf {Nat}},A[x:=n]} ,

et la règle d'élimination des booléens, qui énonce que

A [ x := True ] A [ x := False ] b B o o l , A [ x := b ] {\displaystyle A[x:=\operatorname {True} ]\land A[x:=\operatorname {False} ]\implies \forall b^{\mathsf {Bool}},A[x:=b]} .

Égalité

Pour l'égalité[13], on considère les règles de l'arithmétique de Peano pour les entiers, c'est-à-dire que S x 0 {\displaystyle \operatorname {S} x\neq 0} et x = y S x = S y {\displaystyle x=y\iff \operatorname {S} x=\operatorname {S} y} , que les deux constantes booléennes sont différentes : True False {\displaystyle \operatorname {True} \neq \operatorname {False} } , que l'égalité est une relation réflexive, symétrique et transitive : x = x {\displaystyle x=x} , x = y y = x {\displaystyle x=y\implies y=x} , x = y y = z x = z {\displaystyle x=y\land y=z\implies x=z} , que deux termes égaux sont substituables : si t = u {\displaystyle t=u} et A [ x := t ] {\displaystyle A[x:=t]} alors A [ x := u ] {\displaystyle A[x:=u]} , et que les règles de réduction de if {\displaystyle \operatorname {if} } et rec {\displaystyle \operatorname {rec} } sont valides, c'est-à-dire que if A True v   w = v {\displaystyle \operatorname {if} _{A}\operatorname {True} v~w=v} , if A False v   w = w {\displaystyle \operatorname {if} _{A}\operatorname {False} v~w=w} , rec A 0   v   w = v {\displaystyle \operatorname {rec} _{A}0~v~w=v} et rec A ( S u )   v   w = w u ( rec A u   v   w ) {\displaystyle \operatorname {rec} _{A}(\operatorname {S} u)~v~w=wu(\operatorname {rec} _{A}u~v~w)} . Pour les fonctions, on considère ( λ x T . M ) N = M [ x := N ] {\displaystyle (\lambda x^{T}.M)N=M[x:=N]} si x {\displaystyle x} n'est pas libre dans N {\displaystyle N} et M = N λ x T . M = λ x T . N {\displaystyle M=N\implies \lambda x^{T}.M=\lambda x^{T}.N} , mais cela ne suffit pas forcément à décrire l'égalité entre fonctions.

Dans le système utilisé par Gödel à l'origine[1], l'égalité est supposée intensionnelle[14], c'est-à-dire que deux fonctions sont égales si c'est le même algorithme qui les décrivent, par exemple, au travers de la clotûre réflexive, symétrique et transitive {\displaystyle \equiv } de la relation de réduction {\displaystyle \to } décrite précédemment pour les termes bien typés, sans la règle η {\displaystyle \eta } du lambda-calcul. Comme {\displaystyle \to } est confluente et fortement normalisante, {\displaystyle \equiv } correspond à la relation « a la même forme normale que ». De plus, il y a un symbole de fonction E T : T T B o o l {\displaystyle E_{T}:T\to T\to {\mathsf {Bool}}} pour chaque type T {\displaystyle T} tel que E T   f   g f = T g {\displaystyle E_{T}~f~g\iff f=_{T}g} . En particulier, l'égalité est décidable et si f {\displaystyle f} et g {\displaystyle g} sont deux termes de type T {\displaystyle T} qui ont la même forme normale, alors ils sont égaux.

On peut également considérer une variante extensionnelle[15] où deux fonctions sont égales si elles sont égales en tout point : cela revient à rajouter la règle d' η {\displaystyle \eta } -réduction pour les fonctions. Néanmoins dans ce système, l'égalité n'est plus décidable, et l'interprétation Dialectica (en) ne fonctionne pas[16]. Pour remédier à cela, on peut limiter la substitution aux formules sans quantificateurs.

Enfin, on peut considérer un système où il n'y a pas de symbole pour l'égalité des types de fonctions[17].

Tous ces systèmes sont des extensions de l'arithmétique de Heyting, et dans tous les systèmes sauf le système extensionnel avec la règle de substitution complète, chaque formule sans quantificateurs est équivalente à une formule de la forme b = B o o l True {\displaystyle b=_{\mathsf {Bool}}\operatorname {True} } [18].

Articles connexes

Bibliographie

  • (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 Accès libre).
  • Jean-Yves Girard, Interprétation fonctionnelle et élimination des coupures de l'arithmétique d'ordre supérieur, , 230 p. (lire en ligne).
  • (en) Anne Sjerp Troelstra, Metamathematical Investigation of Intuitionistic Arithmetic and Analysis, Springer Berlin, Heidelberg, coll. « Lecture Notes in Mathematics » (no 344), , 503 p. (ISBN 978-3-540-06491-6, ISSN 0075-8434, e-ISSN 1617-9692, DOI 10.1007/BFb0066739 Accès payant, lire en ligne Accès payant).

Références

  1. a b c et d (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)
  2. a et b Girard, Taylor et Lafont 1989, p. 47
  3. Girard, Taylor et Lafont 1989, p. 48
  4. Girard, Taylor et Lafont 1989, p. 51
  5. a b et c (en) William Walker Tait, « Intensional Interpretations of Functionals of Finite Type I », The Journal of Symbolic Logic, vol. 32, no 2,‎ , p. 198–212 (ISSN 0022-4812, DOI 10.2307/2271658, lire en ligne [PDF], consulté le )
  6. Troelstra 73, p. 41
  7. Girard 1972, p. I.2.1
  8. Girard, Taylor et Lafont 1989, p. 50
  9. Loïc Colson, « About primitive recursive algorithms », Theoretical Computer Science, vol. 83, no 1,‎ , p. 57–69 (ISSN 0304-3975, DOI 10.1016/0304-3975(91)90039-5 Accès libre)
  10. (de) Wilhelm Ackermann, « Zum Hilbertschen Aufbau der reellen Zahlen », Mathematische Annalen, vol. 99, no 1,‎ , p. 118–133 (ISSN 1432-1807, DOI 10.1007/BF01459088 Accès payant, lire en ligne Accès libre, consulté le )
  11. Girard 1972, p. III.2.1
  12. Troelstra 1973, p. 39-50
  13. Troelstra 73, p. 40-42
  14. Troelstra 73, p. 43
  15. Troelstra 73, p. 43-45
  16. Troelstra 73, p. 242
  17. Troelstra 73, p. 46
  18. Troelstra 73, p. 45
  • icône décorative Portail de l'informatique théorique
  • icône décorative Portail de la logique