Calculabilité et décidabilité : fiche de révision
Un programme est une donnée, équivalence des langages de programmation, problème de l'arrêt et son indécidabilité : les limites théoriques de l'informatique expliquées simplement.
1Un programme est une donnée
Un programme est un texte : on peut le stocker dans un fichier, le lire, le copier, le passer en argument à un autre programme. C'est ce que font un interpréteur (Python exécute le texte de votre script), un compilateur (il traduit un programme en un autre) ou un antivirus (il analyse des programmes). En Python, la fonction exec exécute une chaîne de caractères contenant du code.
Cette idée, formalisée par Turing dans les années 1930 (machine universelle capable de simuler n'importe quelle autre machine à partir de sa description), est le fondement de l'ordinateur : une même machine exécute tous les programmes au lieu d'être câblée pour une seule tâche.
Conséquence importante : on peut raisonner sur les programmes eux-mêmes (écrire un programme qui prend un programme en entrée et répond à une question sur lui). La suite du chapitre montre que certaines de ces questions n'ont aucune réponse algorithmique.
2Calculabilité et équivalence des langages
Une fonction est calculable s'il existe un algorithme (un programme) qui, pour toute entrée, termine et renvoie sa valeur. La thèse de Church-Turing affirme que tout ce qui est calculable « intuitivement » l'est par une machine de Turing, et donc par n'importe quel langage de programmation usuel.
Tous les langages de programmation généralistes (Python, C, Java, JavaScript…) sont équivalents en puissance de calcul : tout ce que l'un peut calculer, les autres le peuvent aussi. Ils diffèrent en lisibilité, performance, écosystème, mais pas en calculabilité. On dit qu'ils sont « Turing-complets » : il suffit pour cela de disposer des affectations, des tests, des boucles (ou de la récursivité) et d'une mémoire non bornée.
À l'inverse, un langage qui n'a que des boucles à nombre d'itérations fixé d'avance (sans while ni récursion) ne peut pas calculer toutes les fonctions calculables, mais garantit la terminaison de tous ses programmes. Il y a un compromis fondamental entre puissance d'expression et garantie de terminaison.
3Le problème de l'arrêt est indécidable
Un problème de décision est décidable s'il existe un programme qui répond oui ou non, correctement, pour toute entrée, en un temps fini. Le problème de l'arrêt demande : « étant donné un programme P et une entrée x, P s'arrête-t-il sur x ? » Turing a démontré en 1936 qu'aucun programme ne peut répondre à cette question dans tous les cas.
Démonstration par l'absurde. Supposons qu'il existe une fonction arret(P, x) qui renvoie True si P s'arrête sur x et False sinon. Construisons alors le programme D qui, recevant un programme P, boucle indéfiniment si arret(P, P) renvoie True, et s'arrête sinon. Que fait D appliqué à lui-même ? Si D(D) s'arrête, alors arret(D, D) est True, donc D boucle : contradiction. Si D(D) boucle, alors arret(D, D) est False, donc D s'arrête : contradiction. La fonction arret ne peut donc pas exister.
Il ne s'agit pas d'un manque de puissance des ordinateurs actuels : c'est une impossibilité mathématique, valable pour toute machine future. Elle explique pourquoi aucun outil ne peut détecter toutes les boucles infinies, tous les bugs ou tous les virus : ces problèmes se ramènent au problème de l'arrêt.
4Ce qu'il faut savoir répondre au bac
Les questions portent sur la compréhension des notions plutôt que sur des calculs : expliquer pourquoi un programme est une donnée avec un exemple (interpréteur, compilateur) ; définir calculable et décidable ; énoncer que le problème de l'arrêt est indécidable et en donner l'idée de la preuve ; expliquer pourquoi tous les langages sont équivalents ; distinguer « indécidable » (aucun algorithme ne peut répondre dans tous les cas) de « difficile » (un algorithme existe mais est lent).
Pièges : croire que l'indécidabilité vient de la lenteur des machines ; croire qu'on ne peut jamais savoir si un programme donné s'arrête (pour un programme particulier, on le sait souvent ; c'est le cas général qui est impossible) ; confondre calculabilité (existe-t-il un algorithme ?) et complexité (combien coûte-t-il ?) ; penser qu'un langage plus récent est « plus puissant » qu'un autre au sens de la calculabilité.
Définitions à connaître par cœur
Quiz : teste-toi sur calculabilité et décidabilité
8 questions corrigées. Réponds avant d'ouvrir la correction !
1. Que signifie « un programme est une donnée » ?
- A.Qu'un programme ne peut pas être modifié
- B.Qu'un programme peut être lu, stocké et traité par un autre programme
- C.Que les données sont des programmes
- D.Qu'un programme n'a pas besoin de données
Voir la réponse
Réponse : B. Qu'un programme peut être lu, stocké et traité par un autre programme
Un interpréteur ou un compilateur prend un programme en entrée comme n'importe quelle donnée.
2. Le problème de l'arrêt est…
- A.décidable mais lent
- B.indécidable
- C.décidable pour Python seulement
- D.résolu par les processeurs modernes
Voir la réponse
Réponse : B. indécidable
Aucun programme ne peut décider dans tous les cas si un programme donné s'arrête : impossibilité mathématique.
3. Python est-il plus puissant que C au sens de la calculabilité ?
- A.Oui, il est plus récent
- B.Non, tous les langages généralistes calculent les mêmes fonctions
- C.Oui, grâce aux bibliothèques
- D.Non, C est plus puissant
Voir la réponse
Réponse : B. Non, tous les langages généralistes calculent les mêmes fonctions
Ils sont tous Turing-complets : équivalents en calculabilité, différents en performance et en confort.
4. Un problème indécidable est un problème…
- A.trop lent à résoudre
- B.pour lequel aucun algorithme ne répond correctement dans tous les cas
- C.sans énoncé précis
- D.qui n'a pas de solution pour certaines entrées
Voir la réponse
Réponse : B. pour lequel aucun algorithme ne répond correctement dans tous les cas
Il ne s'agit pas de lenteur mais d'inexistence d'un algorithme général ; des cas particuliers restent résolubles.
5. Quelle technique de preuve établit l'indécidabilité de l'arrêt ?
- A.Récurrence
- B.Raisonnement par l'absurde (auto-application)
- C.Dichotomie
- D.Exhaustion
Voir la réponse
Réponse : B. Raisonnement par l'absurde (auto-application)
On suppose la fonction arret et on construit un programme qui se contredit lorsqu'on l'applique à lui-même.
6. Quel outil illustre qu'un programme peut prendre un programme en entrée ?
- A.Un clavier
- B.Un compilateur
- C.Un écran
- D.Un disque dur
Voir la réponse
Réponse : B. Un compilateur
Le compilateur lit le texte d'un programme et produit un autre programme : le programme est sa donnée.
7. Un langage sans boucle while ni récursivité…
- A.est Turing-complet
- B.garantit la terminaison mais ne calcule pas toutes les fonctions calculables
- C.ne peut rien calculer
- D.est plus puissant que Python
Voir la réponse
Réponse : B. garantit la terminaison mais ne calcule pas toutes les fonctions calculables
Des boucles bornées à l'avance terminent toujours, au prix d'une perte d'expressivité.
8. Peut-on savoir si un programme précis, par exemple une boucle for de 1 à 10, s'arrête ?
- A.Non, jamais, à cause du problème de l'arrêt
- B.Oui : l'indécidabilité concerne le cas général, pas chaque programme particulier
- C.Seulement en l'exécutant
- D.Seulement en C
Voir la réponse
Réponse : B. Oui : l'indécidabilité concerne le cas général, pas chaque programme particulier
L'indécidabilité interdit un algorithme universel ; pour de nombreux programmes, une preuve directe existe.
Questions fréquentes
Pourquoi le problème de l'arrêt est-il si important ?
Parce qu'il fixe une limite absolue à ce que l'informatique peut faire : aucun outil ne pourra jamais détecter tous les bugs, tous les virus ou toutes les boucles infinies, quels que soient les progrès des machines.
Faut-il connaître la machine de Turing ?
Pas en détail : il faut savoir qu'il s'agit du modèle théorique de calcul de référence, que tous les langages usuels lui sont équivalents, et que Turing a prouvé l'indécidabilité de l'arrêt en 1936.
Quelle est la différence entre calculabilité et complexité ?
La calculabilité demande si un algorithme existe ; la complexité mesure son coût en temps ou en mémoire. Un problème peut être calculable mais pratiquement hors de portée (temps exponentiel), ou carrément non calculable.
Comment rédiger l'idée de la preuve au bac ?
En trois phrases : on suppose qu'un programme arret(P, x) existe ; on construit D qui boucle si arret(D, D) répond oui et s'arrête sinon ; D appliqué à lui-même contredit arret dans les deux cas, donc arret n'existe pas.
