Previous Up Next

2  Logique classique et continuations

Comme ¬¬ FF n’est pas prouvable en NJf, il est tentant d’ajouter une règle de déduction permettant de le prouver. Cette règle correspondra à un nouveau terme à ajouter au λ-calcul. Nous obtiendrons alors un système de démonstration pour la logique classique.

En fait, nous connaissons déjà le nouveau terme à ajouter ! Il s’agit de l’opérateur C de Felleisen [FFKD87], comme l’a découvert Griffin [Gri90]. Raisonnons en effet intuitivement, au niveau des types: C prend une fonction f en argument, et cette fonction prend une continuation k en argument. Une continuation est juste une fonction de type F ⇒ ⊥, où F est le type de la valeur V à retourner, puisque k V ne retourne pas (donc k V est de type ⊥). La fonction f elle-même ne retourne pas non plus, puisque f k est censée toujours appeler une continuation, k ou autre, pour retourner son résultat; donc f est de type (F ⇒ ⊥) ⇒ ⊥ = ¬ ¬ F. Et le résultat de C f est de type F, le type de la valeur passée à la continuation. En somme, C est de type ¬ ¬ FF, pour tout F.

Pour des raisons esthétiques, on va préférer considérer que C n’est pas une constante, mais un opérateur unaire du langage, tel que si u : ¬ ¬ F alors C u : F. Une fois qu’on a C, la construction ∇ n’est plus nécessaire: il suffit de poser ∇ u = Cz · u), où z n’est pas libre dans u. (On notera que ∇ est essentiellement l’opérateur “abort” A de [FFKD87].) En effet, on a la dérivation:

où la première ligne est obtenue par affaiblissement du typage donné Γ ⊢ u : ⊥ de u.

On obtient le système de déduction naturelle ND suivant pour la logique classique implicationnelle:

Ce système de déduction n’offre plus la symétrie entre règles d’introduction et d’élimination de NJm, NJf et NJi. Ceci est réparé par le λµ-calcul de Michel Parigot [Par92], que nous ne présenterons cependant pas ici.

En attendant, la syntaxe du λ C-calcul est:

  Λc ::=  V ∣ Λc Λc ∣ λ  V · Λc ∣  C Λc

et ses règles de réduction sont:

  
    (β)(λ x · uvu [x:=v
    ( CL) C u v C (λ k · u (λ f · k (f v))) 
    (η C) C (λ k · k u)u      (kfv(u))

On a laissé de côté la règle ( CR), à savoir V ( C u) → Ck · ux · k (V x))) lorsque V est une P-valeur, car elle est inutile logiquement.

Exercice 17   Montrer le théorème d’auto-réduction pour λ C.
Théorème 3   Le λ C-calcul simplement typé est fortement normalisant.

Preuve : Même preuve que pour le théorème 1, en considérant que ⊥ est un type de base, et que les termes neutres sont tous ceux qui ne commencent ni par λ ni par C; la seule différence est qu’il faut vérifier que si uRED¬ ¬ F, alors C uREDF pour tout type F. C’est, comme au théorème 2, par récurrence structurelle sur F.

Si F est un type de base, c’est par récurrence sur ν (u). En effet, C u est dans REDF si et seulement si uSN. Soit R une réduction partant de C u. Si R commence par une réduction dans u, i.e. uu′, alors u′ ∈ SN par hypothèse de récurrence, donc R est finie. Si R commence par une réduction au sommet, alors la seule règle possible était (η C), donc u est de la forme λ k · k u′, k non libre dans u′. Dans ce cas, rappelons que uRED¬¬ F, donc uSN par (CR1), donc u′ ∈ SN, d’où R est finie de nouveau. R étant quelconque, C u est dans SN, donc dans REDF.

Si F est de la forme F1F2, montrons que C u vREDF2 pour tout vREDF1. Notons d’abord que, par hypothèse de récurrence: (*) pour tout wRED¬ ¬ F2, C wREDF2. Notons aussi que C u v est neutre. Montrons alors par récurrence sur ν (u) + ν (v) que C u vREDF2, en utilisant (CR3). Le terme C u v peut se réduire en une étape soit vers (1) C uv avec uu′ (qui est donc dans REDF2 par hypothèse de récurrence), soit vers (2) C u v′ avec vv′ (même argument), soit vers (3) uv par (η C) (avec u = λ k′ · ku′, k′ non libre dans u′), soit vers (4) Ck · uf · k (f v))).

Dans le cas (4), on a le raisonnement suivant. Rappelons que: (**) si a [x:=b] ∈ REDG2 pour tout bREDG1, alors λ x · aREDG1G2. C’était le lemme 6, qui se démontre comme nous l’avons fait au cours de la preuve du théorème 1. Supposons que sRED¬ F2 et tREDF1F2 sont des termes arbitraires, s dénotant une valeur possible de k et t une de f:

  1. vREDF1 par hypothèse;
  2. donc tvREDF2, par définition de la réductibilité;
  3. donc s (tv) ∈ RED, par définition de la réductibilité;
  4. t étant arbitraire, λ f · s (f v) ∈ RED¬ (F1F2), par (**);
  5. donc uf · s (f v)) ∈ RED, par définition de la réductibilité;
  6. s étant arbitraire, λ k · uf · k (f v)) ∈ RED¬ ¬ F2, par (**);
  7. donc Ck · uf · k (f v))) ∈ REDF2, par (*).

Dans le cas (3) montrons d’abord que: (***) si λ k′ · ku′ ∈ RED¬ ¬ F et k′ n’est pas libre dans u′, alors u′ ∈ REDF. Ceci se démontre par récurrence structurelle sur F. Si F est un type de base, alors par (CR1) λ k′ · ku′ ∈ SN, donc u′ ∈ SN = REDF. Si F est de la forme F1F2, soit vREDF1 quelconque, et considérons le terme λ k″ · (λ k′ · ku′) (λ x · k″ (xv)). Ce terme est dans RED¬ ¬ F2, en effet, pour tout sRED¬ F2 (valeur de k″), pour tout tREDF (valeur de x):

  1. tvREDF2 par définition;
  2. donc s (tv) ∈ RED par définition;
  3. t étant arbitraire, par (**) λ x · s (xv) ∈ RED¬ F;
  4. puisque par hypothèse λ k′ · ku′ ∈ RED¬ ¬ F, (λ k′ · ku′) (λ x · s (xv)) ∈ RED;
  5. s étant arbitraire, λ k″ · (λ k′ · ku′) (λ x · k″ (xv)) ∈ RED¬ ¬ F2.

Mais ce terme se réduit en λ k″ · k″ (uv), qui est dans RED¬ ¬ F2 aussi, par (CR2). Par hypothèse de récurrence, on en conclut uvREDF2. Comme v est arbitraire, u′ ∈ REDF. On a donc démontré (***). On traite maintenant le cas (3) en remarquant que si u = λ k′ · ku′ ∈ RED¬ ¬ F, alors u′ ∈ REDF par (***), donc le réduit uv du cas (3) est dans REDF2.

En somme, tous les réduits en une étape de C u v sont dans REDF2. Par (CR3), C u v est donc dans REDF2, et comme v est arbitraire, C uREDF1F2.

Le reste de la démonstration consiste à redémontrer le lemme 7, comme lors de la démonstration du théorème 1, par récurrence structurelle sur les termes.     ♦

Exercice 18 ()   Pourquoi la preuve de normalisation forte de λ C plus la règle:
    
      ( CR)V ( C u) C (λ k · u (λ x · k (V x))) 
    
V est une P-valeur, est-elle plus difficile ?
Exercice 19   Montrer que les formes normales en λ C sont de la forme λ x1, …, xm · h u1un, où u1, …, un sont normaux, où h est soit une variable soit le symbole C, et que dans ce dernier cas n=1.

En déduire une procédure de recherche automatique de preuve pour la logique classique, en généralisant les règles (→+I) et (BC).

Exercice 20   En utilisant les exercices 12 et 19, montrer qu’on peut encore restreindre l’usage de la règle (→+ I) dans la procédure de l’exercice 19 au cas où F est un type de base, comme dans l’exercice 12. À quoi sert la règle C) dans ce cadre ?
Exercice 21   En logique classique, on peut définir le “et” par: F1F2 =def (F1F2 ⇒ ⊥) ⇒ ⊥. Vérifier cette identité sur les tables de vérité des deux côtés. On pose alors:
    
      ⟨ uv ⟩=defλ k · k u v 
      π1 u=def C (λ k · u (λ xy · k x)) 
      π2 u=def C (λ k · u (λ xy · k y)) 
    
Montrer que ce codage définit bien les paires et les deux projections, au sens où les règles de typage (∧ I), (∧ E1) et (∧ E2) sont vérifiées, et où on a les réductions:
    
      π1 ⟨ uv ⟩+u 
      π2 ⟨ uv ⟩+v 
    
Comparer ce résultat avec l’exercice 5.
Exercice 22   En logique classique, on peut définir le “ou” par: F1F2 =def ¬ F1 ⇒ ¬ F2 ⇒ ⊥. Montrer que l’on peut définir ι1, ι2 et la construction case par:
    
      ι1 u=defλ k1k2 · k1 u 
      ι2 u=defλ k1k2 · k2 u 
      case u 

      ι1 x1 ↦ v1 
ι2 x2 ↦ v2


=def C (λ k · u (λ x1 · k v1) (λ x2 · k v2))
k, k1, k2 sont des variables fraîches. Montrer que ce codage définit bien les deux injections et l’analyse de cas, au sens où les règles de typage (∨ I1), (∨ I2) et (∨ E) sont vérifiées, et où on a les réductions:
    
      case ι1 u 

      ι1 x1 ↦ v1 
ι2 x2 ↦ v2


+v1 [x1:=u
      case ι2 u 

      ι1 x1 ↦ v1 
ι2 x2 ↦ v2


+v2 [x2:=u
    
Montrer par contre que la conversion commutative:
    
      case 


case u 

      ι1 x1 ↦ v1 
ι2 x2 ↦ v2




 

      ι1 y1 ↦ w1 
ι2 y2 ↦ w2


=λ C
      case u 





      
ι1 x1 ↦ case v1 

      ι1 y1 ↦ w1 
ι2 y2 ↦ w2


 
ι2 x2 ↦ case v2 

      ι1 y1 ↦ w1 
ι2 y2 ↦ w2








n’est pas démontrable. (On admettra que le λ C-calcul est confluent.)

Previous Up Next