Quels sont les exemples les plus simples de programmes dont nous ne savons pas s'ils se terminent?


27

Le problème d'arrêt indique qu'aucun algorithme ne déterminera si un programme donné s'arrête. En conséquence, il devrait y avoir des programmes sur lesquels nous ne pouvons pas dire s'ils se terminent ou non. Quels sont les exemples les plus simples (les plus petits) connus de tels programmes?


Vous vous contredisez dans vos réponses ..... Merci! Mais le programme d'arrêt suppose la connaissance de la source. ... Si c'est vrai, vous avez répondu à votre question. Le programme d'arrêt serait déjà au courant. Imaginez un système contrôlant une enseigne, elle est toujours éclairée et clignotante, quand s'arrête-t-elle? Panne de courant, interrupteur d'alimentation ou pendant la séquence de flash. Ou étant donné une batterie de secours et un générateur, jamais.
htm11h


J'ajouterais que le problème d'arrêt n'est un problème que si vous ne mettez pas de limite supérieure de synchronisation. Il n'y a certainement pas de différence dans la pratique entre obtenir une réponse trop tard pour être utile et ne jamais obtenir de réponse. Vous pouvez demander si un programme retournera une réponse dans un certain nombre d'étapes, comme une définition en temps réel de l'exactitude. Si vous ne pouvez pas garantir une réponse rapide, alors vous avez simplement un programme qui n'a pas de garantie d'exactitude.
Rob

1
@Rob Ce n'est pas vraiment vrai. Si vous ne savez pas si une machine s'arrêtera, vous pouvez attendre indéfiniment pour voir si elle s'arrête; après un millénaire, vous ne saurez toujours pas si cela s'arrêtera, disons, le lendemain.
Kyle Strand

@KyleStrand Je suis d'accord avec vous. Mais je dis aussi que c'est un problème totalement exagéré dans la pratique, car tous les calculs réalistes sont soumis à des délais (millisecondes à mois). Si vous avez besoin d'une réponse en 5 secondes pour qu'elle soit utile, la seule chose qui compte est de savoir si vous pouvez garantir une réponse en 5 secondes. Supposons que vous puissiez garantir une réponse avec un temps de calcul indéterminé. Ce serait une garantie inutile.
Rob

Réponses:


41

Un exemple assez simple pourrait être un programme testant conjecture de Collatz :

f(n)={HALT,if n is 1f(n/2),if n is evenf(3n+1),if n is odd

Il est connu qu'il s'arrête pour n jusqu'à au moins 5×2605.764×1018 , mais en général c'est un problème ouvert.


9
Pour souligner mon point du commentaire sous la question: le problème " s'arrête-t-il pour tout n ?" est calculable . f(n)n
Raphael

6
@KyleStrand Voir ici .
Raphael

10
@KyleStrand, Raphael a 100% raison. Il s'agit d'une idée fausse courante. Vous devez suivre attentivement ce que dit la définition, puis vous découvrirez peut-être que votre intuition ne correspond pas tout à fait à la définition. Selon la définition de la calculabilité, il suffit qu'il existe une machine de Turing pour le calculer - peu importe si nous savons ce qu'est cette machine de Turing. En voyant cela, de nombreux étudiants pensent que c'est de la triche, mais ce n'est pas - c'est juste une conséquence de la définition.
DW

2
@KyleStrand Vous devez vous débarrasser de l'idée que le programme doit résoudre le problème . Ce ne est pas. Il suffit de sortir la réponse, ce qui est une tâche triviale. Algorithmiquement, les problèmes avec des ensembles finis d'instances sont tous ennuyeux car nous pouvons coder en dur les réponses. (Et même si nous ne connaissons pas les réponses, nous savons toujours qu'il existe un algorithme correct.) En général, lorsque vous montrez qu'il n'y a pas d'algorithme pour quelque chose, vous n'avez pas à faire d' hypothèses sur la façon dont cela va se passer. travail. Notre manque d'imagination ne fournit pas de preuve.
Raphael

2
@KyleStrand Afaik, j'utilise la définition standard de la calculabilité telle qu'elle est enseignée aujourd'hui (et, afaik, depuis des décennies). Je vous recommande d'absorber les réponses et le matériel lié et de déterminer où vous vous êtes trompé. Cela n'a pas de sens pour moi et les autres de répéter les mêmes choses encore et encore. Encore un essai: la définition de la calculabilité est intrinsèquement existentielle et non constructive. Tant que vous pensez dans les domaines de la logique classique, il n'est pas du tout nécessaire de pouvoir remettre un algorithme de «résolution» - nous devons simplement montrer qu'il y en a un qui donne les bonnes réponses.
Raphael

31

Le problème d'arrêt indique qu'aucun algorithme ne déterminera si un programme donné s'arrête. En conséquence, il devrait y avoir des programmes sur lesquels nous ne pouvons pas dire s'ils se terminent ou non.

"Nous" ne sommes pas un algorithme =) Il n'y a pas algorithme général qui pourrait déterminer si un programme donné s'arrête pour chaque programme .

Quels sont les exemples les plus simples (les plus petits) connus de tels programmes?

Considérez le programme suivant:

n = 3
while true:
    if is_perfect(n):
            halt()
    n = n + 2

La fonction is_perfect vérifie si n est un nombre parfait . On ne sait pas s'il existe des nombres impairs parfaits, nous ne savons donc pas si ce programme s'arrête ou non.


7
Nous sommes un algorithme.
PyRulez

3
@PyRulez il n'y a aucune preuve que la puissance de calcul de l'esprit humain est équivalente à Turing Machine. La preuve ne fonctionne pas, par exemple on ne sait pas comment simuler un esprit dans un autre.
avsmal

1
@avsmal D'accord, mais il est extrêmement improbable que nous soyons capables d'hypercalcul.
PyRulez

2
@PyRulez John Lucas et Roger Penrose ont suggéré que l'esprit humain pourrait être le résultat d'une sorte de calcul "non algorithmique" amélioré par la mécanique quantique. C'est une hypothèse forte. Mais au moins notre esprit peut avoir une source d'incertitude. Et cela suffit pour briser la preuve: il est impossible de nier la machine de Turing "aléatoire" (pour une définition appropriée de ce que signifie randomisé) si on ne sait pas si elle s'arrête.
avsmal

5
L'informatique quantique est-elle considérée comme l'hypercalcul? J'ai supposé que les ordinateurs quantiques pouvaient être parfaitement simulés par des machines de turing - juste un peu plus lentement.
MaiaVictor

10

Vous écrivez:

Le problème d'arrêt indique qu'aucun algorithme ne déterminera si un programme donné s'arrête. En conséquence, il devrait y avoir des programmes sur lesquels nous ne pouvons pas dire s'ils se terminent ou non.

Il s'agit d'un non-sequitur, dans les deux sens. Vous succombez à une erreur commune qui mérite d'être abordée.

PPP problème de asphaltage.

Ce n'est que si vous exigez que l'algorithme résout le problème de l'arrêt de tous les programmes¹ que vous puissiez montrer qu'aucun tel algorithme ne peut exister.

Maintenant, savoir que le problème de l'arrêt est indécidable n'implique pas qu'il existe des programmes dont personne ne peut prouver l'arrêt ou la boucle. Même si vous n'êtes pas plus puissant qu'une machine de Turing (ce qui n'est qu'une hypothèse, un fait non prouvé), tout ce que nous savons, c'est qu'aucun algorithme / personne ne peut fournir une telle preuve pour tous les programmes. Une personne différente peut décider pour chaque programme.

Quelques lectures plus connexes:


Vous voyez donc que votre question réelle (comme répété ci-dessous) n'a rien à voir avec le fait que le problème d'arrêt soit calculable. Du tout.

Quels sont les exemples les plus simples (les plus petits) connus de [programmes que nous ne savons pas arrêter ou boucler]?

C'est en soi une question valable; d'autres ont donné de bonnes réponses. Fondamentalement, vous pouvez transformer chaque déclarationSavec une valeur de vérité inconnue dans un exemple, à condition qu'il n'avoir une valeur de vérité:

g(n)={1,S vrai,g(n+1),autre.

Certes, ce ne sont pas très «naturels».


  1. Pas nécessairement tous , mais "beaucoup" dans un certain sens. Infiniment, au moins.

Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Raphael

To attempt to rephrase this for my own understanding, is it right to say that while there is no unique algorithm can determine whether any arbitrary given program halts, there may well be some program-specific algorithm to solve the halting problem of every possible program?
Asad Saeeduddin

@AsadSaeeduddin It's "worse": for every given finite set of programs, the Halting problem is trivial. Every finite set is decidable.
Raphael

7

Tout problème ouvert concernant l'existence d'un nombre ayant des propriétés particulières donne lieu à un tel programme (celui qui recherche un tel nombre). Par exemple, prenez la conjecture de Collatz; puisque nous ne savons pas si c'est vrai, nous ne savons pas non plus si le programme suivant se termine:

    n:=1;
    found:=false;
    while not found do
      s:={};
      i:=n;
      while i not in s do
        add i to s;
        if i even then i:=i/2 else i:=3i+1
      if 1 not in s then found:=true;
      n:=n+1  


0

la question est délicate car la décidabilité (l'équivalent CS formalisation / généralisation du problème d'arrêt) est associée aux langues et doit donc être refondue dans ce format. cela ne semble pas être souligné, mais de nombreux problèmes ouverts en mathématiques / CS peuvent être facilement convertis en problèmes (langues) de décidabilité inconnue. cela est dû à une correspondance étroite entre la démonstration du théorème et l'analyse de la (non) décidabilité. par exemple (un peu comme l'autre réponse par rapport à des nombres impairs parfaits), prenons la conjecture des nombres premiers jumeaux qui date des Grecs (il y a plus de 2 millénaires) et qui est soumise à d'importantes avancées de recherche récentes, par exemple par Zhang / Tao. le convertir en un problème algorithmique comme suit:

Entrée: n . Sortie: Y / N il existe au moins n nombres premiers jumeaux.

l'algorithme recherche les nombres premiers jumeaux et s'arrête s'il en trouve n . on ne sait pas si cette langue est décidable. la résolution du problème des nombres premiers jumeaux (qui demande s'il existe un nombre fini ou infini) résoudrait également la décidabilité de ce langage (s'il est également prouvé / découvert combien il y en a, s'il est fini).

un autre exemple, prenons l' hypothèse de Riemann et considérons ce langage:

Entrée: n . Sortie: O / N il existe au moins n zéros non triviaux de la fonction zêta de Riemann.

l'algorithme recherche des zéros non triviaux (le code n'est pas particulièrement complexe, son semblable à la recherche de racine, et il existe d'autres formulations équivalentes qui sont relativement simples, qui calculent essentiellement des sommes de "parité" de tous les nombres premiers inférieurs à x, etc.) et s'arrête si il en trouve n et encore une fois, on ne sait pas si ce langage est décidable et la résolution est "presque" équivalente à la résolution de la conjecture de Riemann.

maintenant, que diriez-vous d'un exemple encore plus spectaculaire? ( mise en garde, probablement plus controversée également)

Entrée: c: Sortie: Y / N il existe un algorithme O (n c ) pour SAT.

de même, la résolution de la décidabilité de ce langage est presque équivalente au problème P vs NP . cependant, il existe un cas moins évident pour un code "simple" pour le problème dans ce cas.


1
Est-ce que le downvoter pourrait expliquer ce qui ne va pas avec cette réponse?
MaiaVictor

2
Votre langue "twin prime" est décidable. S'il n'y a qu'un nombre finiN d’entre eux, la réponse est «oui» nNet "Non" sinon, sinon toujours "Oui". Bien sûr, nous ne savons pasN, but that is irrelevant, a (very simple) Turing machine answers. Just like the "Fermat's last theorem" language, "are there integers a,b,c such that an+bn=cn for n?", recently "we" found out this N=2, Wiles' proof didn't change the language.
vonbrand

3
I'm not the downvoter, but all of the claims in this answer are wrong. All three of those problems are provably decidable (without needing to make any unproven assumptions). For why, study Raphael's answer closely.
D.W.

ok maybe the input needs to have the TM specified and the algorithm decides if the TM calculates the problem. have to think about it more... think there is some simple recipe for these types of problems basically connecting open problems to undecidable languages... but agreed this is rarely documented/ formulated in CS refs... have only found a few scattered refs... or maybe the input is a proof and the language verifies if the proof is correct... the other high voted answers mention odd perfect numbers, collatz problem etc... the programs are unknown to halt or not for specific constants.
vzn

Désolé pour la confusion! après réflexion, les assertions sont correctes sous la forme qui décrivent des programmes simples non connus pour se terminer (pour toutes les entrées) (c'est-à-dire la question d'origine) et l'échec de l'idée globale esquissée / pointée par DW tente de convertir chacun en langues indécidables. continuera de réfléchir à cette dernière idée de construction à la recherche de celle qui réussira. une autre façon de voir les choses est que les problèmes peuvent être vus comme des instances / entrées individuelles pour un résolveur de problèmes d'arrêt mais pas vraiment (connus pour être) équivalents au problème d'arrêt lui-même.
vzn

0

Écrivez un programme simple qui vérifie si pour chaque n, 1n1050, the Collatz sequence starting with n will reach the number 1 in less than a billion iterations. When it has the answer, let the program stop if the answer is "Yes", and let it loop forever if the answer is "No".

We cannot tell whether this program terminates or not. (Who is we? Let's say "we" is anyone who could add a comment to my answer). However, someone with an incredibly powerful computer might tell. Some genius mathematician might be able to tell. There might be a rather small n, say n ≈ 1020 where a billion iterations are needed; that would be in reach of someone with a lot of determination, a lot of time, and a lot of money. But right now, we cannot tell.

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.