L’arithmétique de Peano du premier ordre PA1, ou bien celle de Heyting HA1, est en fait un système logique relativement faible. Il se trouve que, même si de nombreuses vérités arithmétiques sont démontrables en PA1 ou en HA1, il en existe de relativement simples qui ne sont pas démontrables en PA1 [PH78].
Un système beaucoup plus complet est l’arithmétique de Peano du second ordre PA2, et sa contrepartie intuitionniste HA2. Nous allons nous intéresser à HA2, qui est défini comme HA1 à partir de la logique du premier ordre, mais à partir de la logique du second ordre. La nouveauté apportée par la logique du second ordre est que nous disposons maintenant de variables de prédicats X, Y, …, que l’on peut appliquer à des termes du premier ordre, et sur lesquelles on peut quantifier.
Formellement, étant donné un langage du premier ordre L donné par des familles de symboles de fonctions Fn, n≥ 0, et des familles de symboles ou variables de prédicats Pn, n≥ 0, on définit les formules du second ordre par la grammaire:
F ::= A ∣ ⊥ ∣ F ⇒ F ∣ ∀ X · F ∣ ∀ Pn · F |
où A parcourt l’ensemble des formules atomiques, et les formules sont vues à α-conversion près. La différence avec les formules du premier ordre est l’ajout de la quantification ∀ P · F d’ordre deux. Par commodité, nous supposerons que chaque ensemble Pn est infini.
L’autre différence avec la logique d’ordre un est la notion de substitution. Pour toute variable du premier ordre i et pour tout terme t du premier ordre, F [i:=t] est défini comme d’habitude. Fixons une fois pour toutes une suite de variables k1, k2, …, alors F [P (k1, …, kn) := G], où P est une variable de prédicat n-aire et G est une formule est défini par récurrence structurelle sur F par:
|
où dans la première ligne, côté droit, la substitution est une substitution du premier ordre. Intuitivement, la substitution [P (k1, …, kn) := G] consiste à remplacer P (k1, …, kn) par G, et donc aussi P (t1, …, tn) = P (k1, …, kn) [k1:=t1, …, kn:=tn] par G [k1:=t1, …, kn:=tn].
Les règles de déduction de la logique d’ordre deux sont celles de la logique d’ordre un plus:
où P ∈ Pn. De même, HA2 est HA1 plus ces deux règles, et PA2 est PA1 plus ces deux règles.
Notre λ-calcul est le même que le λ∇ R-calcul, plus les constructions u G (application d’un terme à un type) et Λ P · u (abstraction sur une variable de prédicat), et est défini par la grammaire:
ΛN, 2 ::= V ∣ ΛN, 2 ΛN, 2 ∣ λ V · ΛN, 2 ∣ ∇ ΛN, 2 ∣ ΛN, 2 T ∣ λ X · ΛN, 2 ∣ r0 ∣ R ΛN, 2 ΛN, 2 T ∣ ΛN, 2 F ∣ λ Pn · ΛN, 2 |
où T est le langage des termes du premier ordre de l’arithmétique, et F est celui des formules du second ordre.
Les règles de réduction sont celles de HA1, plus:
|
où P est n-aire, et la substitution est étendue aux termes de preuve de façon immédiate.
Les termes et les réductions de HA2 sont complexes, et nous allons commencer par étudier une restriction drastique, un système de typage du λ-calcul appelé le système F2 et dû à Jean-Yves Girard. Nous verrons plus tard que le système F2 contient l’essentiel des caractéristiques logiques de HA2.
On obtient le système F2 d’une part en supprimant dans les formules tous les termes et toutes les quantifications du premier ordre, en ne gardant que des variables de prédicats 0-aires, et en ne gardant dans le λ∇ R-calcul que le λ-calcul plus les applications et abstractions du second ordre sur les variables de prédicats 0-aires — on supprime récurseur, application et abstraction du premier et du second ordre non 0-aire.
Ce qui reste est un langage de types de la forme:
F =def P0 ∣ F ⇒ F ∣ ∀ P0 · F |
La substitution sur les types est la substitution usuelle (regarder la définition de la substitution d’ordre deux lorsque la variable de prédicat est 0-aire).
Le λ-calcul du système F2 est défini par:
Λ∀::= V ∣ Λ∀Λ∀∣ λ V · Λ∀∣ Λ∀F ∣ λ P0 · Λ∀ |
où F2 parcourt l’ensemble des formules ci-dessus; et les règles de typage sont:
Comme dans le système des types simples, nous utilisons la convention que les règles sont données pour des termes à α-renommage près. Ceci nous permet d’écrire les règles (Abs) et (TAbs) comme ci-dessus, plutôt que sous la forme plus complexe (mais rigoureuse) ci-dessous:
D’un point de vue logique, ce système de typage est un système de déduction naturelle pour la logique intuitionniste minimale propositionnelle quantifiée.
Les règles de réduction définissant →βη sont:
|
Preuve : Bien que la preuve ne soit pas très longue, elle est beaucoup plus subtile que dans les cas précédents. Essayons d’adapter la méthode de réductibilité. Le problème est de définir RED∀ P · F: on est tenté de le définir comme étant l’ensemble des λ-termes u tels que, pour toute formule G, uG soit dans REDF [P:=G]. Mais la formule F [P:=G] n’est non seulement pas en général une sous-expression de ∀ P · F, mais elle peut en fait être beaucoup plus grosse. Le passage par le squelette comme aux théorèmes 4 et 6 ne fonctionne plus. Prenons en effet par exemple RED∀ P · P: si on le définit comme ci-dessus, ce sera l’ensemble des λ-termes u tels que, pour toute formule G, uG est dans REDG. Autrement dit, pour définir RED∀ P · P, on a besoin de disposer déjà par hypothèse de récurrence des définitions des REDG pour toutes les formules G — y compris ∀ P · P, au passage. La subtilité fondamentale du système F2, comme on le voit, est que lorsque l’on quantifie sur P pour définir ∀ P · F, P varie sur toutes les formules, y compris la formule à définir ∀ P · F elle-même. Un système logique qui a cette propriété est dit imprédicatif.
On contourne le problème comme suit. Considérons des contextes C servant à interpréter les variables de types: C est une fonction qui à chaque variable de type P associe un ensemble de λ-termes. Pour toute variable de type P et pour tout ensemble S de λ-termes, notons C [P:=S] le contexte qui à P associe S et à tout Q ≠ P associe C (Q). On définit alors l’ensemble REDFC des termes réductibles au type F dans le contexte C. Ceci permettra de contourner le problème en définissant (en gros) RED∀ P · FC comme l’ensemble des termes u tels que pour tout ensemble S de termes, pour toute formule G, u G est dans RECFC [P:=S]. L’ensemble REDFC sera tel, notamment, que pour toute variable de type P, REDPC sera simplement l’ensemble C (P). (Dans les preuves précédentes, c’était SN: on peut rejouer ces preuves en utilisant le contexte qui à tout P associe SN.) Mais pour que la preuve de normalisation forte fonctionne, il faudra que nous vérifions les propriétés (CR1), (CR2) et (CR3). Ces propriétés ne sont pas valides sur REDPC si C (P) est un ensemble arbitraire de termes. On restreint donc les C (P) a être des ensembles de λ-termes particuliers appelés candidats de réductibilité. Définissons donc les candidats de réductibilité en paraphrasant les conditions (CR1), (CR2) et (CR3). Un candidat de réductibilité est un ensemble S de λ-termes tels que:
Dans cette définition, un terme neutre est un terme ne commençant pas par λ, et SN est l’ensemble des termes fortement normalisants pour →βη.
Reprenons maintenant la définition de REDFC. Pour toute variable de prédicat P, on pose donc REDPC =def C (P); REDF1 ⇒ F2C est l’ensemble des termes u tels que pour tout v∈ REDF1C, uv ∈ REDF2C; et RED∀ P · FC est l’ensemble des termes u tels que, pour tout candidat de réductibilité S, pour toute formule G, uG ∈ REDFC [P:=S]. Cette définition de REDFC est valide, et procède par récurrence structurelle sur F.
Un contexte C est appelé un contexte de candidats si C (P) est un candidat de réductilibité pour tout P. Montrons que REDFC vérifie les conditions (CR1) à (CR3), autrement dit que REDFC est un candidat de réductibilité pour tout contexte de candidats C et pour toute formule F. Ceci ne présente pas plus de difficulté qu’au théorème 1, et s’effectue par récurrence structurelle sur F. Si F est une variable de type P, REDPC = C (P) est un candidat de réductibilité par hypothèse. Si F est de la forme F1 ⇒ F2, c’est comme au théorème 1. Le cas intéressant est celui où F est de la forme ∀ P · F1. Remarquons d’abord que SN est lui-même un candidat de réductibilité; en particulier, il existe des candidats de réductibilité.
Observons que: (*) si Q n’est pas libre dans G, alors REDGC = REDGC [Q:=S] pour tout candidat S. Autrement dit, REDGC ne dépend que de la restriction de C aux variables de prédicats libres dans G. On montre (*) par récurrence structurelle sur G. Si G est une variable de prédicat P, alors REDGC = C (P), alors que REDGC [Q:=S] = (C [Q:=S]) (P) = C (P) aussi, car par hypothèse Q n’est pas libre dans G, donc Q ≠ P. Si G est de la forme G1 ⇒ G2, alors REDGC = {u ∣ ∀ v ∈ REDG1C · uv ∈ REDG2C} = {u ∣ ∀ v ∈ REDG1C [Q:=S] · uv ∈ REDG2C [Q:=S]} (par hypothèse de récurrence) = REDGC [Q:=S]. Si G est de la forme ∀ P · G1 (où par α-renommage on peut supposer P≠ Q), alors REDGC = {u ∣ ∀ S′ candidat · ∀ G′ · u G′ ∈ REDG1C [P:=S′]} = {u ∣ ∀ S′ candidat · ∀ G′ · u G′ ∈ REDG1C [P:=S′] [Q:=S]} (par hypothèse de récurrence) = {u ∣ ∀ S′ candidat · ∀ G′ · u G′ ∈ REDG1C [Q:=S] [P:=S′]} = REDGC [Q:=S] (car P ≠ Q).
Montrons maintenant que: (**) REDFC [P := REDGC] = REDF [P:=G]C. Ceci est par récurrence structurelle sur F. Si F=P, alors REDFC [P := REDGC] = (C [P:= REDGC]) (P) = REDGC = REDF [P:=G]C. Si F est une autre variable de prédicat Q, REDFC [P := REDGC] = C (Q) = REDQC = REDF [P:=G]C. Si F est de la forme F1 ⇒ F2, alors REDFC [P := REDGC] = {u ∣ ∀ v ∈ REDF1C [P := REDGC] · uv ∈ REDF2C [P := REDGC]} = {u ∣ ∀ v ∈ REDF1 [P:=G]C · uv ∈ REDF2 [P:=G]C} (par hypothèse de récurrence) = REDF1 [P:=G] ⇒ F2 [P:=G]C = REDF [P:=G]C. Si F est de la forme ∀ Q · F1, alors REDFC [P := REDGC] = {u ∣ ∀ S candidat · ∀ H · u H ∈ REDF1C [P:=REDGC] [Q:=S]} = {u ∣ ∀ S candidat · ∀ H · u H ∈ REDF1C [Q:=S] [P:=REDGC]} = {u ∣ ∀ S candidat · ∀ H · u H ∈ REDF1C [Q:=S] [P:=REDGC [Q:=S]]} (par (*), car par α-renommage on peut supposer Q non libre dans G) = {u ∣ ∀ S candidat · ∀ H · u H ∈ REDF1 [P:=G]C [Q:=S]} (par hypothèse de récurrence) = REDF [P:=G]C.
On a alors: (+) pour tout terme u1 tel que u1 [x:=v] ∈ REDF2C pour tout v∈ REDF1C, alors λ x· u1 ∈ REDF1 ⇒ F2C. C’est comme au lemme 6, voir la preuve du théorème 1.
Aussi: (++) pour tout terme u1 tel que u1 [P:=G] ∈ REDF1C [P:=S] pour toute formule G et tout candidat S, alors λ P · u1 ∈ RED∀ P · F1C. Par hypothèse, en prenant G=def P et S =def C (P), u1 lui-même est dans REDF1C, donc dans SN par (CR1). Nous démontrons (++) en montrant que (λ P · u1) G ∈ REDF1C [P:=S] pour toute formule G et tout candidat S. C’est par récurrence sur ν (u1), en utilisant (CR3), puisque (λ P · u1) G est neutre. Mais (λ P · u1) G ne peut se réduire en une étape que vers: (λ P · u′1) G avec u1 →βη u′1, qui est dans REDF1C [P:=S] par hypothèse de récurrence; ou vers u1 [P:=G], qui est dans REDF1C [P:=S] par hypothèse; ou vers u2 G par (Eta), alors que u1 est de la forme u2 P et P n’est libre dans aucun type d’aucune variable libre de u2 — mais alors u2 G = u1 [P:=G], qui est dans REDF1C [P:=S] par hypothèse.
Il ne reste plus qu’à démontrer:
où la substitution [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] qui remplace en parallèle les xi par les vi et les variables de types Pj par les formules Gj est définie de la façon naturelle.
On montre (♣) par récurrence structurelle sur la dérivation de typage donnée de u. Si la dernière règle est (Var), u est une variable xi, 1≤ i≤ n, donc u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] = vi est dans REDFiC = REDFC par hypothèse.
Si u est de la forme u1 u2, par hypothèse de récurrence u1 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] est dans REDG ⇒ FC pour une certaine formule G telle que u2 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] est dans REDGC, donc u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] ∈ REDFC.
Si u est de la forme u1 G, avec u1 de type ∀ P · F1 et F = F1 [P:=G], alors par hypothèse de récurrence u1 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] ∈ RED∀ P · F1C, donc u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] ∈ REDF1C [P:=S] pour tout candidat S. Prenons S =def REDGC: par (**), u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] ∈ REDF1 [P:=G]C = REDFC.
Si u est de la forme λ x · u1, avec F = F1 ⇒ F2, alors par hypothèse de récurrence u1 [x1:=v1, …, xn:=vn, x:=v, P1:=G1, …, Pm:=Gm] ∈ REDF2C pour tout v∈ REDF1C, mais u1 [x1:=v1, …, xn:=vn, x:=v, P1:=G1, …, Pm:=Gm] = (u1 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm]) [x:=v]. Nous utilisons ici que x peut être prise différente de x1, …, xn, et non libre dans v1, …, vn, par α-renommage. Donc par (+) u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] ∈ REDFC.
Si u est de la forme λ P · u1, avec F = ∀ P · F1, alors par hypothèse de récurrence u1 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm, P:=G] est dans REDF1C′, et ce pour tout contexte de candidats C′, en particulier pour C′ de la forme C [P:=S]. Comme u1 [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm, P:=G] = (u1 [x1:=v1, …, xn:=vn, x:=v, P1:=G1, …, Pm:=Gm]) [P:=G] (en α-renommant P au besoin dans u), et comme S est arbitraire, par (++) u [x1:=v1, …, xn:=vn, P1:=G1, …, Pm:=Gm] est dans RED∀ P · F1C = REDFC.
Le théorème de normalisation forte des termes typés dans le système F2 se déduit de (♣) en prenant vi=xi pour tout i, 1≤ i≤ n, et m=0, en utilisant (CR3) pour justifier le choix des xi, et (CR1) pour conclure. ♦
Vu sous l’angle des langages de programmation, les règles (TAbs) et (TApp) offrent la notion de fonctions, et en général d’objets polymorphes. Prenons par exemple la fonction id =def λ P · λ x · x, de type ∀ P · P ⇒ P: c’est la fonction identité sur tout type P, au sens où id nat est la fonction identité sur les entiers, id real est la fonction identité sur les réels, etc. Il s’agit de polymorphisme paramétrique, le comportement de la fonction étant indépendant du type P passé en paramètre. (L’autre forme classique de polymorphisme est le polymorphisme ad hoc, où le corps de la fonction teste d’abord le type P; c’est la forme typique de polymorphisme présent dans les langages orientés objets.)
Le polymorphisme paramétrique est typiquement le polymorphisme présent dans le langage ML, en particulier en OCaml. Le polymorphisme est cependant restreint en ML: les seules quantifications universelles sont au sommet, pas à l’intérieur, des types. Formellement, appelons monotype tout type du système F2 dans lequel ∀ n’intervient pas (ce sont les types simples), et appelons polytype tout type de la forme ∀ α1, …, αn · F, où F est un monotype. Les types ML sont les polytypes. De plus, les jugements de typage en ML sont asymétriques, et sont de la forme x1 : F1, …, Fn ⊢ u : τ, où F1, …, Fn sont des polytypes et τ est un monotype. À cause de cette forme de jugement, la règle (∀ I) n’a aucun sens comme règle de typage, et la construction λ P · u non plus. La création de polytypes passe par la règle de généralisation (Gen) et la construction de programmes let…in:
où α1, …, αn sont les variables de types libres dans τ1 mais pas libres dans aucun polytype de Γ.
ML diffère aussi du système F2 par d’autres points. D’abord, le polymorphisme est implicite, comme dans le système F (exercice 40): lorsque x est de type ∀ α · F, on n’écrit pas x G pour obtenir une instance de x de type F [α:=G], mais simplement x. Formellement, la règle de typage des variables est:
Enfin ML est un langage de programmation réel, et inclut donc un certain nombre de constructions moins justifiables logiquement. Par exemple, ML possède les définitions par récursion générales (la construction let rec, codable à l’aide d’une constante Y : ∀ α · (α ⇒ α) ⇒ α — ou plutôt Y : ∀ α, β · ((α ⇒ β) ⇒ (α ⇒ β)) ⇒ (α ⇒ β)), des types de données récursifs (généralisant la définition des entiers de Peano construits sur 0 et S, notamment), des effets de bord, et OCaml a en plus les objets (polymorphisme ad hoc) et encore d’autres constructions.
|
|
Montrer que les règles de typage suivantes sont admissibles:
En déduire que le quantificateur existentiel du second ordre est définissable dans le système F2. Montrer qu’on a la règle de réduction:
|
Autrement dit, on se passe des constructions d’application à des types et d’abstraction sur les types. Noter que tout terme a alors en général une infinité de types, même dans un contexte Γ fixé. Montrer que la propriété d’auto-réduction est vérifiée pour la règle (β), mais pas pour la règle (η).
Le langage des termes de la logique intuitionniste d’ordre deux est le λ∇-calcul plus les constructions d’application et d’abstraction de prédicats:
Λ2 ::= V ∣ Λ2 Λ2 ∣ λ V · Λ2 ∣ ∇ Λ2 ∣ Λ2 T ∣ λ X · Λ2 ∣ Λ2 F ∣ λ Pn · Λ2 |
où T est l’ensemble des termes du premier ordre et F est celui des formules du second ordre. Les règles de preuve, c’est-à-dire de typage, sont (Ax), (⊥ E), (⇒ I), (⇒ E), (∀ I), (∀ E), (∀2 I) et (∀2 E). On normalise les preuves par les règles de réduction:
|
La propriété de normalisation forte des preuves de logique intuitionniste d’ordre deux est une conséquence directe de celle du système F2. En effet, définissons comme au théorème 4 une fonction qui efface tout ce qui est du premier ordre dans les formules et les λ∇-termes. Sur les formules:
|
Noter que P∈ Pn sur le côté gauche est vu comme variable 0-aire sur le côté droit. On traduit aussi ⊥ en ∀ P · P, cf. exercice 31. Sur les λ∇-termes, l’effacement est défini par:
|
On a:
Preuve : Remarquons d’abord que: (*) E (F′ [P (k1, …, kn) := G]) = E (F′) [P := E (G)]. C’est une récurrence structurelle facile sur F′. Ensuite, que: (**) si P n’est pas libre dans F′, alors P n’est pas libre dans E (F′). C’est encore une récurrence structurelle facile sur F′.
On démontre le lemme par récurrence structurelle sur la dérivation donnée de x1:F1, …, xm:Fm ⊢ u : F.
C’est évident si u est une variable xi, 1≤ i≤ n, si u est de la forme u′ v′, ou λ x · u′.
Si u est de la forme ∇ u′, alors par hypothèse de récurrence on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u′) : ∀ P · P, donc x1:E (F1), …, xm:E (Fm) ⊢ E (u) : E (F) par (TApp).
Si u est de la forme u′ t avec t un terme du premier ordre, alors par hypothèse de récurrence on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u′) : E (G), où G = ∀ i · F, donc x1:E (F1), …, xm:E (Fm) ⊢ E (u) : E (F), puisque E (u) = E (u′) et E (F) = E (G).
Si u est de la forme λ i · u′, alors par hypothèse de récurrence on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u′) : E (G), où F = ∀ i · G, donc x1:E (F1), …, xm:E (Fm) ⊢ E (u) : E (F), puisque E (u) = E (u′) et E (F) = E (G).
Si u est de la forme u′ G, alors par hypothèse de récurrence on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u′) : E (∀ P · F′), où F = F′ [P (k1, …, kn) := G]; on en déduit que x1:E (F1), …, xm:E (Fm) ⊢ E (u′) E (G) : E (F′) [P := E (G)]: par (*), E (F) = E (F′) [P := E (G)], donc on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u) : E (F).
Si u est de la forme λ P · u′, alors par hypothèse de récurrence on a dérivé x1:E (F1), …, xm:E (Fm) ⊢ E (u′) : E (F′), avec F = ∀ P · F′, où P n’est pas libre dans F1, …, Fm; par (**), on peut appliquer (TAbs) et inférer x1:E (F1), …, xm:E (Fm) ⊢ λ P · E (u′) : λ P · E (F′), c’est-à-dire x1:E (F1), …, xm:E (Fm) ⊢ E (u) : E (F). ♦
Preuve : Montrons d’abord que: (*) E (u′) [x:=E (v′)] = E (u′ [x:=v′]). Aussi, que: (**) E (u′) [P:=E (G)] = E (u′ [P (k1, …, kn) := G]) pour tout P ∈ Pn. Enfin, que: (***) E (u′ [i:=t]) = E (u′). Les trois sont par récurrence structurelle sur u′, (**) utilisant la propriété (*) démontrée au lemme 13 dans le cas où u′ est de la forme v′ G′, où G′ est une formule.
On démontre le lemme par récurrence sur la profondeur du rédex que l’on contracte dans u. Le seul cas intéressant est celui où u est lui-même le rédex. Or E ((λ x · u′) v′) = (λ x · E (u′)) E (v′) → E (u′) [x:=E (v′)] = E (u′ [x:=v′]) (par (*)), ce qui règle le cas de (β), E ((λ P · u′) G) = (λ P · E (u′)) E (G) → E (u′) [P:=E (G)] = E (u′ [P (k1, …, kn):=G]) (par (**)), ce qui règle le cas de (Beta), et E ((λ i · u′) t) = E (u′) = E (u′ [i:=t]) (par (***)). ♦
Preuve : Notons que si v → w par la règle (β1), alors la taille |Sk (v)| du squelette de v est strictement supérieure à celle |Sk (w)| du squelette de w. Définissons le squelette d’un terme par: Sk (x) =def x, Sk (u′v′) =def Sk (u′) Sk (v′), Sk (λ x · u′) =def λ x · Sk (u′), Sk (λ i · u′) =def λ i · Sk (u′), Sk (u′ t) =def Sk (u′), Sk (λ P · u′) =def λ P · Sk (u′), Sk (u′ G) =def Sk (u′) Sk (G), où le squelette de G est défini comme au théorème 4. La taille de Sk ((λ i · u′) t) = λ i · Sk (u′) est strictement supérieure à celle de Sk (u′ [i:=t]) = Sk (u′) (comme une récurrence structurelle facile sur u′ le montre).
Donc, si on mesure u par le couple (E (u), |Sk (u)|), et que l’on ordonne ces couples par l’ordre lexicographique des deux relations →+ et >, si v → w, alors la mesure de v est strictement supérieure à celle de w, en utilisant le lemme 14. L’ordre lexicographique étant bien fondé, le théorème est démontré.
Une preuve peut-être plus intuitive est la suivante. Supposons qu’il existe une réduction infinie partant de u: u = u0 → u1 → … → ui → …. En passant aux effacements, E (u0) →= E (u1) →= … →= E (ui) →= … par lemme 14, où →= dénote 0 ou une étape de réduction en F2. Par le théorème 7 il n’y a qu’un nombre fini de ces symboles →= qui sont des →, donc il existe un entier i tel qu’à partir de l’indice i on n’ait plus que des réductions par (β1). Mais il ne peut y avoir qu’un nombre fini consécutif de telles réductions, ce qui contredit le fait que la réduction considérée soit infinie. ♦
Preuve : Par le théorème 8, on peut se restreindre à considérer u normal. Prenons u de taille minimale parmi les termes normaux tels que ⊢ u : ⊥ soit dérivable; u est de la forme h u1 … un, où h est une variable ou le symbole ∇ (auquel cas n≥ 1), et u1, …, un sont des λ∇-termes, des termes du premier ordre ou des formules. Mais h ne peut pas être une variable, parce que le contexte à gauche de ⊢ est vide. Donc h est ∇, mais alors on a ⊢ u1 : ⊥, ce qui contredit la minimalité de la taille de u. ♦
et les règles de réduction ( CL) et (η C), que la logique classique du second ordre est cohérente.
On va montrer que HA2 est cohérent, par une extension de la technique utilisée pour HA1. La principale innovation est le traitement de la quantification du second ordre, qui sera traitée comme dans le système F2.
Preuve : Comme au lemme 12, on prouve que pour toute preuve π2 de Γ, x : F1, Δ ⊢ u : F2 et toute preuve π1 de Γ ⊢ v : F1, on peut construire une preuve π de Γ, Δ ⊢ u [x:=v] : F2 par récurrence structurelle sur π2. ♦
Preuve : On prouve plus généralement que pour toute preuve π de x1:F1, …, xm:Fm ⊢ u : F, on peut construire une preuve π de x1 : F1 [P (k1, …, kn):=G], …, xm : Fm [P (k1, …, kn):=G] ⊢ u [P (k1, …, kn):=G] : F [P (k1, …, kn):=G] par récurrence structurelle sur π. ♦
Nous considérons les règles de réduction suivantes, qui sont celles de HA1 plus (Beta). On ne considère pas (η) et (Eta), dont nous n’aurons pas besoin.
|
Preuve : Par rapport au théorème 5, le cas de la règle (β) est par le lemme 15, celui de la règle (β1) est comme au lemme 11, et celui de la règle (Beta) est par le lemme 16. Les autres cas sont comme au théorème 5. ♦
Preuve : Comme au théorème 6, notons que tout terme t du premier ordre termine. Appelons encore un λ∇ R-terme neutre s’il ne commence pas par λ ou ∇. Soit SN l’ensemble des λ∇ R-termes fortement normalisants. Un candidat de réductibilité est un ensemble S de λ∇ R-termes vérifiant les propriétés (CR1), (CR2) et (CR3) du théorème 7. Un contexte de candidats C est une fonction des variables de prédicats vers des candidats de réductibilité. On définit ensuite RED⊥C et REDs≈ tC comme étant SN, REDP (t1, …, tn)C est C (P), REDF ⇒ GC est l’ensemble des λ∇ R-termes u tels que pour tout v ∈ REDFC, uv ∈ REDGC, RED∀ i · FC est l’ensemble des λ∇ R-termes u tels que pour tous termes t du premier ordre (qui terminent), ut ∈ REDF [i:=t]C, et finalement RED∀ P · FC est l’ensemble des λ∇ R-termes u tels que pour toute formule G, pour tout candidat de réductibilité S, u G ∈ REDFC [P:=S]. Ceci est une définition de REDF par récurrence structurelle sur le squelette Sk (F) de F, qui est défini comme au théorème 4, étendu par Sk (∀ P · F) =def ∀ P · Sk (F).
Il est facile de vérifier que REDFC est un candidat de réductibilité pour tout contexte de candidats C et toute formule F, par récurrence structurelle sur Sk (F), que (*) si Q n’est pas libre dans G, alors REDGC = REDGC [Q:=S] pour tout candidat S (par récurrence sur Sk (G)), que (**) REDFC [P := REDGC] = REDF [P (k1, …, kn):=G]C (par récurrence sur Sk (F)), que (+) pour tout terme u1 tel que u1 [x:=v] ∈ REDF2C pour tout v∈ REDF1C, alors λ x· u1 ∈ REDF1 ⇒ F2C, et que (++) pour tout terme u1 tel que u1 [P (k1, …, kn):=G] ∈ REDF1C [P:=S] pour toute formule G et tout candidat S, alors λ P · u1 ∈ RED∀ P · F1C. C’est comme au théorème 7.
Comme au théorème 6, on montre que (∘) si v ∈ REDF [i:=0] et w ∈ RED∀ j · F[i:=j] ⇒ F[i:=S (j)], alors R v w t ∈ REDF [i:=t].
Les propriétés (*), (**), (+), (++) et (∘) nous permettent de démontrer:
d’où l’on déduit le théorème. ♦
Preuve : Exactement comme au corollaire 5. ♦
L’arithmétique du second ordre et le système F2 sont tellement proches qu’en fait les fonctions mathématiques de N vers N dont on peut démontrer qu’elles sont totales en arithmétique d’ordre deux sont exactement celles que l’on peut coder comme des λ-termes u de type N ⇒ N en système F2. C’est le théorème de Girard, dont on pourra trouver une démonstration au chapitre 15 de [GLT89]. Mais certaines fonctions n’ont que des implémentations inefficaces. L’exemple typique est le prédécesseur, dont l’implémentation la plus efficace en système F2 est celle de l’exercice 38, qui calcule le prédécesseur de n en temps linéaire en n. Une façon de corriger ce problème est d’ajouter à F2 un type de base N, plus deux constantes 0 : N et S : N ⇒ N, ainsi qu’un récurseur R : ∀ Q · Q ⇒ (N ⇒ Q ⇒ Q) ⇒ N ⇒ Q tel que R u v 0 → u et R u v (S w) → v w (R u v w) — essentiellement comme en HA2, sauf qu’en HA2 les entiers naturels sont codés comme des termes du premier ordre et non comme des λ-termes de type N. Le prédécesseur est alors R 0 (λ n, x · n).
Il n’y a aucune raison de s’arrêter à l’ordre deux, et l’on peut définir des systèmes logiques d’ordre 3, 4, …, ω. La logique et l’arithmétique à tous ordres est encore cohérente. Le but de cette section est d’une part d’indiquer comment le λ-calcul est utilisé ici pour définir non seulement les preuves mais les formules elles-mêmes, et d’autre part d’avertir le lecteur qui aurait l’impression que tous les systèmes logiques que l’on peut définir intuitivement sont cohérents, qu’il existe des systèmes logiques apparemment très proches des systèmes précédents mais qui sont incohérents.
Rappelons que nous avons formalisé l’arithmétique du premier ordre par un λ-calcul dont les types étaient des formules du premier ordre modulo quelques règles de calcul pour définir l’addition et la multiplication. La logique d’ordre supérieure est définie de façon similaire en choisissant comme langage des formules un λ-calcul simplement typé enrichi de quelques constantes représentant l’implication et la quantification universelle, modulo les règles de calcul définies par la βη-conversion.
Les types simples que l’on utilise sont:
T ::= B ∣ T → T |
où l’on note → ce que l’on notait ⇒ auparavant, et B est un ensemble de types dit de base, contenant au moins un type Prop, le type des formules, et un autre type ι, qui servira de type des termes. On pourrait considérer plusieurs types de termes, N, R, string, etc., mais pour simplifier nous ferons comme s’il n’y en avait qu’un.
Les expressions logiques sont les λ-termes typables. Ceux de type Prop sont appelés les formules, ceux de type ι sont appelés les termes. On considère deux constantes additionnelles servant à fabriquer les formules: pour chaque type τ, ∀τ de type (τ → Prop) → Prop, qui sert à former les quantifications universelles (∀ x : τ · F sera codé comme ∀τ(λ x · F)), et imp de type Prop → Prop → Prop, qui sert à former les implications (et on notera F ⇒ G au lieu de imp F G). Les symboles de prédicats n-aires seront représentés par des variables P de type ι → … → ι → Prop, où il y a n ι: si t1, …, tn sont n termes (de type ι, donc), P t1 … tn est la formule que nous notions P (t1, …, tn) en logique du premier ordre. Les symboles de fonctions n-aires sont représentés par des variables f de type ι → … → ι → ι, où il y a n+1 ι en tout: si t1, …, tn sont n termes, f t1 … tn sera donc aussi un terme, celui que nous notions f (t1, …, tn) en logique du premier ordre.
Les règles de typage des expressions logiques sont essentiellement celles du λ-calcul simplement typé, plus les règles de typage de ∀τ et imp:
La quantification d’ordre un est ∀ι. Notamment, ∀ x : ι · F est ce que nous notions ∀ i · F [x:=i] auparavant. La quantification d’ordre deux est ∀ι → … → ι → Prop: en somme, ∀ x : ι → … → ι → Prop · F, où il y a n ι, est ce que nous notions ∀ P · F [x:=P] avec P ∈ Pn en logique du second ordre.
La substitution du premier ordre est la substitution du λ-calcul, et la substitution du second ordre F [P (k1, …, kn) := G] est à βη-équivalence près la substitution F [P := λ k1, …, kn · G] du λ-calcul.
Dans un contexte de typage simple Γ, soient F1, …, Fn des formules (des expressions de type Prop dans Γ), alors x1 : F1, …, xn : Fn est un contexte pourvu que les xi soient des variables différentes deux à deux et en dehors du domaine de Γ. Alors que les contextes de typage seront typiquement notés Γ, les contextes seront typiquement notés Π. Les jugements de preuves seront de la forme Γ; Π ⊢ u : F, et leur dérivabilité signifiera que dans le contexte de typage Γ, Π est un contexte et F est une formule, et que de plus u est une preuve de F à partir des hypothèses F1, …, Fn présentes dans Π. Noter que les jugements de typage Γ ⊢ e : τ seront aussi utilisés, et sont des jugements du λ-calcul simplement typé avec les constantes ∀τ et imp. On définit la logique d’ordre supérieure par les règles:
Les règles (∀ E), (∀ I) traitent des quantifications d’ordre un, deux, et encore d’autres. Noter la ressemblance entre les règles sur l’implication et les règles sur la quantification universelle. Il se trouve que ce système est encore cohérent, et ceci peut se démontrer en gros comme pour la logique d’ordre deux, en passant par un système similaire au système F2 appelé Fω. Ce dernier a aussi été inventé par Jean-Yves Girard, mais le fait qu’il normalise fortement est plus compliqué que pour F2.
On peut concevoir des systèmes logiques encore plus expressifs. Utilisant l’égalité de Leibniz ≈ (voir exercice 44), on peut modéliser l’arithmétique HAω d’ordre supérieur par l’ajout de constantes 0 de type ι, S de type ι → ι, d’un récurseur R au niveau des preuves:
d’un récurseur au niveau des expressions:
et de termes de preuve vérifiant les règles:
Ce système, ainsi que sa version classique PAω, sont encore cohérents, pour des raisons similaires aux précédents, par des résultats de normalisation forte.
Si l’on ajoute à ce genre de systèmes des types dépendants à la LF, des types inductifs généralisant le type N des entiers naturels, plus quelques autres constructions logiques, on aboutit à des systèmes comme le calcul des constructions inductives, qui sert de fondement au système Coq [BBC+99], et dont le pouvoir expressif est essentiellement celui de la théorie des ensembles avec une infinité de cardinaux fortement inaccessibles [Wer97, Acz99].
Étendre petit à petit des systèmes logiques semble ainsi une activité anodine, qui produit facilement des logiques cohérentes de plus en plus puissantes. Pourtant, de nombreux mathématiciens célèbres ont été à l’origine de systèmes logiques incohérents, dont on pouvait pourtant croire qu’ils ne poseraient pas de problèmes de cohérence a priori.
L’un de ces premiers systèmes est (une partie de) la théorie naïve des ensembles. Dans ce système qui est une extension de la logique du premier ordre, on a pour tout formule F des termes de la forme {i ∣ F} dénotant l’ensemble des i vérifiant F, et dont l’ensemble des variables libres est celui de F moins i — c’est très proche de la notation λ i · F. On a aussi un symbole de prédicat binaire є dénotant l’appartenance, et deux règles de déduction nouvelles:
Preuve : Il s’agit du contre-exemple de Bertrand Russell. Considérons la formule F (i) =def ¬ (i є i) qui exprime que i ne s’appartient pas à lui-même, où ¬ G =def G ⇒ ⊥. Notons A le terme {i ∣ F (i)}. On a:
♦
En somme, toute formule est déductible dans cette théorie. Noter la ressemblance entre le terme (λ x · x (є2 x)) (λ x · є1 x x) et le terme (λ x · xx) (λ x · xx) qui boucle en λ-calcul pur. La ressemblance n’est pas complètement fortuite. Si on voulait démontrer que la théorie naïve des ensembles était cohérente comme nous l’avons fait jusqu’ici pour d’autres théories, nous essaierions de normaliser les preuves, et ceci se ferait naturellement en utilisant la règle є1 (є2 u) → u. Mais alors (λ x · x (є2 x)) (λ x · є1 x x) → (λ x · є1 x x) (є2 (λ x · є1 x x)) → є1 (є2 (λ x · є1 x x)) (є2 (λ x · є1 x x)) → (λ x · є1 x x) (є2 (λ x · є1 x x)), qui boucle. C’est heureux, car le système est justement incohérent.
En un sens, c’est parce que {i ∈ F} agit comme un λ i · F non typé. On peut éviter le problème en le typant par des types simples, et alors on obtiendra essentiellement la logique d’ordre supérieur.
On peut se demander si on ne pourrait pas enrichir le système de types des expressions logiques de la logique d’ordre supérieur, en remplaçant les types simples par les types du système F2, par exemple. On obtiendra ainsi le système U−. Définissons-le formellement. On note α, β, …, les variables de types, Π ce que nous notions ∀ en système F2, autrement dit les types sont:
T ::= B ∣ TVar ∣ T → T ∣ Π TVar · T |
où B est un ensemble de types de base et TVar dénote l’ensemble des variables de types. Mais, bien que cette extension du langage des formules ait l’air innocente, on a:
L’argument est élaboré et ne sera pas donné ici: voir [Coq94], qui donne aussi quelques intuitions et quelques applications.