Les malentendus zombies de l’informatique théorique
(scottaaronson.blog)- En informatique théorique, la calculabilité et le caractère NP-hard sont des notions qui s’appliquent à des fonctions, des langages et des suites infinies, et non à des entiers isolés ni à une seule question vraie ou fausse
- Dans l’exemple de Sipser, « la fonction f qui renvoie toujours 1 si Dieu existe, et toujours 0 sinon » est, dans les deux cas, une fonction constante, donc calculable
- P vs NP n’est pas un problème prenant une entrée, mais une unique question oui/non ; on ne peut donc pas le qualifier en lui-même de NP-hard ni d’incalculable
- La fonction Busy Beaver dans son ensemble est incalculable, mais une valeur précise comme BB(6) ne peut pas être traitée de la même façon, puisque pour tout entier k il existe un programme
print k - Le cœur de la confusion récurrente consiste à appliquer à des problèmes individuels des notions conçues pour des objets infinis ; l’habitude de mélanger l’incalculabilité du problème de l’arrêt et l’incomplétude de Gödel relève de la même famille
Ce que l’exemple de Sipser enseigne sur la portée de la calculabilité
- Introduction to the Theory of Computation de Michael Sipser contient un exercice qui met en évidence la définition de la calculabilité
- On définit f:{0,1}*→{0,1} comme une fonction qui renvoie toujours 1 si Dieu existe, et toujours 0 s’il n’existe pas
- La question est de savoir si f est calculable, et la réponse est indépendante de toute croyance religieuse
- f est calculable
- La fonction constante qui renvoie toujours 1 est calculable
- La fonction constante qui renvoie toujours 0 est également calculable
- Si f est l’une des deux, alors f est elle aussi calculable
- Des questions parallèles ayant la même structure donnent la même intuition
- Dans la question « si Dieu existe, n=3, sinon n=5 ; n est-il premier ? », même si n n’est pas complètement déterminé, la seule information qu’il appartient à {3,5} suffit à dire qu’il est premier
- De même, pour f, seule change la fonction constante concernée ; elle est suffisamment déterminée pour qu’on puisse la juger calculable
La calculabilité ne porte pas sur la difficulté d’écrire un programme, mais sur son existence
- La calculabilité est une notion qui s’applique aux fonctions ou aux suites infinies
- On ne l’applique pas de la même manière à des questions oui/non individuelles ni à des entiers isolés
- La question centrale est de savoir s’il existe un programme informatique qui associe les entrées aux sorties
- La difficulté de choisir, trouver ou écrire ce programme ne fait pas partie de la définition de la calculabilité
- Même s’il fallait résoudre la question de l’existence de Dieu pour écrire le programme, le jugement de calculabilité lui-même ne changerait pas
Pourquoi on ne peut pas qualifier P vs NP de NP-hard
- La question « la question P versus NP elle-même est-elle NP-hard et donc insoluble ? » est revenue plusieurs fois au cours des 25 dernières années
- NP-hard s’applique à des fonctions ou des langages qui prennent une entrée, comme 3SAT, Independent Set ou Clique
- L’entrée est une formule booléenne, un graphe, etc.
- La sortie est la réponse correspondant à cette entrée
- Un problème est dit NP-hard si, lorsqu’on peut le résoudre en temps polynomial, toutes les langues ou fonctions de NP peuvent aussi être résolues en temps polynomial via une réduction
- P vs NP n’est pas une fonction ni un langage, mais une unique question oui/non
- La possibilité que sa réponse soit indépendante des axiomes de la théorie des ensembles de Zermelo-Fraenkel n’est pas exclue
- Mais on ne peut pas dire que cette question elle-même est incalculable ou NP-hard
- Il existe formellement un programme rapide qui répond correctement à la question P vs NP
- Si P=NP, un programme qui affiche « P=NP »
- Si P≠NP, un programme qui affiche « P≠NP »
La même confusion qui revient avec Busy Beaver
- Des questions similaires sont revenues dans les commentaires d’un article où la valeur de Busy Beaver 5 avait été déterminée
- « Quel est le plus petit n pour lequel la valeur de BB(n) devient incalculable ? »
- « BB(6) pourrait-il déjà être incalculable ? »
- La fonction Busy Beaver est incalculable
- Mais on n’applique pas ainsi la notion de calculabilité à un entier individuel comme BB(6)
- Quelle que soit la valeur entière k qui s’avère être BB(6), il existe un programme
print k - Ce programme affiche cet entier
- Quelle que soit la valeur entière k qui s’avère être BB(6), il existe un programme
- La question que l’on peut plutôt poser est de savoir pour quels n la valeur de BB(n) est indémontrable dans un système d’axiomes comme la théorie des ensembles ZF
- Aaronson et Adam Yedidia ont traité cette question en 2016
- Le record actuel est n=745, une amélioration de la valeur n=8000 d’Aaronson et Adam
- Tout entier spécifique peut être considéré comme « calculable » ; ce qui est incalculable, c’est la fonction BB dans son ensemble
Pourquoi ces « malentendus zombies » continuent de survivre
- Le cœur de la confusion récurrente est d’appliquer à tort à des entiers individuels et à des problèmes ouverts des notions conçues pour des suites infinies et des fonctions
- Les cas où l’on mélange l’incalculabilité du problème de l’arrêt et l’incomplétude de Gödel relèvent de la même famille de confusions
- Les deux sont étroitement liés
- Gödel permet de parler d’énoncés individuels
- La calculabilité de Turing n’est pas relative à un système d’axiomes particulier : c’est une notion absolue
- Cette explication sert de point de référence vers lequel renvoyer lorsque le même malentendu pédagogique réapparaît
- La dernière question porte sur la manière dont on pourrait faire taire ces malentendus « zombies »
1 commentaires
Avis sur Hacker News
Le fait que la notion de calculabilité implique nécessairement l’infini peut être assez contre-intuitif.
Par exemple, si l’on demande s’il existe un algorithme qui calcule la complexité de Kolmogorov K(s) pour une chaîne arbitraire s, la réponse est, comme on le sait, « non ». Il n’existe pas de machine de Turing qui prenne en entrée une chaîne de longueur arbitraire et calcule K(s), et la preuve est courte en utilisant le problème de l’arrêt.
Mais si l’on demande s’il existe un algorithme qui calcule K(s) pour une chaîne arbitraire s de longueur inférieure à n, la réponse est « oui ». Pour n’importe quel n, un tel algorithme existe.
La méthode, assez décevante, consiste à construire une machine de Turing dotée d’une énorme table de correspondance contenant les valeurs de K(s) pour les 2^n chaînes possibles. La façon dont on obtient effectivement cette table est une autre question ; comme une implémentation donnée possède une description finie et que K(s) est fini pour tout s, l’algorithme existe.
Ainsi, une question finie portant sur des objets finis peut ne pas être très intéressante du point de vue de la calculabilité. On peut toujours écrire un programme qui imprime toutes les réponses ; ce n’est que lorsque la question s’étend à un ensemble infini d’objets qu’il devient intéressant de savoir si quelque chose de fini peut répondre à une infinité de questions.
En réalité, l’infini tient lieu de « comportement approximatif, ultime, en régime permanent, pour des N assez grands pour dépasser n’importe quelle astuce ponctuelle ».
Dans le monde réel, ces astuces comptent aussi, et les constantes ainsi que les termes d’ordre inférieur ignorés dans les comparaisons en grand O sont importants pour les performances réelles. Il existe toujours une tension entre « un problème assez grand pour que les facteurs constants n’aient plus d’importance » et « un problème assez petit pour entrer dans le domaine implicitement visé par le mot constante ». C’est le cas, par exemple, lorsque des entiers 32 bits se font passer pour des entiers.
Du point de vue de l’infini, tous les nombres finis sont en fait minuscules. Assis sur une chaise au bout de l’univers, un mile ne diffère pas d’un millimètre.
Ce scénario ressemble en pratique à « l’hôtel infini de Hilbert sur un ordinateur ». En décalant les programmes existants d’une case, on peut ajouter un nouveau programme, et la taille de la table nécessaire au calcul reste la même.
Plus généralement, la plupart des gens ont une intuition faible de la façon dont fonctionnent l’infini, les alephs et les mathématiques transfinies. Leur pertinence dans la vie courante est faible, et ils sont profondément liés aux propriétés émergentes des mathématiques, de la théorie des catégories et de la théorie des ensembles. L’infini n’est pas seulement plus grand que n’importe quel nombre fini ; certains infinis peuvent aussi être plus grands que d’autres, ce qui n’apparaît pas immédiatement à une intuition restée au concept élémentaire d’« infini ».
La question la plus intéressante serait de savoir s’il existe un certain n < ∞ qui rende l’algorithme calculable ; évidemment, la réponse est non, et le prix Turing s’envole.
L’idée serait d’énumérer toutes les machines de Turing possibles, de la plus courte à la plus longue, jusqu’à en trouver une qui affiche s. Si l’on a essayé toutes les machines plus courtes et qu’aucune n’a affiché s, alors on a trouvé la machine la plus courte qui affiche s, et sa longueur vaut donc K(s). D’autres machines de même longueur ou plus longues peuvent aussi afficher s, mais K(s) étant défini par la longueur minimale, cela ne change rien.
D’après mon expérience, sur ce point, les mathématiques constructivistes correspondent mieux à l’intuition des gens que l’informatique classique.
Par exemple, il n’existe pas encore de preuve constructive de l’existence d’un programme qui affiche la réponse au problème P=NP.
J’ai aussi traité cette question dans mon article à propos des ensembles de Julia calculables. Mark Braverman a prouvé que tous les ensembles de Julia quadratiques sont calculables, mais il explique lui-même que sa preuve n’est pas uniformément calculable. À la place, il construit 5 machines qui, en recevant les paramètres de l’ensemble de Julia voulu, tentent de dessiner différents ensembles à la résolution souhaitée, et pour chaque ensemble de Julia, l’une d’entre elles produit le dessin correct.
En mathématiques constructivistes, la notion constructive d’ensemble compact correspond grosso modo à la notion d’ensemble calculable nécessaire pour les ensembles de Julia calculables. Mais on ne peut pas prouver constructivement que tous les ensembles de Julia quadratiques sont compacts ; il faut diviser le plan complexe des paramètres possibles en plusieurs régions, puis prouver que, dans chaque région, les ensembles de Julia correspondants sont compacts.
En mathématiques classiques, l’union de ces régions est tout le plan complexe, mais en constructivisme ce résultat ne vaut pas. De même, en mathématiques classiques, l’union des réels positifs et des réels non positifs est toute la droite réelle, mais en constructivisme cela ne vaut pas non plus.
L’approche constructiviste dit précisément quelles informations supplémentaires sont nécessaires pour réaliser effectivement le calcul. Autrement dit, il faut déterminer à quelle région du plan complexe appartient le paramètre donné, afin de savoir laquelle des 5 machines exécuter pour obtenir l’image voulue. Cette réponse paraît beaucoup plus satisfaisante.
Les gens savent instinctivement qu’il faut savoir de quel côté du branchement on se trouve ; ils n’ont pas oublié ce fait à cause d’un entraînement à la logique classique, c’est tout.
Je me demande aussi s’il faut considérer qu’il existe une preuve encore non trouvée à la question « laquelle des 5 est la bonne », ou bien que c’est indécidable comme dans ZFC.
Je pense que c’est l’un des éléments qui rendent difficile la compréhension de l’indécidabilité du problème de l’arrêt
On a envie de dire : « il existe des machines trop complexes pour qu’une quelconque machine puisse déterminer si elles s’arrêtent ou non », mais, entre les programmes triviaux
return trueetreturn false, l’un des deux donne toujours la bonne réponse, quels que soient la machine et l’entrée qu’on lui fournitOn pourrait vouloir répliquer que « ces programmes ne savent rien des machines de Turing, donc il faut les exclure », mais la décidabilité ne parle pas de cela. On pourrait aussi penser que « déterminer lequel des deux programmes est correct est indécidable », mais là encore, il existe une réponse fixée, vraie ou fausse. Le problème ne peut devenir indécidable que lorsqu’on l’étend à un ensemble infini de couples machine/entrée
Par exemple, tout espace vectoriel de dimension finie est isomorphe de plusieurs façons à son espace dual et à son bidual, mais, dans le second cas, on peut choisir un isomorphisme « naturel » cohérent sur tous ces espaces, alors que ce n’est pas possible dans le premier
Cela entraîne des confusions du genre : « Pourquoi ne sont-ils pas naturellement isomorphes ? Les bases ont la même longueur ! En quoi est-ce important que cela dépende ou non d’une base ? Pourquoi, dans d’autres preuves, choisit-on une base et cela ne pose pas problème ? »
Je pense que le problème de formulation vient du fait qu’il faudrait de la logique modale
« Si Dieu existe, posons f:{0,1}*→{0,1} comme la fonction constante 1 ; si Dieu n’existe pas, comme la fonction constante 0. f est-elle calculable ? Indice : la réponse ne dépend pas de vos croyances religieuses »
La question exacte est de savoir si f serait calculable, c’est-à-dire s’il existe une machine de Turing M telle que, pour tout x, f(x)=M(x)
La réponse est oui. Dans n’importe quel monde, il existe une machine de Turing triviale M=1_M ou M=0_M. En revanche, la formulation d’origine, « f est-elle calculable », est une question modalement mal posée, proche d’une question syntaxiquement incorrecte comme dans les paradoxes de la Belle au bois dormant ou de l’Enveloppe rouge
D’un autre point de vue, la dépendance à Dieu, ou à un fait qui pourrait être réel, ressemble à une directive de compilateur ou à un pragma dont la valeur sera remplie plus tard, mais fixée avant l’utilisation. Si l’on pose correctement la question, ce n’est qu’un exercice consistant à dérouler les définitions rigoureuses de fonction et de calculabilité, toutes deux explicitement définies chez Sipser
Elle dit que le référent de l’étiquette f est la fonction constante 1 si Dieu existe, et la fonction constante 0 s’il n’existe pas ; nous ne savons simplement pas laquelle des deux c’est tant que nous ne savons pas si Dieu existe. Comme la calculabilité des deux fonctions constantes est triviale, il s’agit en réalité moins d’un problème de calculabilité que d’un problème d’étiquette
Ce n’est pas surprenant si l’on considère que le fait même que la théorie des probabilités fonctionne lorsqu’elle est appliquée au réel est très mystérieux et a fait l’objet de nombreuses recherches scientifiques et philosophiques
La solution proposée sous la forme « would f be » ne semble pas vraiment résoudre grand-chose non plus. Le but de la question sur « Dieu » est d’amener le lecteur à sortir d’un problème P-NP particulier et à comprendre que, pour les fonctions constantes, la notion de calculabilité n’est pas utile. Pour que cette proposition aide, elle devrait aussi pouvoir s’appliquer à la question P-NP d’origine, et je ne vois pas encore comment une approche modale intervient dans une question mathématique bien définie
« Si Dieu existe, posons f:{0,1}→{0,1} comme la fonction constante 1 ; si Dieu n’existe pas, posons f:{0,1}→{0,1} comme la fonction constante 0 »
Savoir si un tel prédicat correspond à la conception que quelqu’un se fait de Dieu est une question non mathématique distincte
C’est similaire à la surprise que ressentent les gens lorsqu’ils apprennent qu’en logique classique, une proposition fausse implique n’importe quoi. Les mathématiques ont des règles formelles strictes, et il est important de mettre de côté les idées préconçues venues du sens courant de mots comme « implique » ou « si »
Par exemple, définir G:t∈ℝ⁺->{0,1} comme valant 1 si Dieu existe au temps t, et 0 sinon
Bien sûr, analyser G dans un référentiel non inertiel rendrait la chose encore plus intéressante
Sipser exploite le fait que la plupart des gens ne distinguent pas bien le calcul de l’enquête empirique
« Dieu existe-t-il ? » est peut-être une question à laquelle on ne peut pas répondre, mais ce n’est pas le sujet. Chercher cette réponse ne relève pas du calcul au départ. Le calcul n’est qu’une procédure qui associe des entrées à des sorties, et, dans ce cas, l’existence de Dieu est l’une des entrées
La confusion vient du fait qu’on ne peut pas réellement connaître la valeur d’entrée, mais le programme existe toujours, et c’est un programme trivial. On pourrait remplacer cela par n’importe quelle autre question empirique binaire
Par exemple, supposons que f:{0,1}* -> {0,1} vaille 1 « s’il y a au moins des toilettes mobiles à Paris », et 0 sinon. C’est calculable, et on peut aussi l’exécuter effectivement avec l’entrée vraie. La fonction portant sur Dieu est elle aussi calculable, mais on ne peut l’exécuter qu’avec une entrée supposée. Même si l’on ne peut pas garantir que la sortie corresponde de façon significative à l’univers dans lequel nous vivons, cela reste une fonction calculable
Plus simplement, il suffit même de considérer f:{0,1}* -> {0,1}. « Dieu existe » et « Dieu n’existe pas » sont chacun des chaînes de bits possibles. Si l’on demande s’il peut exister un programme qui prend l’une de ces chaînes en entrée et renvoie 0, et l’autre en entrée et renvoie 1, la réponse est évidemment oui. Que l’entrée soit empiriquement vraie ou non n’a aucune importance
Le f de la question n’est pas une fonction, mais une étiquette. Si Dieu existe, le référent de f est f1, qui renvoie toujours 1 ; si Dieu n’existe pas, c’est f0, qui renvoie toujours 0. Donc, en pratique, ce n’est pas un problème de calculabilité, mais un problème d’étiquette
Cela arrive constamment parce que les mathématiciens et les informaticiens utilisent, pour faciliter la discussion, des formulations abrégées qui omettent des détails.
Ce n’est pas différent de dire « multiplier les deux membres par dx ». La question « le problème du voyageur de commerce est-il NP-difficile ? » désigne une famille de problèmes, pas une instance particulière. Si l’on fixe un graphe précis, il n’y a évidemment plus de N, donc ce n’est pas NP-difficile.
Quand on le sait, c’est tellement évident que cela ne vaut même pas la peine d’être dit, mais pour quelqu’un qui ne connaît pas le sens des termes, c’est totalement inaccessible.
J’ai moi aussi eu par le passé un malentendu du même genre dans un autre domaine. Je voyais l’ADN comme du code, et je croyais que des choses échangeant des messages via des substrats, directement ou en modifiant l’ADN, exécutaient ce code. Globalement, ce n’est pas un modèle complètement inutile, mais il fallait savoir à quels moments ne pas se laisser intoxiquer par ce modèle.
Pour un biologiste ayant une formation mathématique, voir l’ADN tel quel comme un modèle d’exécution de machine de Turing est manifestement faux, mais ça ne l’était pas pour moi. Au fond, c’est un problème lié à l’étrangeté des connaissances de base.
Des mots comme décidabilité, calculabilité, existence, et même fruit, n’ont pas le même sens dans un contexte académique et dans un contexte courant. Si l’on importe l’intuition du sens quotidien dans un contexte académique, on obtient ce genre de « questions idiotes ».
Un certain très grand nombre mentionné sur Wikipedia « existe » et est « calculable » au sens académique, mais le nombre de ses chiffres ne pourrait pas tenir dans notre univers.
Si l’on ne lit pas attentivement, la formulation prête à confusion.
Dans « si Dieu existe, posons f:{0,1}*→{0,1} comme la fonction constante 1 ; si Dieu n’existe pas, comme la fonction constante 0. f est-elle calculable ? », l’alternative ne fait pas partie de la fonction.
La fonction f ne branche pas selon la valeur de « Dieu existe » ; le branchement se situe dans le métalangage. Nous ne savons pas si f=0 ou f=1, mais dans les deux cas, les deux fonctions possibles sont calculables, donc f est calculable aussi.
Plus encore, même si f incluait réellement ce branchement, et que le domaine de la fonction soit 0 (Dieu n’existe pas) et 1 (Dieu existe), elle resterait une fonction calculable au sens où l’on peut calculer le résultat pour chaque valeur du domaine.
Le cœur de la confusion consiste à pousser dans f, comme condition de branchement, une variable libre dont on considère que la valeur est inconnue.
Je contesterais volontiers l’exemple « si Dieu existe, posons n=3 ; si Dieu n’existe pas, posons n=5. n est-il premier ? ».
Ici, on utilise le tiers exclu pour affirmer que n vaut 3 ou 5, alors qu’il n’y a aucune justification que le tiers exclu s’applique à la proposition « Dieu existe ».
Dans ce cas, si l’on veut examiner si le tiers exclu est justifié, il faut aussi justifier pourquoi seul le tiers exclu pose problème. Pourquoi ne pas abandonner aussi le principe d’explosion et travailler en logique paraconsistante ? Kolmogorov voyait lui aussi un sérieux problème dans cet axiome, et le considérait au départ comme incompatible avec la logique constructiviste.
De plus, selon la formalisation exacte de cette proposition, le tiers exclu n’est peut-être pas forcément nécessaire.
Dieu n’est pas nécessairement lié aux lois de la physique ni aux nécessités logiques fondamentales. Une telle conception de Dieu vient d’une certaine lignée de raisonnements théologiques, ce n’est pas le cas général.
S’il le souhaite, Dieu peut aussi rendre 6 impair. Il peut modifier toutes les mathématiques, la cohérence logique et l’univers entier, ou créer un monde où seul 77 est pair et tous les autres nombres sont impairs, et faire en sorte que tous les mathématiciens considèrent cet arrangement comme parfaitement cohérent et comme ayant toujours été correct.
On peut donc dire que la réponse dépend dans une certaine mesure de la croyance religieuse.
L’informatique théorique et la théorie de la complexité semblent occuper, pour les étudiants de premier cycle en informatique ou les professionnels de secteurs voisins, une place comparable à celle de la physique des particules pour le grand public.
Comme le grand public a entendu parler d’intrication, nous avons entendu parler de NP-difficile, et au lieu de suivre nous-mêmes les développements mathématiques, nous les remplaçons par de mauvaises analogies populaires et des spéculations.
L’auteur a peut-être choisi, en raison d’une longue formation, sa propre définition très stricte de la calculabilité, puis écrit tout un texte sur cette définition particulière du mot, avant d’accuser les gens qui utilisent le même mot avec une autre définition de poser des questions idiotes.
Cela arrive vraiment souvent quand on parle avec des chercheurs au travail ou avec des non-spécialistes. Définir un vocabulaire commun est difficile, et tracer une ligne selon ses propres termes avant de demander aux autres de suivre est épuisant.