Y a-t-il des problèmes existants qui ne pourraient pas être résolus avec un oracle en arrêt?

11

Je comprends que la plupart des problèmes sont triviaux si un oracle d'arrêt est disponible (ou, je pense de manière équivalente, l'hyper-calcul). Cependant, appliquer l'argument qui montre que le problème d'arrêt est impossible pour une machine Turing montre également qu'il est impossible pour un oracle Turing + de décider du problème d'arrêt pour un oracle Turing +. Existe-t-il des exemples concrets et pratiques de problèmes insolubles par un oracle qui s'arrête?

Remarque: par "oracle", je veux dire oracle pour une machine de Turing standard, pas un TM avec un oracle lui-même.

ike
la source
2
Il y a des problèmes "arbitrairement indécidables", voir par exemple ici . Je ne connais pas d'exemples "pratiques" (qui ne correspondent pas non plus au titre que vous avez choisi); qu'est-ce qui est qualifié de «pratique» pour vous?
Raphael
Cela n'est pas conçu simplement pour répondre à cette question. J'ai reconnu que le problème d'arrêt de niveau supérieur s'applique toujours.
ike
De plus, toutes les langues qui ne sont pas énumérables récursivement ne sont pas réductibles à HALT. Les exemples incluent FINITE, EMPTY, si deux CFG dérivent la même langue, etc.

Réponses:

15

Prenez juste un problème dont le degré de Turing est supérieur à , qui est le degré de l'Oracle Halting. En termes de hiérarchie arithmétique, vous voulez des problèmes supérieurs à . Exemples de tels problèmes (où est la ème fonction partielle calculable et est le - e ensemble énumérable):0Σ10ϕnnWn={kNϕn(k) is defined}n

  • {nNφn terminates for finitely many inputs} is -complete.Σ20
  • {nNφn is a total function} est -complete.Π20
  • {nNWn is a computable set} est -complete.Σ30

Aucun de ces problèmes ne peut être résolu même si vous avez un Oracle Halting. Par exemple, considérons le deuxième exemple, "is total?" Étant donné comment le Halting Oracle nous aiderait-il à décider si la machine de Turing codée par s'arrête à chaque entrée? n nφnnn


[Ajouté le 03-06-2014] Pour un aspect "pratique" de tout cela, considérons le problème: un programmeur a écrit une fonction void charge_credit_card(int card_number, int amount)et nous aimerions savoir si la fonction se termine sur toutes les entrées. Il est impossible d'écrire un compilateur qui peut vérifier automatiquement cela en général. De plus, même si nous permettons au compilateur de nous poser des questions de la forme "se charge_credit_cardtermine-t-il quand on donne une entrée (k,m)?", C'est toujours impossible.

Andrej Bauer
la source
2
Dire "je ne comprends pas l'exemple" sans expliquer ce qui vous embrouille n'est pas productif. Avez-vous lu les pages Wikipédia pertinentes que j'ai désignées? Ceux-ci sont directement liés à votre question, donc la première chose à faire est de vous familiariser avec les concepts de base impliqués.
Andrej Bauer
1
@ike, l'exemple était censé avoir une quantité infinie de int, bien évidemment. Avez-vous vraiment besoin de moi pour écrire BigIntou quelque chose du genre, ou vous plaindrez-vous alors que la mémoire de l'ordinateur est limitée?
Andrej Bauer
1
Peu importe. Je vous ai dit quelle était la réponse à votre question. Si vous ne voulez pas le comprendre de bonne foi, ne nous dérangez pas avec des questions.
Andrej Bauer
2
Un exemple pratique est, , le compliment de l'arrêt. C'est Étant donné un programme arbitraire et une entrée dans le programme, déterminez si le programme ne s'arrête pas. Ce problème, ainsi que tous les autres langages non récursivement énumérables, ne se réduit pas à HALT. {<M,w>:M ne s'arrête pas sur w}HALT¯{<M,w>:M doesn't halt on w}
1
@tAllan: vous devez poster cela comme réponse. Cela me bat ce que le PO considère "pratique", mais votre exemple est certainement meilleur que le mien.
Andrej Bauer