Je ne comprends pas pourquoi le problème de l' arrêt est si souvent utilisé pour écarter la possibilité de déterminer si un programme est interrompu. Le [article] [1] de Wikipedia explique correctement qu'une machine déterministe à mémoire finie arrêtera ou répétera un état antérieur. Vous pouvez utiliser l’algorithme qui détecte si une liste chaînée est mise en boucle pour implémenter la fonction d’arrêt avec une complexité d’espace de O (1).
Il me semble que la preuve du problème de l’arrêt n’est rien davantage qu’une prétendue «paradoxe», une contradiction de référence (au moins cyclique) de la même manière que le paradoxe du menteur. La seule conclusion à tirer est que la fonction d’arrêt est susceptible de poser de telles questions mal formées.
Donc, en excluant les programmes paradoxaux, la fonction d’arrêt est décidable. Alors, pourquoi la considérons-nous comme une preuve du contraire?
4 ans plus tard : quand j'ai écrit ceci, je venais de regarder cette vidéo . Un programmeur obtient certains programmes, doit déterminer ceux qui se terminent, et la vidéo explique pourquoi c'est impossible. J'étais frustré parce que je savais qu'avec des programmes arbitraires, il était possible que le protagoniste puisse prouver s'il était terminé. Le concept de généralité a été perdu d'une manière ou d'une autre. C'est la différence entre dire "on ne peut pas prouver que certains programmes se terminent" et "on ne peut prouver qu'un programme se termine." De nombreux algorithmes sont formellement démontrés pour le faire. Le défaut de faire cette distinction, par chacune des références que j'ai trouvées en ligne, a été la raison pour laquelle je suis arrivé au titre de cette question. Pour cette raison, j'apprécie vraiment la réponse cela redéfinit la fonction d'arrêt comme ternaire au lieu de booléen.
P => Q
est vraie pour tout Q, si nous savons queP
c'est faux (et nous savons que le problème de Halting n'est pas résoluble). Francis pourrait tout aussi bien dire: "Si nous pouvions résoudre le problème, nous pourrions trouver un remède à la mort elle-même". C'est la façon dont l'implication logique est définie.Réponses:
Parce que beaucoup de problèmes réellement pratiques sont le problème d’arrêt déguisé. Une solution à ces problèmes résout le problème persistant.
Vous voulez un compilateur qui trouve le code machine le plus rapide possible pour un programme donné? En fait, le problème d’arrêt.
Vous avez JavaScript, avec certaines variables à un niveau de sécurité élevé et d'autres à un niveau de sécurité bas. Vous voulez vous assurer qu'un attaquant ne peut pas accéder aux informations de haute sécurité. C’est aussi le problème qui s’arrête.
Vous avez un analyseur syntaxique pour votre langage de programmation. Vous le changez, mais vous voulez vous assurer qu'il analyse toujours tous les programmes qu'il utilisait auparavant. En fait, le problème d’arrêt.
Vous avez un programme anti-virus et vous voulez savoir s'il exécute une instruction malveillante. En fait, juste le problème d’arrêt.
En ce qui concerne l'exemple wikipedia, oui, vous pouvez modéliser un ordinateur moderne comme une machine à états finis. Mais il y a deux problèmes avec cela.
Chaque ordinateur serait un automate différent, en fonction du nombre exact de bits de RAM. Cela n'est donc pas utile pour examiner un morceau de code particulier, car l'automate dépend de la machine sur laquelle il peut s'exécuter.
Vous aurez besoin de états si vous avez n bits de RAM. Donc, pour votre ordinateur moderne de 8 Go, cela représente . C'est un nombre si grand que wolfram alpha ne sait même pas comment l'interpréter. Quand je fais il est indiqué qu'il a chiffres décimaux. Ceci est clairement beaucoup trop grand pour stocker dans un ordinateur normal.2 32000000000 2 10 9 3000000002n 232000000000 2dix9 300000000
Le problème de Halting nous permet de raisonner sur la difficulté relative des algorithmes. Cela nous laisse savoir que certains algorithmes n'existent pas, que parfois, tout ce que nous pouvons faire est de deviner un problème et de ne jamais savoir si nous l'avons résolu.
Si nous n'avions pas le problème bloquant, nous chercherions toujours l'algorithme magique de Hilbert qui entre les théorèmes et fournit des résultats, qu'ils soient vrais ou non. Nous savons maintenant que nous pouvons cesser de chercher et que nous pouvons concentrer nos efforts sur la recherche d'heuristiques et de méthodes optimales pour résoudre ces problèmes.
MISE À JOUR: Juste pour aborder quelques problèmes soulevés dans les commentaires.
@Tyler Fleming Cloutier: Le problème "absurde" se pose lorsqu'il est prouvé que le problème qui nous arrête est indécidable, mais le cœur de l'indécidabilité réside dans un espace de recherche infini. Vous recherchez un objet avec une propriété donnée, et s'il n'en existe pas, il n'y a aucun moyen de savoir quand vous avez terminé.
La difficulté d'un problème peut être liée au nombre de quantificateurs dont il dispose. Essayer de montrer qu’il existe ( ) un objet avec une propriété arbitraire, vous devez chercher jusqu’à ce que vous en trouviez un. S'il n'en existe pas, il n'y a aucun moyen (en général) de le savoir. Il est difficile de prouver que tous les objets ( ) ont une propriété, mais vous pouvez rechercher un objet sans la propriété permettant de l'invalider. Plus il y a d'alternations entre forall et existe, plus le problème est difficile.∀∃ ∀
Pour plus d'informations à ce sujet, voir la hiérarchie arithmétique . Tout ce qui est au-dessus de est indécidable, bien que le niveau 1 soit semi-décidable.Σ00= Π00
Il est également possible de montrer qu'il existe des problèmes indécidables sans utiliser un paradoxe absurde comme le problème Halting ou le paradoxe de Liars. Une machine de Turing peut être codée en utilisant une chaîne de bits, c'est-à-dire un entier. Mais un problème peut être codé sous forme de langage, c’est-à-dire un sous-ensemble des entiers. On sait qu'il n'y a pas de bijection entre l'ensemble des entiers et l'ensemble de tous les sous-ensembles des entiers. Il doit donc y avoir des problèmes (langages) auxquels aucune machine de Turing n'est associée (algorithme).
@Brent: oui, cela admet que c'est décidable pour les ordinateurs modernes. Mais c'est décidable pour une machine spécifique. Si vous ajoutez un lecteur USB avec de l'espace disque, ou la possibilité de le stocker sur un réseau, ou autre, la machine a changé et le résultat ne tient pas.
Il faut aussi dire qu'il y aura de nombreuses fois où l'algorithme dit "ce code va s'arrêter" parce qu'il échouera et qu'il manquera de mémoire, et que l'ajout d'un seul bit de mémoire supplémentaire le ferait réussir et donner un résultat différent.
Le problème, c’est que les machines de Turing n’ont pas une quantité de mémoire infinie. Il n'y a jamais une époque où une quantité infinie de symboles sont écrits sur la bande. Au lieu de cela, une machine Turing a une mémoire "illimitée", ce qui signifie que vous pouvez continuer à avoir plus de sources de mémoire quand vous en avez besoin. Les ordinateurs sont comme ça. Vous pouvez ajouter de la RAM, des clés USB, des disques durs ou un stockage réseau. Oui, vous manquez de mémoire lorsque vous êtes à court d'atomes dans l'univers. Mais avoir une mémoire illimitée est un modèle beaucoup plus utile.
la source
Concrètement, c'est important car cela vous permet de dire à vos chefs ignorants que "ce que vous demandez est mathématiquement impossible".
Le problème d’arrêt et divers problèmes NP-complets (par exemple, le problème du voyageur de commerce) se posent souvent sous la forme «Pourquoi ne pouvez-vous pas créer un programme qui fait X?» Et vous devez pouvoir donner une explication de pourquoi il est impossible ou infaisable dans la vie restante de l'univers.
Notez qu'il est possible de concevoir un langage qui n'est pas complet de Turing et qui peut donc être analysé en interdisant la récursion et l'itération sans limites.
la source
Pour ce faire, vous devez stocker au moins deux copies de l'état partiel du programme en mémoire, plus la surcharge du programme de contrôle. Ainsi, sur un ordinateur donné, vous ne pouvez pas tester tous les programmes pouvant être exécutés sur cet ordinateur, mais uniquement les programmes exécutés sur un ordinateur plus petit avec moins de la moitié de la mémoire.
Le problème d’arrêt pour un ordinateur de taille finie donné ne peut pas être résolu sur cet ordinateur de taille finie. Il ne peut être résolu que sur un ordinateur plus grand. (Ceci est vrai pour n'importe quelle méthode, pas seulement celle que vous proposez. Je ne vais pas donner de preuve formelle, mais voici l'essentiel. Si un ordinateur C peut exécuter N programmes différents dont au moins un P ne se termine pas , alors un ordinateur V capable de vérifier si ces programmes s'arrêtent doit également être en mesure d'exécuter N programmes de vérificateur différents. Si C et V sont le même ordinateur, P n'est pas l'un des N programmes différents exécutés par V; L’ordinateur doit exécuter au moins N + 1 programmes différents, ce qui contredit l’hypothèse selon laquelle C exécute N programmes différents.)
Les chiffres montrent que penser à un ordinateur comme une machine à états finis est rarement pratique. Le nombre d'États est peut-être limité, mais c'est ahurissant, incroyablement énorme. La seule façon de raisonner à propos de programmes autres que des jouets est dans l'abstrait, non pas en énumérant des états, mais par un raisonnement logique.
Le paradoxe ne vient pas du problème, mais de la tentative de solution. Pour tout programme donné, il existe un algorithme qui dit «oui» si le programme se termine et «non» si le programme ne se termine pas. C'est trivial: soit
print "yes"
ouprint "no"
va faire. Le problème est de déterminer lequel appeler. L'impossibilité de résoudre le problème bloquant signifie qu'il n'y a pas d'algorithme pour effectuer cette détermination. La raison pour laquelle la preuve utilise un argument de diagonalisation est qu’elle doit montrer qu’aucunla solution fonctionne; pour ce faire, il part d'une solution supposée arbitraire et montre qu'il doit rater certains programmes en construisant un programme manqué. La diagonalisation (ce que vous appelez à tort un «paradoxe») est dans la construction, pas dans le programme qui en résulte. Les programmes résultants ne sont pas auto-référentiels.Il existe un résultat plus général appelé le théorème de Rice qui stipule que toute propriété non trivialedes programmes est indécidable - toute propriété qui dépend uniquement du comportement du programme et non pas de la manière dont il est écrit (par exemple, "le code source contient-il moins de 42 caractères?" est clairement décidable, alors que "existe-t-il un programme dont le code source est composé de moins de 42 caractères et qui renvoie le même résultat pour toutes les entrées? ”n’est pas, et“ ce programme n’a-t-il jamais rien produit? ”). L'arrêt n'est qu'un exemple. C’est un point important, car cela revient souvent dans la pratique (en général, nous voulons savoir si un programme donnera un résultat dans un délai raisonnable compte tenu des ressources limitées de l’ordinateur sur lequel il est exécuté, mais comme il est rarement possible de répondre de manière pratique, nous sommes disposé à se contenter de la simple question de savoir si le programme se terminera éventuellement avec suffisamment de temps et de mémoire).
la source
Non, ce n'est pas le problème qui nous arrête. Les paradoxes comme le paradoxe du menteur ne sont ni vrais ni faux, ils n'ont tout simplement aucun sens. Un algorithme déterministe, par contre, s’arrêtera pour une entrée donnée ou fonctionnera indéfiniment. La fonction
halts(program, input)
a une valeur déterministe parfaitement définie pour chaque programme, pour chaque entrée. Nous ne pouvons tout simplement pas en décider pour quelque programme que ce soit. Ou, plus précisément: nous ne pouvons pas écrire un programme qui puisse le décider pour chaque paire programme / entrée.la source
Premièrement, oui, théoriquement, il est logique de considérer un ordinateur réel, à mémoire finie, comme une machine à états finis. Mais dans la pratique, le nombre d'états d'un ordinateur réel est si grand que les ordinateurs réels sont beaucoup mieux modélisés par des machines de Turing ou d'autres modèles de calcul à états infinis.
Et deuxièmement, même théoriquement, il est logique de considérer un ordinateur moderne comme une machine à états infinie. Une machine Turing n’a pas de bande infinie, elle a une bande qui peut toujours être étendue lorsque la machine manque de mémoire. Et n’est-ce pas exactement ce que nous pouvons faire avec de vrais ordinateurs? (Et si l'espace d'adressage de la CPU s'épuise, nous pouvons utiliser le cloud, etc.)
La preuve de Turing sur le caractère indécidable du problème bloquant utilise une astuce similaire au paradoxe de Liar, oui. Un paradoxe est souvent défini comme une contradiction apparente et certaines personnes en déduisent qu'un paradoxe n'est donc pas une contradiction réelle . Cependant, le paradoxe de Russel (la contrepartie formelle de la théorie des ensembles au paradoxe du menteur) montrait une contradiction réelle en mathématiques, et la preuve de l'indécidabilité du problème bloquant utilise une contradiction réelle pour la prouver par contradiction.
la source
Jmite a vraiment bien répondu à la question. Permettez-moi d'ajouter une petite note au sujet de la similitude perçue avec le "paradoxe du menteur" qui, je pense, est causée par l'utilisation d'un mécanisme de référence à soi-même.
L'auto-référence est un outil vraiment utile en calcul (qu'un algorithme peut se référer à son code, réflexion ) et au langage humain (que l'on peut se référer à nous-mêmes, à la conscience de soi ).
Le problème qui cause le paradoxe du menteur n’est pas une référence à soi-même, c’est essayer d’utiliser le prédicat de vérité pour une langue (formelle) à l’intérieur de la langue. Cela causera des problèmes même sans référence à soi, nous n'avons pas besoin de la capacité d'utiliser la référence à soi pour obtenir un paradoxe: la référence à soi peut être éliminée! . Cela rendrait simplement la phrase moins belle et concise mais ce n’est pas difficile à faire. C'est essentiellement comment le théorème de Kleene à point fixe est prouvé. Ce que le paradoxe du menteur implique, c'est que la vérité des déclarations dans un langage (formel) est transcendante pour ce langage, et non que la référence à soi-même soit problématique.
Il me semble que votre malaise n’est pas dû à l’indécidabilité du problème bloquant (pour les machines de Turing) mais à l’acceptation des machines de Turing en tant que modèle théorique pour les ordinateurs. Typiquement (bien que pas toujours), les machines de Turing (et des modèles de calcul équivalents comme les machines à accès aléatoire ) sont bien utiles pour discuter du calcul sur des ordinateurs réels que des automates finis et il y a de bonnes raisons à cela (gardez à l'esprit qu'une machine de Turing n'a pas une quantité infinie de mémoire, elle a une quantité illimitée de mémoire et ce sont des choses différentes: sans limite signifie que nous pouvons fournir à la machine plus de mémoire quand elle en a besoin, pas qu’elle utilise une quantité infinie de mémoire).
Bien sûr, si vous voulez considérer les ordinateurs comme des automates finis, et que cela a du sens, le problème de l'arrêt des automates finis est décidable (et par décidable, nous entendons décidable par une machine de Turing et non par un automate fini). Ce n’est cependant pas ce que les gens veulent dire quand ils utilisent le problème d’arrêt, ils désignent le problème d’arrêt des machines de Turing.
la source
le problème posé a introduit un nouveau concept mathématique d '"indécidabilité" qui n'existait pas auparavant en mathématiques. c'était une preuve ("apparemment paradoxale") que certains problèmes n'ont pas de "preuves". elle est liée au concept godélien d'improvabilité. Le théorème de Godels a précédé l'arrêt de la formulation du problème par Turing de quelques années. Le résultat de Godels était considéré à l’époque plutôt abstrait et n’était connu que des chercheurs et des spécialistes. Formulation Turing a montré que le principe de l' indécidabilité était liée à très pratique / pragmatique / appliquée aux questions de la science informatique tels que déterminer si des programmes arbitraires et stoppent il est considéré comme un concept beaucoup moins théorique, il apparaît dans les défis modernes tels que " (un défi si les ordinateurs peuvent découvrir des théorèmes) et prouver la fin du programme.
Un autre aspect intéressant est qu’il existe de très anciens problèmes dans la théorie des nombres (diophantiens) provenant des Grecs et non prouvés depuis des millénaires. il en résulte que les questions générales sur les équations de Diophant sont indécidables, ce qui est appelé le 10ème problème / théorème de Hilberts . Hilbert a vécu au tournant du XXe siècle et a proposé comme programme de recherche que les mathématiques puissent trouver une approche systématique des problèmes mathématiques. Ce défi / plan a été sérieusement frappé par la découverte de l’indécidabilité de quelques décennies plus tard. L’indécidibilité reste un domaine de recherche très avancé et la frontière entre les problèmes indécidables et décidables sera probablement toujours à l’étude et à l’analyse.
la source
Vous semblez confondre la preuve classique "basée sur l'auto-référentiel" selon laquelle le problème de Halting ne peut pas être résolu avec le problème de Halting (ou Halt) lui-même.
Ce programme auto-référentiel - le programme qui s'arrête si et seulement si il ne s'arrête pas - est construit dans le but de prouver facilement que vous ne pouvez pas résoudre le problème de Halt. Le fait de prouver que X est impossible via la technique Y n'implique pas que Y est la seule raison pour laquelle nous ne pouvons pas résoudre X.
En d'autres termes, non seulement nous ne pouvons pas résoudre Halt, mais nous ne pouvons pas détecter le type de programme que nous ne pouvons pas déterminer s'il est arrêté, à l'exception d'une mesure grossière du type "si cela prend plus d'une minute ça ne s'arrête pas ".
Si vous partez du problème Halting et réduisez-le à d’autres problèmes, vous finirez par atteindre le point où vous avez réduit presque toutes les questions concernant les programmes qui le concernent. On se retrouve avec le théorème de Rice:
Soit S une propriété non triviale de 1 qu'une machine de Turing accepte. Cela signifie qu’il existe au moins une machine de Turing qui accepte une entrée avec la propriété S et une autre qui ne le fait pas.
Alors, il est indécidable si une machine de Turing donnée accepte une entrée avec la propriété S.
Vous voulez savoir si une machine de Turing accepte même des nombres entiers? Indécidable.
Vous voulez savoir si une machine de Turing accepte des séquences arithmétiques? Indécidable.
Vous pouvez raisonner sur les tripes de Turing Machine en général. Vous pouvez raisonner sur une machine de Turing particulière et prouver si elle arrêtera / acceptera une séquence / etc. Mais vous ne pouvez pas savoir si votre technique fonctionnera sur la prochaine machine de Turing que vous lui donnerez.
1 Par
property of
cela n'inclut pas le mécanisme de l'acceptation, mais seulement de ce qui est accepté. "Il accepte en 100 étapes ou moins" est une propriété comme il accepte, pas de ce qui est accepté.la source
Vous avez raison de dire que le problème d’arrêt, tel qu’il est couramment présenté et énoncé, n’est qu’un piège. Cela ne prouve pas qu'il ne peut pas y avoir de fonction à trois valeurs («arrêts», «boucles», «ne sait pas») qui, dans la pratique, renvoie toujours des «arrêts» ou des «boucles» et ne renvoie que «don» t ne sais pas »pour les coins spécialement construits par exemple.
Le problème d’arrêt est important pour deux raisons:
1) C’est l’un des premiers problèmes manifestement indécidables. Même si, de manière hypothétique, il n'y avait qu'un seul "ne sait pas", cela présenterait toujours un intérêt mathématique énorme.
2) Certains problèmes réduisent au problème d’arrêt où un attaquant malveillant peut fournir le cas à analyser. Cela nous oblige à accepter qu'il puisse y avoir des cas valables qu'il nous reste à rejeter.
Après coup, l'analyse logicielle est un problème difficile, même si de nombreux progrès ont été réalisés dans l'analyse et dans la conception de la langue afin de faciliter l'analyse. Si vous pouvez montrer qu’une tâche donnée ressemble à une analyse logicielle, oui, c’est difficile avec un H. majuscule. sténographie pour cette observation.
la source
Eric Hehner a avancé un argument contrariant dans une série de documents qui soutiennent que la non-solubilité du problème de l'arrêt est généralement mal comprise. Les articles "Epimenides, Gödel, Turing: un éternel enchevêtrement d'or", "Problèmes liés au problème de l'arrêt", "Reconstruction du problème de l'arrêt" et "Arrêt du problème" sont disponibles ici . Pour que cette réponse ne soit pas "seulement un lien", je vais essayer de résumer l'une de ses conclusions, mais pas l'argument.
la source
Je voudrais proposer une explication différente de l’importance du problème persistant qui concerne les personnes plutôt que les machines.
Il s’agit de la dernière conférence du cours de structure et d’interprétation du MIT 1986 ; le professeur demande "Y a-t-il des questions?" et se prépare à mettre fin à la conférence, lorsqu'un des étudiants demande: "Est-ce la dernière question?"
Pensez-y un instant. Comment l'enseignant peut-il répondre à cela? Si l'élève décide de contredire l'enseignant, l'enseignant n'a pas de réponse valable à donner - c'est comme si le problème était stoppant.
Nous avons l'habitude de penser de manière abstraite au problème qui nous pose problème, en utilisant des fonctions et des machines, mais c'est beaucoup plus profond que cela. Fondamentalement, cela signifie qu'il existe des questions parfaitement valables auxquelles il est impossible de répondre.
PS: Si vous ne savez pas de quel parcours je parle, allez le regarder, c'est génial.
la source
doesHalt(programCode, input);
, le programme ne peut pas savoir ce que ladoesHalt
fonction retourne. Il est impossible que le programme se désactive une fois que ladoesHalt
fonction l'a évalué.Je peux facilement écrire un programme qui donne une entrée n, ou le premier plus petit p> n, tel que p + 2 est aussi un premier, ou qui tourne toujours si aucun tel p n'existe. Si vous pouvez résoudre le problème et prédire si mon programme s'arrête pour chaque entrée, vous venez de résoudre la conjecture Twin Prime.
Il est tout à fait possible que cette hypothèse soit indécidable, auquel cas nous aurions un programme simple dans lequel le programme d’arrêt échouerait.
la source