Calculabilité et décidabilité
Comprendre le programme comme donnée, distinguer calculabilité et durée, et expliquer l’indécidabilité du problème général de l’arrêt.
Environ 40 minutes
- Identifier un programme traité comme donnée
- Distinguer décision totale et recherche partielle
- Expliquer la contradiction du problème de l’arrêt
Un programme peut-il annoncer sans erreur si n’importe quel autre programme finira par s’arrêter ?
Certains programmes terminent vite, d’autres prennent longtemps, et d’autres ne terminent pas. L’étude de la calculabilité pose une question différente de la performance : existe-t-il un algorithme répondant correctement à chaque entrée d’un problème ? Le problème de l’arrêt permet de montrer une limite générale sans développer toute la théorie des machines abstraites. Nous raisonnons sur des programmes idéalisés, avec des ressources non bornées à l’avance. Une observation limitée dans le temps ne suffit pas à établir une impossibilité mathématique.
1. Un programme peut être une donnée
Un fichier source contient des caractères représentant des instructions. Pour un éditeur, ces caractères sont des données qu’il affiche ou modifie. Pour un interpréteur, ils décrivent les opérations à exécuter. Un compilateur transforme également la représentation d’un programme en une autre représentation. La distinction entre programme et donnée dépend donc de l’activité étudiée : le texte peut être traité par un autre programme avant ou pendant son exécution.
Télécharger un logiciel consiste à transmettre une représentation numérique. Le système peut la stocker, la copier ou l’examiner comme d’autres fichiers. Cela n’exige pas que le logiciel soit exécuté au moment du transfert. Cette possibilité permet aussi d’analyser des programmes : rechercher une instruction dans un texte, vérifier une syntaxe ou exécuter une simulation. Un programme recevant la description d’un autre programme n’est donc pas une idée contradictoire.
Nous notons P un programme et x une entrée. L’expression P(x) désigne l’exécution de P sur x. Lorsque l’entrée est une représentation de programme, il faut distinguer l’objet exécuté et la description fournie en donnée. Par commodité, on utilisera la même lettre pour le programme et sa description lorsque le contexte le précise. Ce choix de notation permet ensuite d’étudier l’exécution d’un programme sur sa propre description.
Exemple résolu
Un outil compte les caractères d’un fichier Python sans exécuter les instructions du fichier. Puis un interpréteur lit ce même fichier pour lancer le calcul. Quel rôle joue le fichier dans chaque opération ?
- Étape 1 : Le compteur de caractères traite une suite de symboles : il ne suit pas les instructions qu’ils représentent.
- Étape 2 : L’interpréteur utilise cette représentation pour effectuer l’exécution décrite.
- Étape 3 : La même représentation peut ainsi être donnée pour le premier outil et programme à interpréter pour le second.
Résultat : Le fichier n’a pas changé de nature physique. Son rôle dépend du traitement effectué par l’outil qui le lit.
Piège à éviter : Affirmer qu’un texte de programme ne peut jamais être une donnée empêcherait d’expliquer l’éditeur, le compilateur et le téléchargement.
À toi d'essayer
Un compilateur reçoit un programme qui calcule une somme. Pour produire son résultat habituel, doit-il nécessairement calculer cette somme sur toutes les entrées possibles ?
Voir la réponseMasquer la réponse
Non. Sa tâche consiste à traduire le programme. Le texte est une donnée du compilateur ; traduire les instructions ne signifie pas effectuer toutes les exécutions décrites.
2. Décider et simplement essayer
Un problème de décision attend une réponse oui ou non pour chaque entrée autorisée. Un décideur est un algorithme qui termine sur toute entrée du domaine et fournit toujours la bonne réponse. Ces deux exigences comptent : terminer en répondant au hasard n’est pas correct, et donner des réponses exactes seulement quand on arrive à terminer n’est pas une décision totale.
Un problème est décidable si un tel algorithme existe. Par exemple, déterminer si un entier naturel est pair est décidable : on calcule son reste dans la division par deux, puis on répond selon que ce reste vaut zéro ou un. Une fonction calculable est, dans le cadre étudié, une fonction dont les valeurs sont obtenues par un algorithme sur le domaine annoncé. Les domaines et le type de résultat doivent donc être spécifiés.
Pour prouver la terminaison d’un programme particulier, on peut souvent exhiber une quantité entière positive ou nulle qui diminue strictement à chaque étape tant que l’exécution continue. Si un compteur naturel n est diminué de un tant qu’il est strictement positif, il atteint zéro. Cet argument porte sur ce programme et ses entrées naturelles ; il ne résout pas le problème de terminaison pour tous les programmes possibles.
Exemple résolu
Le programme reçoit un entier naturel n et répète n = n - 1 tant que n > 0, puis termine. Explique son comportement pour n = 3 et justifie la terminaison pour toute entrée du domaine.
- Étape 1 : Pour 3, les valeurs successives sont 3, 2, 1 et 0. La boucle s’arrête alors.
- Étape 2 : Tant que la boucle continue, le compteur est un entier strictement positif qui diminue d’une unité.
- Étape 3 : Il ne peut pas rester strictement positif après une infinité de diminutions de ce type. Le programme atteint donc le cas d’arrêt.
Résultat : Le programme termine pour tout entier naturel initial. Il effectue exactement n diminutions.
Piège à éviter : Remplacer la condition par n != 0 et autoriser des entrées négatives demanderait un nouvel examen : la mesure ne resterait plus dans les naturels.
Exécuter un programme pendant une heure sans observer d’arrêt n’établit pas qu’il ne s’arrêtera jamais. Il peut avoir besoin d’une heure supplémentaire. Un délai maximal fournit une décision pratique d’abandon d’un essai, pas un décideur mathématique du problème général de l’arrêt. Inversement, observer un arrêt fini prouve la terminaison de cette exécution particulière, sans prouver celle de toutes les entrées.
À toi d'essayer
Un outil répond correctement pour tous les programmes qu’il a rencontrés pendant un mois de tests. Cela démontre-t-il qu’il décide le problème général de l’arrêt ?
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
3. Supposer un décideur général
Le problème général de l’arrêt demande, à partir d’un programme P et d’une donnée x, si l’exécution P(x) termine. On suppose pour raisonner par contradiction qu’un programme H répond correctement et termine pour chaque couple (P, x). Il renvoie oui si P(x) s’arrête et non sinon. H doit lui-même toujours terminer : sans cette exigence, on ne disposerait pas du décideur annoncé.
Grâce à la possibilité de traiter un programme comme une donnée, on construit alors un programme D recevant la description d’un programme Q. D demande à H si Q(Q) s’arrête. Si H répond oui, D se met à boucler sans fin. Si H répond non, D termine immédiatement. La construction est décrite à partir des opérations supposées disponibles : appeler H, tester sa réponse, terminer ou effectuer une boucle infinie.
La question décisive concerne D exécuté sur sa propre description. On demande donc à H ce qu’il prédit pour le couple (D, D). Il ne s’agit pas d’attendre que la machine réalise une infinité d’étapes. On examine séparément les deux réponses possibles d’un outil que l’on a supposé correct et toujours terminant.
Exemple résolu
Sous l’hypothèse de l’existence de H, examine les deux réponses possibles de H(D, D).
- Étape 1 : Si H répond oui, sa prédiction est que D(D) s’arrête. Mais la définition de D impose alors une boucle infinie. H se trompe.
- Étape 2 : Si H répond non, sa prédiction est que D(D) ne s’arrête pas. Mais D termine dans cette branche. H se trompe encore.
- Étape 3 : Les deux réponses sont incompatibles avec la correction universelle supposée de H. Il faut donc rejeter l’hypothèse de son existence.
Résultat : Il n’existe pas de décideur correct et toujours terminant pour le problème général de l’arrêt.
Piège à éviter : Conclure seulement que H manque de puissance ferait perdre la portée logique de la contradiction : aucune vitesse finie supplémentaire ne répare ces deux branches.
4. Comprendre la portée de l’impossibilité
L’indécidabilité du problème général n’interdit pas de prouver la terminaison de nombreux programmes particuliers. Le compteur décroissant en fournit un exemple. Elle n’interdit pas non plus les outils utiles d’analyse ou de vérification. Un outil peut être exact sur une famille de programmes limitée, refuser certains cas ou renvoyer une réponse inconnue. Ce qu’il ne peut pas promettre dans le modèle est une réponse exacte et toujours obtenue pour toutes les entrées du problème général.
Changer un langage de programmation général pour un autre ne supprime pas cette limite lorsqu’ils possèdent les mêmes possibilités algorithmiques dans le modèle idéal. Une notation plus courte, un langage plus rapide ou un processeur plus puissant peuvent changer la facilité de programmation et le temps de calcul. Ils ne transforment pas la contradiction logique précédente en un algorithme correct. Les ressources physiques finies d’un ordinateur réel et les modèles théoriques doivent cependant rester distingués.
Il faut aussi distinguer indécidable et coûteux. Un problème peut posséder un algorithme qui termine toujours, tout en nécessitant un temps considérable. La question existe-t-il un algorithme total correct précède alors la question combien de ressources utilise-t-il. Confondre ces niveaux conduit à conclure trop vite qu’un calcul impossible à finir sur son ordinateur n’est pas calculable.
À toi d'essayer
Un dispositif déterministe possède au plus dix configurations complètes, en comptant sa mémoire et la position de son instruction. Sans nouvelle entrée, il visite onze configurations sans terminer. Peut-on ici justifier qu’il ne terminera plus ?
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
5. Au bac : construire une contradiction
Au bac : expliquer l’argument de l’arrêt
- Énonce exactement la promesse supposée : une réponse correcte pour chaque programme et chaque entrée, avec terminaison du décideur.
- Décris D en nommant le test H(Q, Q) et l’action contraire choisie dans chaque branche.
- Étudie D(D), puis examine les deux réponses possibles sans sauter une branche. Dans chaque cas, relie la prédiction au comportement opposé.
- Conclus sur l’inexistence du décideur général. Sépare cette conclusion des preuves possibles pour un programme particulier.
Erreurs fréquentes : remplacer une preuve par une attente longue ; oublier que H doit terminer ; invoquer la vitesse de l’ordinateur pour résoudre la contradiction ; déduire que tous les problèmes seraient indécidables ; confondre description d’un programme et exécution.
Vocabulaire
- Décideur :
- Algorithme correct qui termine et répond oui ou non sur chaque entrée de son domaine.
- Indécidabilité :
- Absence d’un décideur pour le problème considéré.
- Description :
- Représentation d’un programme utilisable comme donnée.
- Contradiction :
- Incompatibilité logique obtenue à partir d’une hypothèse.
Relier les besoins aux mécanismes
| Besoin | Réponse |
|---|---|
| Un cas observé termine | Fait particulier |
| Tous les cas du domaine sont décidés correctement | Promesse d’un décideur |
| Un calcul dure très longtemps | Question de coût, sans conclusion automatique |
| H échoue dans les deux branches de D(D) | Impossibilité du décideur général |
S’entraîner : utilise la rubrique Exercices du site. La prochaine leçon revient à la construction de programmes récursifs dont on peut analyser les appels et la terminaison.
À retenir
- Un programme peut être traité comme une donnée par un autre programme.
- Un décideur doit répondre correctement et terminer sur chaque entrée de son domaine.
- Le problème général de l’arrêt est indécidable.
- Cette impossibilité ne supprime pas les preuves de terminaison de programmes particuliers.
Fiche de révision
Avant de parler d’une limite, préciser le domaine des entrées et l’exigence de terminaison.
Pour refaire l’argument, définir H puis D, examiner D(D) et écrire les deux contradictions.
Un dépassement de délai n’est pas une preuve d’absence de tout algorithme.
Une méthode limitée à un ensemble fini d’états peut être exacte sans contredire le résultat général.
Questions fréquentes
Un programme qui répond parfois inconnu est-il un décideur total ?
Pas pour un problème exigeant une réponse oui ou non sur chaque entrée. Il peut néanmoins être un outil utile.
Faut-il étudier un formalisme de machine complet pour comprendre cette preuve ?
Non. Il suffit ici de comprendre programme comme donnée, branchement, appel d’un programme et boucle infinie, puis de suivre les deux cas de la contradiction.
Et maintenant ?
Tu as lu le cours. L’étape suivante tient en une action.
Relis le coursReprends l’essentiel avant de passer à la suite.Prolonge l’expérience !
Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !
Ici, tu débloques aussi 2 corrections détaillées.
Parent ? Suivez les progrès de votre enfant.
