Le problème d'arrêt est-il calculable pour des entrées / hypothèses particulières


19

D'après ma compréhension de la preuve que le problème d'arrêt n'est pas calculable, ce problème n'est pas calculable parce que si nous avons un programme P (x) qui calcule si le programme x s'arrête ou non, nous avons un paradoxe lorsque nous donnons P comme entrée au même P, ayant: P (P), essayant de décider si P s'arrête ou non en utilisant P lui-même.

Ma question est donc la suivante: l'arrêt du problème est-il calculable par le programme P pour tous les autres programmes utilisés en entrée, mais P lui-même? En d'autres termes: le problème d'arrêt n'est-il pas calculable uniquement dans ce cas particulier ou la preuve est plus générale et il me manque quelque chose?


Je pense que vous comprenez mal la preuve que le problème d'arrêt n'est pas calculable. P (P) renvoie juste vrai, car P détermine toujours si un programme s'arrête en temps fini. Vous devez faire une construction un peu plus délicate pour arriver à une contradiction.
Dan Staley

Je pense que vous obtiendriez des réponses meilleures et peut-être pratiquement plus pertinentes si vous demandiez s'il existe de nombreux programmes pour lesquels le problème d'arrêt est résoluble. Après tout, de nombreux programmes sont même formellement vérifiables , ce qui inclut certainement une détermination s'ils s'arrêtent avec des entrées données. Je suppose fortement que ce groupe ne peut pas être déterminé (car cela reviendrait à résoudre ..., vous savez), mais que pour la grande majorité des programmes du monde réel, il n'y a aucun obstacle à dire s'ils s'arrêtent ou non, pour les intrants pertinents.
Peter - Rétablir Monica

Réponses:


10

Si est une fonction calculable, alors g , défini commefg

g(n)={f(n)if nkvotherwise

est également calculable, pour tout choix de .k,v

Fondamentalement, si vous avez un programme qui calcule g ( n ) pour tous les n sauf pourPg(n)n , vous pouvez "corriger" ce cas (par exemple en utilisant un) et obtenir un autre programme P qui calcule g ( n ) pour tous n .n=kif then elsePg(n)n

Par conséquent, si vous pouviez calculer la fonction d'arrêt "sauf pour un cas", vous pourriez également calculer la fonction d'arrêt (sans exception). De cela, vous pouvez obtenir une contradiction comme d'habitude.

Conclusion: non, vous ne pouvez pas décider du problème d'arrêt "sauf un cas" (ni "sauf un nombre fini de cas").


1
Ok, je pense que je l'ai eu mathématiquement ... Mais je me demandais: si j'essayais d'écrire un programme qui calcule le HP, quels problèmes concrets rencontrerais-je? Pourquoi et comment à un moment donné, je comprendrais que je ne peux pas écrire un tel programme?
Alessio Martorana

@AlessioMartorana Cela dépend: comment aborderiez-vous un tel problème? Un problème principal est que doit toujours s'arrêter, même lorsque son entrée est un programme sans arrêt - vous ne pouvez donc pas simplement essayer de simuler le programme d'entrée.P
chi

Et en supposant que nous pouvons voir le code du programme d'entrée? Ne pouvons-nous pas à partir du code voir si le programme s'arrête?
Alessio Martorana

2
@AlessioMartorana On peut en effet voir le code, mais s'il y a par exemple une boucle while on ne peut pas dire grand chose en général. Une boucle while peut vérifier toutes les preuves possibles d'une conjecture mathématique arbitraire et ne s'arrêter que si une preuve est trouvée. Décider si cette boucle s'arrête signifie décider si la conjecture est prouvable. Résoudre le HP nous donnerait une machine qui répondrait Oui (prouvable) / Non (non prouvable) à toute question mathématique formelle. Ce serait d'une puissance irréaliste.
chi

1
@AlessioMartorana Si vous pensiez avoir écrit un programme qui résout le HP, où votre programme échouerait de deux manières: pour certains programmes, il pourrait retourner le mauvais résultat (dire quelque chose s'arrête quand il ne le fait pas ou dire que quelque chose ne fonctionne pas) t s'arrête quand il le fait) et / ou votre programme de décision lui-même ne s'arrêterait pas sur de nombreuses entrées sans que vous puissiez savoir s'il ne s'arrêtera pas vraiment ou s'il a juste besoin de plus de temps pour calculer la réponse.
Shufflepants

21

le problème d'arrêt est-il calculable par le programme P pour tous les autres programmes utilisés en entrée mais P lui-même?

Considérez la séquence infinie de programmes , où P i est «Déplacez la tête i  carrés vers la droite, puis i  carrés vers la gauche, puis faites exactement ce que PP1,P2,PiiiP ferait." Chacun de ces programmes produit exactement la même sortie que  pour chaque entrée (y compris en boucle pour toujours si P  boucle pour toujours), mais ce sont tous des programmes différents.PP

Et vous ne pouvez pas contourner cela en exigeant uniquement que travaille sur des programmes qui ne sont pas fonctionnellement équivalents à lui-même, car cette propriété est également indécidable. Peut-être que le problème serait décidable lorsqu'il est limité à ces instances (bien que je soupçonne que ce ne serait pas le cas) mais l'ensemble d'instances est indécidable, vous ne pouvez donc pas réellement effectuer la restriction.P


15
Je soupçonne que votre dernière phrase est probablement vraie, mais je ne pense pas qu'il en résulte que parce qu'une propriété est indécidable, la restriction de l'ensemble d'entrée basé sur cette propriété laissera le problème indécidable. À titre d'exemple stupide, si vous restreigniez l'ensemble d'entrée aux programmes de terminaison (une propriété indécidable), le problème serait décidable (par un programme qui renvoyait toujours true).
Owen

3
@Owen Lorsque la restriction elle-même est indécidable, vous ne pouvez pas l'imposer, elle ne peut donc rien vous acheter en réalité.
David Richerby

5

Il existe des algorithmes pour montrer que certaines classes de programmes s'arrêtent ou non. Par exemple,

  • Il est possible de déterminer de façon algorithmique si un programme qui modélise une machine à états finis s'arrête.
  • Il est possible de déterminer de manière arithmétique si une machine de turing à limite linéaire s'arrête
  • Si vous savez dans quelle classe de complexité se trouve un programme, alors vous savez que le programme s'arrête pour les entrées finies.

Bien qu'il n'y ait pas d'algorithme pour déterminer si un programme arbitraire s'arrête, la majorité du code a été conçu pour s'arrêter (comme la plupart des sous-programmes) ou ne pas s'arrêter (comme une boucle infinie pour gérer les événements), et il est possible de déterminer par algorithme lequel est lequel. En d'autres termes, vous pouvez avoir un algorithme qui répond soit à «s'arrête», «ne s'arrête pas» ou «je ne sais pas», et un tel algorithme peut être conçu pour couvrir suffisamment de programmes qu'il serait utile.


Qu'est-ce que cela a à voir avec goto? Ne pouvons-nous pas avoir un programme qui utilise goto tout en décidant s'il s'arrête, tant qu'il modélise une machine à états finis?
Bergi

J'allais écrire sur l'arrêt en termes de boucles for, puis je l'ai changé juste pour parler des machines à états finis et ainsi de suite
Antonio Perez

4

Les preuves par contradiction ne doivent pas être exhaustives , un seul contre-exemple suffit. La preuve que le problème d'arrêt est indécidable vous fournit un exemple de P pour lequel la propriété d'arrêt ne peut pas être décidée. Cette preuve n'indique pas que P est le seul programme de ce type, en fait, il peut exister des preuves indépendantes construisant des classes complètement différentes de P.


3

La preuve est en effet plus générale: le problème d'arrêt est un cas particulier du théorème de Rice , qui énonce

Si Φ est une propriété de programmes indépendante de la représentation, alors elle est toujours vraie, toujours fausse ou indécidable.

où "indépendant de la représentation" signifie que si et B sont des programmes qui ont le même comportement pour toutes les entrées, alors Φ ( A ) est valable si Φ ( B ) est valide.ABΦ(A)Φ(B)

Cela signifie notamment que pour chaque entrée , l'ensemble des programmes qui s'arrêtent sur x est indécidable; vous ne pouvez pas obtenir la décidabilité en réduisant l'espace d'entrée.xx

Vous pouvez obtenir des résultats en restreignant l'espace des programmes avec lesquels vous souhaitez travailler, bien que ces restrictions doivent être assez drastiques. Par exemple, si vous êtes assuré que le programme qui vous est donné s'arrête dans les 100 étapes ou s'exécute indéfiniment, décider s'il s'arrête devient facile.

Un cas plus compliqué est lorsque vous savez que le programme comporte au plus 100 caractères. Puisqu'il n'y a qu'un nombre fini de programmes de cette longueur, il existe un certain nombre d'étapes qui est une limite supérieure sur la durée pendant laquelle un tel programme peut s'exécuter s'il se termine. Cependant, la fonction qui mappe une longueur de programme k à un nombre maximum d'étapes B B ( k ) n'est pas calculable.NkBB(k)


1
N

1
Le dernier paragraphe ressemble à Busy Beaver.
Evil

En ce qui concerne les restrictions "assez drastiques": le total des langages de programmation est une chose. Ils ont tendance à nécessiter un degré de sophistication relativement élevé, alors peut-être que vous considérez que drastique, mais il est possible de résoudre de vrais problèmes dans un espace de programmes qui s'arrêtent de manière prouvée.
Ben Millwood

Inclure un lien vers en.wikipedia.org/wiki/Rice%27s_theorem aurait un sens à l'OMI.
Dmitry Grigoryev

Merci, j'ai mis à jour la réponse. @BenMillwood Certainement, mais étant donné que leur solution est de "tout arrêter", je ne suis pas sûr que ce soit vraiment ce que recherche Alessio. Un cas où le comportement d'arrêt est décidable mais non trivial serait cependant intéressant: peut-être des types coinductifs Agda +?
Anton Golov

0

Soit R tout ensemble récursivement énumérable mais non récursif. Il existe une infinité de tels ensembles. Soit T une machine de Turing qui s'arrête à l'entrée k si et seulement si k est dans R. Un tel T existe pour tout ensemble énumérable récursivement. Il est impossible d'écrire un programme qui peut résoudre le problème d'arrêt de ce T. C'est parce que tout algorithme pour déterminer si T s'arrête produirait un algorithme pour déterminer l'appartenance à R, ce qui est impossible si R n'est pas récursif. Puisqu'il existe une infinité de tels R, dont chacun donne des machines de Turing différentes, il existe une infinité de machines de Turing sur lesquelles toute tentative d'arrêt du programme P échouerait.

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.