Méta : J'ai proposé une petite énigme la semaine dernière, qui m'était venue en réfléchissant à des questions autour de la logique et de la calculabilité (j'ai ajouté successivement un indice et la réponse, donc si vous aviez lu l'énigme et l'aviez trouvée intéressante mais sans aller jusqu'à la réponse, vous pouvez y jeter un nouveau coup d'œil). Avec toutes mes excuses aux >99.9% de mes lecteurs qui ne sont pas amusés par ce genre de choses, je vais finir l'année en en proposant une autre, un peu dans le même esprit mais néanmoins bien différente, qui m'est aussi venue en réfléchissant à des questions adjacentes. Je ne sais vraiment pas si elle est difficile (plus que la première ? moins ?), parce que pendant que j'y réfléchissais, je n'arrêtais pas de me tromper sur l'énoncé, de m'embrouiller sur ce que je voulais demander, et finalement de ne plus savoir du tout où j'en étais ; j'ai régulièrement cru me persuader que « non, ce n'est pas possible du tout, ce truc », et finalement la réponse m'a semblé étonnamment bête, du genre « mais comment je n'ai pas vu ça ? », peut-être parce qu'il faut penser out of the box comme on dit, ou peut-être que je m'obstinais un peu trop à réfléchir dans les mêmes lignes que l'énigme précédente. Bon, cette fois je ne vais pas trop essayer de faire semblant de m'adresser au grand public, donc même si je vais écrire un scénario tarabiscoté pour rendre l'énigme formellement indépendante, je suppose en fait qu'on connaît les bases de calculabilité et qu'on sait ce qu'est un ensemble décidable, un algorithme, ce genre de choses. (La version formulée mathématiquement, que je donne à la fin, est beaucoup plus simple que l'énigme précédente, et certainement plus simple que mon scénario tarabiscoté.)
L'énigme
Le cruel Docteur No (connu pour ses méfaits précédemment
racontés ici, là, là, là
et encore là — et j'en ai peut-être
oublié au passage) est à la recherche d'inspiration pour une nouvelle
torture pour mathématiciens. Ayant construit un Ordinateur
Infini[#], il s'apprête à
choisir une question, pour chaque entier n, dont la réponse
est soit oui
, soit non
, de manière à ce qu'il soit
impossible de calculer algorithmiquement la réponse en fonction
de n : ces pauvres mathématiciens, qui ne disposent que de
vulgaires ordinateurs (i.e., machines de Turing) seront donc
incapables de répondre à la question, et le Docteur No jubile de
l'impossibilité devant laquelle il va les placer.
Mais voilà que son code de l'honneur de grand méchant se rappelle à lui : ses énigmes doivent avoir une solution ! Il doit toujours y avoir un moyen de s'en sortir. Demander de calculer une fonction non-calculable n'est pas du jeu.
Le mathématicien capturé aura donc le droit de faire calculer par
l'Ordinateur Infini une indication pour chaque question, sous forme
d'un entier naturel h(n), qui lui sera donnée
avec la question. Bon, mais comme ça ce serait vraiment trop facile.
Donc en fait le Docteur No va mettre deux limitations sur cette
indication : d'abord, il n'y aura une indication choisie par le
mathématicien que quand la réponse à la question est oui
;
quand la réponse est non
, le mathématicien se verra donnée
une fausse indication, choisie par le Docteur No (et
évidemment, aucune façon de savoir si on a affaire à une vraie ou
fausse indication). Ensuite, l'indication sera donnée non pas comme
l'entier h(n) mais comme un
programme q (ne prenant pas d'entrée, et choisi par
Docteur No en même temps que n) qui
calcule h(n) : en cas de fausse indication
(i.e., si la réponse attendue est non
), le programme pourrait
ne jamais terminer du tout, ou pourrait terminer et renvoyer n'importe
quoi (ou même ne pas être un programme du tout, mais ça ce n'est pas
intéressant parce que c'est trop facile à tester) ; en revanche, en
cas de vraie indication (i.e., si la réponse attendue est oui
),
le programme fourni terminera en temps fini et
renverra h(n) (mais sans aucune autre garantie
que ça). Avec ces données n (la question) et q
(le programme calculant — peut-être — l'indication), le mathématicien
doit (algorithmiquement !) calculer la réponse attendue, sachant que
l'énigme doit faire que ce ne soit pas possible
sans q.
Comment le Docteur No va-t-il choisir son énigme pour que le problème soit faisable, et comment le mathématicien capturé va-t-il choisir les indications ?
[#] Ce peut calculer l'Ordinateur Infini n'est pas très pertinent ici. Disons par exemple qu'il peut calculer n'importe quoi dont on peut démontrer l'existence. Mais si on veut par exemple imaginer que c'est une machine hyperarithmétique, on peut.
Comme mon scénario est assez tarabiscoté (franchement, si vous trouvez une meilleure façon de raconter l'histoire, dites-le moi !), voici une version mathématiquement précise de ce que je demande de prouver :
Montrer qu'il existe une fonction d:ℕ→{0,1} non calculable (ce sont les réponses attendues, avec ‘0’ pour
nonet ‘1’ pouroui) et une fonction h:ℕ→ℕ (nécessairement non calculable ; ce sont les indications ; la valeur de h(n) n'aura d'importance que si d(n)=1 donc on peut se limiter définir h sur d−1({1})) telles qu'il existe un algorithme p qui, donné un n∈ℕ et un q comme on va le dire, termine toujours en temps fini et calcule d(n). La garantie sur q est que si d(n)=1 alors q est un programme sans entrée[#2] qui termine en temps fini et renvoie h(n) (en revanche, si d(n)=0 alors il n'y a aucune sorte de garantie sur q, c'est une donnée finie arbitraire).
[#2] Pour qu'il n'y ait pas de confusion possible : q ne prend pas n en entrée : il (q) est donné en même temps que n, et la garantie est que si d(n)=1 alors pour ce n-là, le programme q (qui ne prend pas d'entrée du tout) termine et renvoie h(n).
Je ne sais pas si j'ai vraiment d'indication à donner, cette fois-ci : je vois mal comment en donner une sans donner directement la solution : je sais juste qu'on peut partir dans la mauvaise direction et avoir l'impression que cette énigme est complètement insoluble, ou bien se dire qu'en fait c'est juste idiot. Sans que ce soit une indication (et je ne me prononce pas sur le fait que ça aide au problème général), on peut éventuellement commencer par réfléchir à la version plus simple où q est directement la valeur de h(n) dans le cas où d(n)=1, au lieu d'être un programme qui la calcule.
Une fois de plus, j'écrirai la réponse dans quelques jours en éditant ce billet. En attendant, à défaut de trouver la solution, vous pouvez aussi proposer une façon plus claire que moi de présenter l'énigme ! (Vous pouvez aussi vous plaindre si les termes de l'énigme ne sont pas clairs.)
La réponse
[Section ajoutée .]
Voici la solution que je propose (j'ai peur qu'elle soit complètement incompréhensible si on n'a pas un minimum d'habitude de la calculabilité, mais j'ai quand même fait des efforts minimaux pour rappeler quelques conventions du domaine).