Curry-Howard et programmes à partir de preuves non constructives


29

Ceci est une question de suivi

Quelle est la différence entre les preuves et les programmes (ou entre les propositions et les types)?

Quel programme correspondrait à une preuve non constructive (classique) de la forme k T(e,k)¬k T(e,k) ? (Supposons que T soit une relation décidable intéressante, par exemple, e -th TM ne s'arrête pas en k étapes.)

(ps: je poste cette question en partie parce que je suis intéressé à en savoir plus sur ce que Neel entend par " la traduction Godel-Gentzen est une transformation qui passe par la suite" dans son commentaire .)


2
Réponse partielle à la page 2 de ces notes de cours . C'est un peu cryptique; Je vais essayer de déterrer quelque chose de plus complet.
Dave Clarke

Cela me prend un peu plus de temps que prévu pour écrire ma réponse, car j'ai fait l'erreur de décider de prouver les choses que je savais plutôt que de simplement les affirmer. :)
Neel Krishnaswami

1
Le JSL le plus récent avait cet article . L'essentiel est que le contenu informatique des preuves classiques peut dépendre fortement de la façon dont vous avez choisi de l'extraire. Je ne l'ai pas encore vraiment digéré, mais je pensais le jeter là-bas.
Mark Reitblatt

Mais vous avez précisé que T est une relation décidable , il s'ensuit donc qu'il existe des preuves constructives de votre proposition. La logique classique est un sous-ensemble de la logique intuitionniste et vous avez spécifié que T appartient à ce sous-ensemble en l'appelant décidable.
wren romano

roitelet, c'est ce que je pensais au début aussi! Mais la proposition P dans l'exemple P \ / ~ P de la question est réellement quantifiée sur tout k, et cette quantification de T n'est pas nécessairement décidable.
jbapple

Réponses:


25

C'est une question intéressante. Évidemment, on ne peut pas s'attendre à avoir un programme qui décide pour chaque si k T ( e , k ) est valable ou non, car cela déciderait du problème de l'arrêt. Comme déjà mentionné, il existe plusieurs façons d'interpréter les preuves par calcul: extensions de Curry-Howard, réalisabilité, dialectique, etc. Mais ils interpréteraient tous plus ou moins le théorème que vous avez mentionné de la manière suivante.ekT(e,k)

Pour plus de simplicité, considérons le théorème classique équivalent

(1) jej(¬T(e,j)¬T(e,je))

C'est (constructivement) équivalent à celui mentionné car étant donné nous pouvons décider si k T ( e , k ) est vrai ou non en vérifiant simplement la valeur de ¬ T ( e , i ) . Si ¬ T ( e , i ) est vrai, alors i ¬ T ( e , i ) et donc ¬ i T ( e , i ) . Si d'autre partjekT(e,k)¬T(e,je)¬T(e,je)je¬T(e,je)¬jeT(e,je) ne tient pas alors par (1) on aj ( ¬ T ( e , j ) ) ce qui impliquej T ( e , j ) .¬T(e,je)j(¬T(e,j))jT(e,j)

Maintenant, encore une fois, nous ne pouvons pas calculer dans (1) pour chaque e donné, car nous résoudrions à nouveau le problème de l'arrêt. Ce que toutes les interprétations mentionnées ci-dessus feraient, c'est d'examiner le théorème équivalentjee

(2) Fje(¬T(e,F(je))¬T(e,je))

La fonction est appelée fonction Herbrand. Il essaie de calculer un contre-exemple j pour chaque témoin potentiel donné i . Il est clair que (1) et (2) sont équivalents. De gauche à droite, c'est constructif, il suffit de prendre i = i dans (2), où i est le témoin supposé de (1). De droite à gauche, il faut raisonner classiquement. Supposons que (1) n'était pas vrai. Ensuite,Fjjei=ii

(3) ij¬(¬T(e,j)¬T(e,i))

Soit une fonction qui en est témoin, ief

(4) i¬(¬T(e,f(i))¬T(e,i))

Maintenant, prenons dans (2) et nous avons ( ¬ T ( e , f ( i ) ) ¬ T ( e , i ) ) , pour certains i . Mais en prenant i = i dans (4) on obtient la négation de cela, contradiction. Par conséquent, (2) implique (1).f=f(¬T(e,f(i))¬T(e,i))ii=i

Donc, nous avons que (1) et (2) sont classiquement équivalents. Mais la chose intéressante est que (2) a maintenant un témoin constructif très simple. Prenez simplement si T ( e , f ( 0 ) ) ne tient pas, car alors la conclusion de (2) est vraie; ou bien prendre i = 0 si T ( e , f ( 0 ) ) est vrai, car alors ¬ T ( e , f ( 0 )i=f(0)T(e,f(0))i=0T(e,f(0)) ne tient pas et la prémisse de (2) est fausse, ce qui le rend à nouveau vrai.¬T(e,f(0))

Par conséquent, la façon d'interpréter par calcul un théorème classique comme (1) est de regarder une formulation (classiquement) équivalente qui peut être prouvée de manière constructive, dans notre cas (2).

Les différentes interprétations mentionnées ci-dessus ne divergent que sur la façon dont la fonction apparaît. Dans le cas de la réalisabilité et de l'interprétation dialectique, cela est explicitement donné par l'interprétation, lorsqu'elle est combinée avec une certaine forme de traduction négative (comme celle de Goedel-Gentzen). Dans le cas des extensions Curry-Howard avec les opérateurs call-cc et continuation, la fonction f découle du fait que le programme est autorisé à "savoir" comment une certaine valeur (dans notre cas i ) sera utilisée, donc f est la continuation du programme autour du point où i est calculé.ffifi

Un autre point important est que vous voulez que le passage de (1) à (2) soit "modulaire", c'est-à-dire si (1) est utilisé pour prouver (1 '), alors son interprétation (2) doit être utilisée de la même manière pour prouver l'interprétation de (1 '), disons (2'). Toutes les interprétations mentionnées ci-dessus le font, y compris la traduction négative de Goedel-Gentzen.


8
Bienvenue! C'est formidable de voir un théoricien expert de la preuve ici.
Neel Krishnaswami

1
Merci Paulo, votre réponse a clarifié une partie de l'image dans un problème connexe sur lequel je travaille.
Kaveh

17

Il est assez bien connu que l'arithmétique classique et intuitionniste est équiconsistante.

Une façon de le montrer est via les «plongements négatifs» de la logique classique dans la logique intuitionniste. Supposons donc que sont des formules d'arithmétique classique du premier ordre. Maintenant, nous pouvons définir une formule de logique intuitionniste comme suit:ϕ

G()=¬¬G(ϕψ)=¬¬(G(ϕ)G(ψ))G()=¬G(¬ϕ)=¬G(ϕ)G(ϕψ)=¬(¬G(ϕ)¬G(ψ))G(x.ϕ)=x.¬¬G(ϕ)G(x.ϕ)=¬x.¬(G(ϕ))G(P)=¬¬P

Notez que est fondamentalement un homomorphisme qui colle partout dans les non-non supplémentaires, sauf que pour les disjonctions et les existentielles, il utilise la dualité de Morgan pour les transformer en conjonctions et en universaux. (Je suis assez confiant que ce n'est pas la traduction exacte de Godel-Gentzen, car je l'ai préparé pour cette réponse - essentiellement tout ce que vous écrivez en utilisant la double négation + la dualité de Morgan fonctionnera. Cette variété s'avère en fait importante pour interprétations informatiques de la logique classique; voir ci-dessous.)g(ϕ)

Premièrement: il est évident que cette traduction préserve la vérité classique, de sorte que est vrai si et seulement si ϕ l' est, de façon classique.g(ϕ)ϕ

Deuxièmement: il est moins évident, mais toujours le cas, que pour les formules dans le fragment, la provabilité dans la logique intuitionniste et classique coïncident. La façon de le prouver est d'abord de regarder les formules tirées de cette grammaire:,,,¬

UNE,B:: =X.UNE(X)|UNEB|UNEB|¬UNE|¬¬P

Et puis nous pouvons prouver comme un lemme (par induction sur ) que G ( A )UNE est dérivable intuitivement. Alors maintenant, nous pouvons montrer l'équidérivabilité des formules négatives en faisant une induction sur la structure de la preuve (dans, disons, le calcul séquentiel) et utiliser le lemme précédent pour simuler la loi du milieu exclu.g(UNE)UNE

Alors, comment devriez-vous y penser de manière intuitive?

  • Tout d'abord, la vue de la preuve-théorique. Si vous regardez les règles du calcul séquentiel, vous pouvez voir que le seul endroit où la logique classique et intuitionniste diffèrent sérieusement est dans les règles de disjonction et d'existentielles. Nous utilisons donc ce fait pour montrer que les preuves dans une logique de ces formules peuvent être traduites en preuves dans l'autre. Cela montre comment penser la logique constructive comme une extension de la logique classique avec les deux nouveaux connecteurs et . Ce que nous appelons «existence classique» et «disjonction classique» n'étaient que des abréviations impliquant , conjonction et négation, et donc pour parler de l'existence réelle, nous devions introduire de nouveaux connecteurs.

  • Deuxièmement, il y a une vue topologique. Maintenant, le modèle d'une logique classique (en tant que famille d'ensembles) est une algèbre booléenne (c'est-à-dire une famille de sous-ensembles fermés sous des unions, intersections et compléments arbitraires). Il s'avère que le modèle de la logique intuitionniste est comme un espace topologique , les propositions étant interprétées comme des ensembles ouverts. Leur interprétation de la négation est l'intérieur du complément, puis il est facile de montrer que , ce qui signifie que la double négation nous envoie dans le plus petit clopen couvrant chaque ouverture --- et les clopens forment un Algèbre de Boole.¬¬¬P=¬P

Maintenant, grâce à Curry-Howard, nous savons interpréter les preuves en logique intuitionniste comme des programmes fonctionnels. Donc, une réponse possible (mais pas la seule) à la question de "quel est le contenu constructif d'une preuve classique?" est le suivant:

Le contenu informatique d'une preuve classique est quel que soit le contenu informatique de la traduction de sa preuve (selon la traduction négative).

Examinons donc la translation de . Cela dit donc que le contenu constructif du milieu exclu revient à dire que ce n'est pas le cas pour ¬ P et et ¬ ¬ P - c'est-à-dire la non-contradiction. Donc, dans ce sens, il n'y a pas vraiment beaucoup de contenu informatique dans la loi du milieu exclu.g(UNE¬UNE)=¬(¬g(UNE)¬¬g(UNE))¬P¬¬P

Pour voir ce que c'est concrètement, rappelons que de façon constructive, la négation est définie comme . Cette formule est donc ( ( G ( A )¬UNE==UNE((g(UNE))((g(UNE))))

type bot = Void of bot
type 'a not = 'a -> bot

let excluded_middle : ('a not * 'a not not) not = fun (u, k) -> k u 

Autrement dit, si vous obtenez non-A et non-pas-A, vous pouvez simplement passer la première négation à la seconde pour dériver la contradiction que vous voulez.

Maintenant, qu'est-ce qu'une suite de transformations de style passant?

  • ττ
  • 3+5C[3+5]3+5
  • τταα
  • eτ(τα)αe aurait calculé pour sa suite. (Fondamentalement, cela rend simplement explicite le flux de contrôle.)
  • Mais nous devons le faire de manière héréditaire, de sorte que chaque sous-programme du programme ait rendu sa continuation explicite.

À présent,

  • ϕ¬¬ϕ .
  • Cependant, bien que notre traduction utilise la négation, elle n'élimine jamais réellement la fausse proposition - la traduction fonctionne donc de façon paramétrique dans cette proposition.
  • α .
  • ϕ(ϕα)α
  • Il s'agit d'une transformation CPS.

J'ai vu "une" transformation CPS, car comme je l'ai mentionné plus tôt, il existe de nombreuses traductions négatives qui vous permettent de prouver ce théorème, et chacune correspond à une trasnformation CPS différente. En termes opérationnels, chaque transformation correspond à un ordre d'évaluation différent . Il n'y a donc pas d'interprétation informatique unique de la logique classique, car vous avez des choix à faire et les choix de différence ont des caractéristiques opérationnelles très différentes.


3
C'est une excellente réponse. Cela m'a rappelé l'article de Wadler "L'appel par valeur est double de l'appel par nom": homepages.inf.ed.ac.uk/wadler/topics/call-by-need.html , qui comprend une anecdote très mémorable dans la section 4 pour expliquer la relation entre callCC et le milieu exclu.
sclv

8

Il y a des conférences entières sur le thème des preuves non constructives en tant que programmes , et je ne suis pas un expert en la matière. Ci-dessus, Neel Krishnaswami a fait allusion à une réponse plus longue qu'il prépare, qui, à en juger par son travail ici, sera excellente. Ce n'est qu'un avant-goût d'une réponse.

Il s'avère que le type de continuation d' appel avec courant correspond à la proposition connue sous le nom de loi de Peirce , qui peut être utilisée pour prouver la loi du milieu exclu (P,P¬P). Un programme LEM peut être écrit en utilisant callcc. À Coq:

Set Implicit Arguments.

Axiom callcc : forall (A B : Set), ((A -> B) -> A) -> A.

Lemma lem : forall (A B:Set), sum A (A -> B).
Proof.
  intros.
  eapply callcc.
  intros H.
  right.
  intros.
  apply H.
  left.
  assumption.
Defined.

Recursive Extraction lem.

donne le code O'Caml:

type ('a, 'b) sum =
  | Inl of 'a
  | Inr of 'b

(** val callcc : (('a1 -> 'a2) -> 'a1) -> 'a1 **)

let callcc =
  failwith "AXIOM TO BE REALIZED"

(** val lem : ('a1, 'a1 -> no) sum **)

let lem =
    callcc (fun h -> Inr (fun h0 -> h (Inl h0)))

L'introduction la plus nette que j'ai vue à ce sujet se trouve dans la notion de contrôle des formules en tant que types de Tim Griffin .


3
Vous devriez essayer d'extraire dans Scheme et dire que la procédure d'extraction doit extraire votre callccfichier dans Scheme callcc. Ensuite, vous pouvez réellement essayer les choses.
Andrej Bauer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.