Nous avons souvent parlé des versions classiques des systèmes logiques intuitionnistes que nous avons étudié: PA1 correspondant à HA1, PA2 à HA2, etc. Les systèmes intuitionnistes étaient plus faciles à étudier, notamment ils nécessitaient moins de règles de normalisation des preuves. Cependant, les systèmes classiques correspondants sont cohérents eux aussi, et de plus ils sont d’un usage beaucoup plus courant en mathématiques. On peut donc se demander quels sont les rapports précis entre les variantes intuitionnistes et classiques des systèmes logiques étudiés.
Une partie claire du rapport entre logiques intuitionnistes et classiques est que toute preuve intuitionniste est une preuve classique, mais qu’il existe des preuves classiques non intuitionnistes. Cependant, ceci n’entame en rien le pouvoir expressif des logiques intuitionnistes comparées à leurs variantes classiques. Ce résultat est dû à Kurt Gödel, mais les traductions que nous utiliserons se rapprochent davantage de traductions dues à Kolmogorov ou à Kuroda.
Commençons par la logique propositionnelle avec ⇒ et ⊥ comme connecteurs logiques. Pour toute formule F, on définit sa ¬¬-traduction F¬¬ comme suit:
|
Ceci peut se justifier comme suit: en logique classique, F ⇒ G est non F ou G, c’est-à-dire aussi ¬ (F ∧ ¬ G); or F ∧ ¬ G est équivalent à (F ⇒ ¬ G ⇒ ⊥) ⇒ ⊥ = ¬ (F ⇒ ¬ ¬ G). Ceci mène à l’idée que l’on peut définir F¬¬ en remplaçant récursivement tous les F ⇒ G par quelque chose ressemblant à ¬ ¬ (F ⇒ ¬ ¬ G).
Rappelons que ¬ F est défini comme F ⇒ ⊥. En particulier, ( ¬ F )¬¬ = ¬ ¬ (F∘⇒ ¬ ¬ ⊥).
Autrement dit, modulo l’ajout de suffisamment de doubles négations saupoudrées dans F, on obtient une formule qui signifie la même chose que F en classique et qui est prouvable en intuitionniste dès que F est prouvable en classique. Par exemple, ¬ ¬ A ⇒ A n’est pas prouvable en intuitionniste, mais ( ¬ ¬ A ⇒ A )¬¬ = ¬ ¬ (((A ⇒ ¬ ¬ ⊥) ⇒ ¬ ¬ ⊥) ⇒ ¬ ¬ A) l’est. (On notera au passage que cette traduction n’est pas particulièrement économe en négations. Il en existe des plus économes.)
Preuve : Il peut servir de s’exercer à construire quelques preuves intuitionnistes de base. D’abord, si u : G, alors u− =def λ k · ku est de type ¬ ¬ G. Ensuite, si u : ¬ ¬ ¬ G, alors u0 =def λ y · u (λ z · zy) est de type ¬ G. Et si u : ¬ ¬ (G ⇒ H) et v : ¬ ¬ G, alors u * v =def λ k · u (λ x · v (λ y · k (xy))) est de type ¬ ¬ H (où k : ¬ H, x : G ⇒ H, y : G).
L’équivalence entre F et F¬¬ en classique signifie qu’il existe un λ C-terme clos uF de type F ⇒ F¬¬ et un λ C-terme clos vF de type F¬¬ ⇒ F. On définit ces termes par récurrence structurelle sur F: pour tout type de base A, uA =def λ x · x−, vA =def λ x · C x; enfin uF ⇒ G =def λ x · λ k · k (λ y · uG (x (vF y−))) (où x : F ⇒ G, k : ¬ (F∘⇒ G¬¬), y : F∘); et vF ⇒ G =def λ x · λ y · vG (( x * uF y )0) (où x : ¬ ¬ (F∘⇒ G¬¬), y : F; ceci est bien défini car x * uF y est de type ¬ ¬ G¬¬ = ¬ ¬ ¬ (¬ G∘), donc ( x * uF y )0 est bien défini).
Si F¬¬ est prouvable en intuitionniste, autrement dit s’il existe un λ∇-terme clos u de type F¬¬, alors on peut considérer u comme un λ C-terme en posant ∇ v =def C (λ z · v) pour tout v, avec z non libre dans v. Donc vF u est un λ C-terme clos de type F: F est prouvable en classique.
Réciproquement, montrons que si F est prouvable en classique, alors F¬¬ est prouvable en intuitionniste. Pour ceci, considérons un λ C-terme u quelconque tel que ⊢ u : F, et construisons un λ∇-terme u′ tel que ⊢ u′ : F¬¬. Plus généralement, construisons par récurrence structurelle sur le λ C-terme u tel que x1 : F1, …, xn : Fn ⊢ u : F, un λ∇-terme u* tel que x1 : F1∘, …, xn : Fn∘⊢ u* : F¬¬. Comme F¬¬ = ¬ ¬ F∘, on va construire u* comme ⟨ u ⟩∘ k, où x1 : F1∘, …, xn : Fn∘, k : ¬ F∘⊢ ⟨ u ⟩∘ k : ⊥.
Si u est une variable, alors c’est un xi, 1≤ i≤ n, et on pose ⟨ u ⟩∘ k =def ku.
Si u est de la forme λ x · v de type G ⇒ H, alors par hypothèse de récurrence on a pu dériver x1 : F1∘, …, xn : Fn∘, x : G∘⊢ v* : H¬¬, donc ⟨ u ⟩∘ k =def k (λ x · v*) = k (λ x · λ k′ · ⟨ v ⟩∘ k) convient.
Si u est de la forme vw avec v de type G ⇒ H et w de type G, alors par hypothèse de récurrence dans le contexte x1 : F1∘, …, xn : Fn∘, v* est de type ¬ ¬ (G∘⇒ H¬¬) et w* est de type G¬¬ = ¬ ¬ G∘, donc u* peut être défini comme ( v* * w* )0. Plus explicitement, comme λ y · (λ k · v* (λ x · w* (λ y · k (xy)))) (λ z · zy), qui se réduit en λ k · v* (λ x · w* (λ y · xyk)) (à α-conversion près). On pose donc ⟨ u ⟩∘ k =def ⟨ v ⟩∘ (λ x · ⟨ w ⟩∘ (λ y · xyk)).
Si u est de la forme C v avec v de type ¬ ¬ F, alors par hypothèse de récurrence dans le contexte x1 : F1∘, …, xn : Fn∘, v* est de type ¬ ¬ ((F∘⇒ ¬ ¬ ⊥) ⇒ ¬ ¬ ⊥). Donc si k : ¬ F∘, v* (λ x · x (λ y, k′ · ky) (λ z · z)) est de type ⊥ (où x : (F∘⇒ ¬ ¬ ⊥) ⇒ ¬ ¬ ⊥, y : F∘, k′ : ¬ ⊥, z : ⊥). On pose donc ⟨ u ⟩∘ k =def ⟨ v ⟩∘ (λ x · x (λ y, k′ · ky) (λ z · z)).
♦
Le terme ⟨ u ⟩∘ k est défini par:
|
Les trois premières lignes sont connues comme la traduction par valeur de Plotkin [Plo76].
Dans cette définition, k est toujours d’un type de la forme ¬ F∘, et joue le rôle d’une continuation acceptant des valeurs de retour de type F∘. La traduction u ↦ u* = λ k · ⟨ u ⟩∘ k est ce qu’on appelle une traduction en style de passage de continuations (continuation-passing style ou CPS en anglais). Elle exprime en fait directement une sémantique par continuations (comparer avec la section 5.2 en partie I): pour évaluer une variable x dans une continuation k, on retourne (la valeur de) la variable par k; pour évaluer une abstraction λ x · u, on retourne par la continuation k la fonction qui prend (la valeur de) l’argument x et la continuation k′ qui sera courante au moment de l’application de l’abstraction à son argument, et qui retourne la valeur du corps u de l’abstraction dans la continuation k′; pour évaluer une application uv dans la continuation k, on évalue u dans une continuation qui récupère la valeur x de u, évalue ensuite v dans une continuation qui récupère la valeur y de v, enfin applique x à y et la continuation courante k; pour évaluer C u dans la continuation k, on évalue u dans la continuation qui récupère la valeur x de u: x est censée être une fonction prenant une continuation en argument, ici λ y, k′ · ky qui jette la continuation courante k′ pour renvoyer y par l’ancienne continuation courante k capturée par C; l’argument λ z · z est la continuation fournie à x, qui est triviale car l’application de x est obligé d’appliquer une autre continuation et ne retourne pas.
La traduction u, k ↦ ⟨ u ⟩∘ k a donc non seulement un sens logique (le plongement de la logique classique en logique intuitionniste), mais aussi un sens calculatoire. Les exercices suivants précisent cette remarque. (On pourra s’inspirer des résultats de la partie I.)
|
F* =def ¬ ¬ F• A•=def A (A type de base) ( F ⇒ G )•=def F* ⇒ G* |
|
On peut étendre ces ¬¬-traductions et les traductions en style par passage de continuations correspondantes à la logique et à l’arithmétique du premier ordre. La traduction par valeur F¬¬ s’étend ainsi comme suit (mais il y a de nombreuses autres possibilités) aux autres constructions de la logique du premier ordre:
|
et la traduction en style par passage de continuations u, k ↦ ⟨ u ⟩∘ k s’étend alors en:
|
pour le fragment conjonctif (∧), en:
|
pour le fragment disjonctif (∨), en:
|
pour la quantification universelle du premier ordre, en:
|
pour la quantification existentielle du premier ordre.
Désormais, nous considérerons les versions des logiques classique et intuitionniste, ainsi que des arithmétiques PA1 et HA1 qui incluent ∧, ∨, et ∃, obéissant aux règles de déduction (∧ I), (∧ E1), (∧ E2), (∨ I1), (∨ I2), (∨ E), (∃ I), (∃ E).
Pour passer à l’arithmétique, il nous faut étendre notre traduction en CPS pour traiter de r0 : 0 ≈ 0 et le récurseur:
|
Preuve : On a déjà la traduction en CPS, il suffit de vérifier qu’elle définit des objets des bons types. Dans le cas de r0, on doit vérifier que si k : ¬ (0 ≈ 0), alors k r0 : ⊥; c’est évident. Dans le cas du récurseur, dans la formule pour ⟨ R u v t ⟩∘ k ci-dessus, on a par hypothèse k : ¬ ( F [i:=t] )∘, et en supposant que x : ∀ j · ¬ ¬ (( F [i:=j] )∘⇒ ( F [i:=S (j)] )¬¬), que y : ( F [i:=j] )¬¬, que k″ : ¬ ( F [i:=S (j)] )∘, que x′ : ( F [i:=j] )∘⇒ ( F [i:=S (j)] )¬¬, que y′ : ( F [i:=j] )∘, on a: x′y′k″ est de type ⊥, donc λ y′ · x′y′k″ est de type ¬ ( F [i:=j] )∘, donc y (λ y′ · x′y′k″) est de type ⊥, donc λ x′ · y (λ y′ · x′y′k″) est de type ¬ (( F [i:=j] )∘⇒ ( F [i:=S (j)] )¬¬). Comme x j est de type ¬ ¬ (( F [i:=j] )∘⇒ ( F [i:=S (j)] )¬¬), x j (λ x′ · y (λ y′ · x′y′k″)) est de type ⊥, donc λ k″ · x j (λ x′ · y (λ y′ · x′y′k″)) est de type ¬ ¬ ( F [i:=S (j)] )∘= ( F [i:=S (j)] )¬¬ = F¬¬ [i:=S (j)]. (Une récurrence structurelle facile montre en effet que G¬¬ [i:=t] = ( G [i:=t] )¬¬.) Comme y est supposé de type ( F [i:=j] )¬¬ = F¬¬ [i:=j], le terme v′ =def λ j · λ y, k″ · x j (λ x′ · y (λ y′ · x′y′k″)) est de type ∀ j · F¬¬ [i:=j] ⇒ F¬¬ [i:=S (j)]. D’autre part le terme u′ =def λ k′ · ⟨ u ⟩∘ k′ est de type ( F [i:=0] )¬¬ = F¬¬ [i:=0]. Donc R u′ v′ t est de type F¬¬ [i:=t] = ( F [i:=t] )¬¬. Comme k : ¬ ( F [i:=t] )∘, R u′ v′ t k est de type ⊥, donc λ x · R u′ v′ t k est de type ¬ (∀ j · ¬ ¬ (( F [i:=j] )∘⇒ ( F [i:=S (j)] )¬¬)). On en déduit que ⟨ v ⟩∘ (λ x · R u′ v′ t k) est de type ⊥; or ⟨ v ⟩∘ (λ x · R u′ v′ t k) est exactement ⟨ R u v t ⟩∘ k. ♦
En arithmétique de Heyting, les formules atomiques (les types de base) sont des égalités s ≈ t. Il se trouve que ces égalités sont démontrables en PA1 si et seulement si elles le sont en HA1 — on n’a pas besoin de ¬¬-traduction. Une question naturelle est alors: quelles sont les formules de l’arithmétique qui sont prouvables en PA1 si et seulement si elles le sont en HA1 ? Georg Kreisel a montré dans les années soixante que les formules Π20 ont cette propriété, et sa démonstration a été simplifiée par la suite par Harvey Friedman [Fri78]. Les formules Π20 (prononcer: “pi zéro deux”) sont les formules de la forme ∀ i1, …, im · ∃ j1, …, jn · F, où F est sans quantificateur, ou du moins n’a que des instances bénignes des quantificateurs. En général:
On définit les classes de formules Δ00, Σn0 et Πn0 par récurrence sur n ≥ 0: Δ00 = Σ00 = Π00 est la classe des formules dont toutes les quantifications sont bornées. Σn+10 est la classe des formules de la forme ∃ i1, …, im · F avec m≥ 0, F ∈ Πn0; Πn+10 est la classe des formules de la forme ∀ i1, …, im · F avec m≥ 0, F ∈ Σn0.
Ces classes ainsi que leurs inclusions (sous formes de flèches) sont représentées en figure 1.
Nous allons établir au lemme 22 que toute formule Δ00 est décidable en HA1:
Notons que:
Preuve : Soit F une formule décidable, et soit u un λ∇ R-terme clos de type F ∨ ¬ F. Alors clF (u) =def λ x · case u {
ι1 x1 ↦ x1 |
ι2 x2 ↦ ∇ (xx2) |
} est une preuve de ¬¬ F ⇒ F. ♦
Preuve : On démontre ∀ i · i ≈ t ∨ ¬ i ≈ t par récurrence sur t, puis sur i. Définissons:
|
Pour aider à vérifier les types annoncés, vérifier que dans la définition de e(j), xj′ est de type j′ ≈ j ∨ ¬ j′ ≈ j, donc aussi S (j′) ≈ S (j) ∨ ¬ S (j′) ≈ S (j). Le terme us est la preuve souhaitée de s≈ t ∨ ¬ s ≈ t. ♦
Preuve : () Par récurrence structurelle sur Sk (F), on construit un terme dF de type F ∨ ¬ F.
Si F est une égalité s ≈ t, alors on définit ds≈ t comme étant le terme us de la preuve du lemme 21.
Si F = ⊥, alors d⊥=def ι2 (λ x · x).
Dans les cas des connecteurs ⇒, ∧, ∨, l’idée est de décrire leurs tables de vérité. Par exemple, on G1 ⇒ G2 est décidable pour la raison suivante: comme G1 est décidable par hypothèse de récurrence, G1 est soit vrai soit faux, de même G2 est soit vrai soit faux; mais si G1 est vrai et G2 faux, alors G1 ⇒ G2 est faux, et G1 ⇒ G2 est vrai dans les trois autres cas. Formellement:
|
Les cas des quantifications bornées F sont plus difficiles. L’idée est que F ne quantifiant que sur les entiers de 0 à t, on peut prouver F par récurrence, en énumérant tous les entiers de 0 à t. Définissons d’abord quelques termes de preuve auxiliaires démontrant quelques évidences dont nous aurons besoin (on note G (i) une formule quelconque et G (t) la formule G (i) [i:=t] pour plus de clarté). Rappelons (exercice 27) qu’il existe en HA1 un terme de preuve repk · H(k) pour toute formule H (k), de type ∀ i, j · i ≈ j ⇒ H (i) ⇒ H (j).
|
Lorsque F = ∀ i ≤ t · G(i), on démontre que F est décidable par récurrence sur t. Le cas de base est démontré par le terme u1:
|
Le cas inductif demande à montrer que, sous l’hypothèse h : (∀ i ≤ j · G(i)) ∨ ¬ (∀ i ≤ j · G(i)), on a (∀ i ≤ S (j) · G(i)) ∨ ¬ (∀ i ≤ S (j) · G(i)). On considère deux cas. Dans le cas h1 : ∀ i ≤ j · G(i), ceci est montré par le terme u2 (j) ci-dessous:
|
Dans le cas h2 : ¬ ∀ i ≤ j · G(i), ceci est montré par le terme u3 (j) ci-dessous:
|
On pose donc:
|
Lorsque F = ∃ i ≤ t · G, avec i non libre dans t, on construit:
|
Sous l’hypothèse h1 : ∃ i ≤ j · G(i), on a:
|
Sous l’hypothèse h2 : ¬ ∃ i ≤ j · G (i), on a:
|
Donc on pose:
|
♦
Preuve : Notons d’abord que, pour toute formule G dans Δ00, si dG est le terme de type G ∨ ¬ G construit au lemme 22, alors cG =def clG (dG) (cf. lemme 20) est de type ¬¬ G ⇒ G. On démontre ensuite que F et F¬¬ sont équivalentes en HA1, comme au lemme 18 mais en utilisant le terme cG à la place de C. Nous devons cependant étendre le résultat aux constructions ∧, ∨, ∃. Pour ceci, nous allons construire par récurrence structurelle sur F des termes clos uF∘ : F ⇒ F∘ et vF : F¬¬ ⇒ F. Comme d’autre part wF =def λ x, k · kx : F∘⇒ F¬¬, ceci suffira pour démontrer le lemme.
En convenant du fait que A dénote n’importe quelle égalité ou ⊥, on définit (par exemple, il y a de nombreux autres choix possibles):
|
♦
Preuve : Observons que si on peut prouver G∘⇒ G, alors on peut prouver ( ∃ i · G )∘⇒ ∃ i · G. En effet, si u : G∘⇒ G, alors λ x · case x {ι i y ↦ ι i (uy)} est de type ( ∃ i · G )∘⇒ ∃ i · G. Le lemme se déduit ainsi de cette remarque et du lemme 23 par récurrence sur le nombre de quantificateurs ∃ au début de F. ♦
Mais on ne peut pas prouver en général F¬¬ ⇒ F, car F∘ n’est pas décidable en général lorsque F est une formule Σ10 — ce qui revient à dire que F elle-même n’est pas en général décidable. Nous ne développerons pas l’argument ici, qui fait appel à la théorie des fonctions calculables.
On peut en fait aller un peu plus loin. L’astuce de Friedman est de modifier la ¬¬-traduction en observant que le type ⊥ dans F¬¬ = ¬ ¬ F∘= (F∘⇒ ⊥) ⇒ ⊥ (deux occurrences de ⊥ dans cette dernière formule) pourrait être remplacé par n’importe quelle formule: rien n’oblige à utiliser ⊥ ici. Du point de vue de la traduction en CPS, le type ⊥ est utilisé comme type des réponses fournies par le programme traduit en CPS (cf. le domaine Ans de la partie I). Or on peut utiliser le type de réponses que l’on souhaite, pas seulement ⊥.
La A-traduction de Friedman est ainsi l’analogue de la ¬¬-traduction, mais avec ⊥ remplacé par une formule quelconque φ (que Friedman notait A, d’où le nom de A-traduction). Noter ¬φF =def F ⇒ φ pour rappeler la négation, et redéfinissons la ¬¬-traduction relativisée à φ par:
|
et la traduction en CPS correspondante est:
|
La version relativisée du lemme 22 est:
Preuve : Par le lemme 22, dF est un terme clos de type F ∨ ¬ F, donc φdF =def case dF {
ι1 x1 ↦ ι1 x1 |
ι2 x2 ↦ ι2 (λ y · ∇ (x2 y)) |
} est un terme clos de type F ∨ ¬φF. ♦
De même, on relativise le lemme 20:
Preuve : Soit u un terme clos de type F ∨ ¬φF. Alors φclF (u) =def λ x · case u {
ι1 x1 ↦ ι1 x1 |
ι2 x2 ↦ ι2 (xx2) |
} est de type ¬φ¬φF ⇒ F ∨ φ. ♦
On peut alors démontrer la version relativisée du lemme 23 — c’est le lemme 28 plus bas —, mais ceci demande de nombreuses preuves auxiliaires:
Preuve : En reprenant les termes de preuve fabriqués dans la preuve du lemme 22, et en écrivant F(i) à la place de F, posons:
|
♦
Preuve : Pour toute formule G dans Δ00, notons φcG =def φclG (φdG) de type ¬φ¬φG ⇒ G ∨ φ, où φclG est défini au lemme 26 et φdG est défini au lemme 25. Construisons par récurrence structurelle sur F des termes clos φuF∘ : F ∨ φ ⇒ φF∘ et vF : φF¬¬ ⇒ F ∨ φ. Le lemme se déduira de ces termes, et du terme φwF =def λ x, k · kx : φF∘⇒ φF¬¬.
Si k : ¬φF et u : F ∨ φ, on pose [k] u =def case u {
ι1 x1 ↦ kx1 |
ι2 x2 ↦ x2 |
} de type φ.
Ensuite, pour tout opérateur f (π1, π2, ι1, ι2) tel que fu : G dès que u:F on pose φf v =def case v {
ι1 x1 ↦ ι1 (fx1) |
ι2 x2 ↦ ι2 x2 |
}: dès que v:F ∨ φ, φf v est de type G ∨ φ. De même, on pose φ⟨ u, v ⟩ =def case u {
| ||||||||||
ι2 x2 ↦ ι2 x2 |
} de type (F ∧ G) ∨ φ dès que u : F ∨ φ et v : G ∨ φ.
Si v1 : F ∨ φ ⇒ H et v2 : G ∨ φ ⇒ H, et u : (F ∨ G) ∨ φ, on pose φcase u {
v1 |
v2 |
} le terme case u {
| ||||||||||
ι2 x2 ↦ ι2 x2 |
} de type H.
Soit A n’importe quelle égalité ou ⊥, on définit:
|
♦
Si F est une formule Σ10 prouvable en PA1, par l’exercice 60 φF¬¬ = ¬φ¬φφF∘ est prouvable en HA1, par une preuve λ k · ⟨ u ⟩φ k. Ceci est vrai pour tout φ, en particulier pour φ = F. Donc (φF∘⇒ F) ⇒ F est prouvable en PA1 pour φ = F. Mais par le lemme 28, il existe un terme de preuve en HA1 de φF∘⇒ F, à savoir la continuation kF =def λ x · case φvF (λ k · kx) {
ι1 x1 ↦ x1 |
ι2 x2 ↦ x2 |
}. Donc ⟨ u ⟩φ kF est une preuve de F en PA1. On en déduit:
Preuve : Écrivons F =def ∀ i1, …, im · G où G est une formule Σ10. En utilisant (∀ E), si F est prouvable en PA1, alors G aussi. Comme G est Σ10, G est prouvable en HA1 par la remarque ci-dessus. En utilisant (∀ I), on en déduit que F est elle aussi prouvable en HA1. ♦
Il se trouve que ce résultat ne peut pas être étendu au-delà de Π20, et il existe des formules Σ20 prouvables en PA1 mais pas en HA1. Ceci sort cependant du cadre de ce cours.
La signification calculatoire de ce résultat, qui est contenue dans le cas où F est Σ10, est qu’on peut toujours extraire d’une preuve classique u de F une preuve intuitionniste ⟨ u ⟩φ kF de F, en calculant la traduction en CPS de u et en l’appliquant à une continuation kF bien choisie.
Une application informatique est la suivante. Considérons pour simplifier une formule de la forme ∀ i · ∃ j · P (i, j) sans variable libre. Une preuve intuitionniste d’une telle formule, écrite en forme normale, décrit nécessairement pour tout i une valeur de j tel que P (i, j) soit vrai. Autrement dit, une formule de cette forme est une spécification d’une fonction qui envoie tout entier i vers un entier j tel que P (i, j). Prouver ∀ i · ∃ j · P (i, j) en HA1, c’est donc essentiellement trouver une fonction de i vers j satisfaisant la spécification. En effet, considérons un terme de preuve normal u tel que ⊢ u : ∀ i · ∃ j · P (i, j). Pour tout entier m, posons [m] le terme S (S (… (S (0)) … )), où il y a m symboles S. Alors on a ⊢ u [m] : ∃ j · P ([m], j). Soit v une forme normale de u [m] (par une stratégie de réduction donnée, disons; en fait, la réduction de preuves en HA1 est confluente, et il n’y a donc qu’une forme normale). Alors v est tel que ⊢ v : ∃ j · P ([m], j). Comme v est normal et clos, v ne peut qu’être de la forme ι t w, pour un certain terme clos normal t et un certain terme de preuve w. Or un terme clos normal t est nécessairement de la forme [n] pour un certain entier n; et w est une preuve de P ([m], [n]): la preuve u définit donc bien une fonction totale des m vers les n tels que P ([m], [n]) soit vraie. De plus, cette fonction est calculable: il existe un programme informatique qui calcule n en fonction de m; en effet, il suffit de construire u [m], de normaliser et d’extraire [n] de la forme normale. On dit que HA1 est une logique constructive, car d’une preuve d’une spécification de la forme ∀ i · ∃ j · P (i, j) on peut toujours extraire un programme qui calcule j en fonction de i. (Attention, le terme “constructif” a de nombreux autres sens.)
En revanche, si ∀ i · ∃ j · P (i, j) est prouvable en PA1, l’argument ci-dessus ne fonctionne pas: le terme v de type ∃ j · P ([m], j) peut être de la forme ι t w comme ci-dessus, ou bien de la forme C v′; dans ce dernier cas, on ne peut pas extraire de v une valeur de v telle que P ([m], j) soit prouvable. La fonction qui aux i associe des j tels que P (i, j) est donc en général partielle dans le cas de PA1, alors que HA1 permet de produire une fonction totale. Ce que le théorème 12 montrer ici est que lorsque ∀ i · ∃ j · P (i, j) est Π20, autrement dit quand P (i, j) est décidable, alors il y a toujours moyen de transformer cette fonction partielle en une fonction totale calculable qui satisfait la propriété P (i, j): PA1 est donc aussi une logique constructive, si on la restreint aux formules Π20.
On notera que le programme extrait de la preuve est automatiquement correct, au sens où il calcule nécessairement ce que la spécification P (i, j) prescrit. De plus, on n’a pas eu à l’écrire, il suffit de l’extraire de la preuve. Cette idée s’étend naturellement — dans un cadre intuitionniste — à l’utilitaire d’extraction de programme à partir d’une preuve dans Coq [BBC+99].
PA1 et HA1 sont expressives; notamment on peut définir toute fonction calculable en PA1 [Joh87], mais c’est difficile et peu naturel à montrer. On peut améliorer ceci en enrichissant le langage de calcul à l’intérieur des formules. L’exercice suivant donne un exemple. De nombreuses autres solutions sont envisageables, et l’on peut (presque) utiliser le langage de programmation que l’on souhaite à l’intérieur des formules.
|
Il existe de nombreux autres outils que l’on peut utiliser pour analyser les systèmes de preuve; consulter [Koh98] pour plus de détails.