[Ceci n'est pas un troll : c'est juste une question sur une incompréhension de ma part, que je vais exposer :]
Bonjour à tous,
On peut voir une preuve de l'indécidabilité algorithmique du problème de l'arrêt sur wikipédia et wikipedia en anglais.
Ces deux preuves sont en fait la même, si je ne me trompe (celle de la version anglaise étant juste un peu plus détaillée), et il semble que cette preuve est couramment admise.
Mon problème, c'est qu'en réutilisant le même raisonnement sur des objets sensiblement différents, j'aboutis à des conclusions absurdes.
Et cependant, je n'arrive pas à voir où est l'erreur, à quel endroit ma preuve diffère en rigueur de celle du problème de l'arrêt.
Voici mon énoncé (qui est écrit dans le style de l'article en français, mais les précisions de rigueur ajoutées dans l'article anglais n'y changent rien) :
On va se restreindre à l'ensemble des fonctions qui s'arrêtent toujours (quels que soient leurs paramètres).
Soit une lettre a correspondant à une chaîne de caractère représentant le "texte" d'une fonction. J'appelle 'a' la fonction correspondante.
Soit la fonction RET(f, p), qui prend en paramètre deux chaînes f et p représentant des fonctions qui existent et qui s'arrêtent.
RET(f, p) retourne 1 si le programme correspondant 'f'(p) retourne 1, et 0 sinon. On suppose que cette fonction RET existe et s'arrête.
Remarque : Il n'importe absolument pas, ici, de savoir comment se comporte la fonction RET si on lui donne en entrée une fonction qui ne s'arrête pas, car on se contentera dans cette preuve de ne lui donner que des fonctions qui s'arrêtent.
Posons maintenant la fonction F comme suit :F est bien définie et s'arrête, puisque par hypothèse, RET existe et s'arrête.Code:function F (chaîne p) { si RET(p, p) = 1, alors retourne 0; sinon retourne 1; }
Or, si on appelle s le texte de la fonction F, que vaudrait alors F(s) ?
Si F(s) vaut 0, c'est (par définition de F) que RET(s,s) vaut 1. Or, RET(s, s) est la fonction qui retourne ce que retourne 's'(s), soit F(s)... d'où : contradiction.
Mais si F(s) vaut 1, c'est que RET(s,s), donc F(s), vaut 0 ! Contradiction.
On en déduirait donc que l'hypothèse de départ est fausse, à savoir : Soit RET n'existe pas, soit RET existe mais ne s'arrête pas.
Mais cette conclusion est absurde, puisque nous avons un exemple concret d'implémentation de RET : Il suffit, pour avoir le résultat de RET(f, p), d'exécuter la fonction 'f'(p), qui par définition s'arrête !
Donc on sait qu'il est possible de trouver une fonction RET qui donne toujours le résultat d'une fonction qui s'arrête et qu'on lui passe en paramètre (donc RET doit exister et s'arrêter...).
Ce qui entre en contradiction avec le raisonnement ci-dessus.
Avez-vous une idée de l'origine de cette absurdité ? Quel écart de rigueur ai-je fait par rapport à la preuve de l'indécidabilité du problème de l'arrêt ?
Merci pour vos réponses !
-----