Séquence 19 — Décidabilité & Calculabilité§
Source : https://lyotardjulien.forge.apps.education.fr/terminale-specialite-nsi-au-lycee-notre-dame/90_sequence_90/90_sequence_90/ Cours détaillé : https://lyotardjulien.forge.apps.education.fr/bifurcation-site-coilhac-term/decidabilite_calculabilite/cours/
Périmètre officiel BO Terminale — fiche allégée
Le BO Terminale dit littéralement :
« Notion de programme en tant que donnée. Calculabilité, décidabilité. […] Comprendre que tout programme est aussi une donnée. Comprendre que la calculabilité ne dépend pas du langage de programmation. Montrer, sans formalisme théorique, que le problème de l'arrêt est indécidable. »
« Sans formalisme » est explicite. La note MENE2227884N (2022) exclut ce thème de l'écrit. 2 sujets seulement sur 84 le testent superficiellement.
Hors programme NSI : machine de Turing, λ-calcul, thèse de Church-Turing, argument diagonal formel. Cette fiche se limite à : énoncé du problème de l'arrêt + démonstration intuitive par l'absurde.
TL;DR§
- Un problème est décidable s'il existe un algorithme qui, pour toute entrée, termine en temps fini et répond correctement « oui / non ».
- Une fonction est calculable s'il existe un algorithme qui, pour toute entrée, termine en temps fini et renvoie la bonne sortie.
- Un programme est lui-même une donnée (un fichier texte) : il peut être passé en paramètre à un autre programme.
- Le problème de l'arrêt demande : « existe-t-il un programme
halt(P, x)qui dit si l'exécution du programmePsur l'entréexs'arrête ? ». Réponse (Turing & Church, 1936) : non, il est indécidable. - La preuve est un raisonnement par l'absurde : on suppose
haltexiste, on construitsymqui boucle ssiprog(prog)s'arrête, puis on regardesym(sym)→ contradiction dans les deux cas.
Plan de la séquence§
- Décidabilité : définition, exemples décidables.
- Un programme peut être passé en paramètre à un autre programme.
- Le problème de l'arrêt : énoncé.
- Démonstration de l'indécidabilité du problème de l'arrêt (par l'absurde).
Notions clés§
Décidabilité§
Un problème de décision est décidable s'il existe un algorithme qui, pour toute instance du problème, termine en un nombre fini d'étapes et retourne la bonne réponse (oui ou non).
Exemples de problèmes décidables :
- Parité : « n est-il pair ? » →
n % 2 == 0. Termine toujours en O(1). - Primalité : « n est-il premier ? » → on teste
n % k == 0pourkde 2 àn−1. Termine toujours. - Recherche d'un élément dans un tableau, tri d'une liste finie, accessibilité dans un graphe fini.
Calculabilité§
Une fonction
fest calculable s'il existe un algorithme qui, pour toute entréex, termine en un nombre fini d'étapes et renvoief(x).
La décidabilité est le cas particulier de la calculabilité où la sortie est binaire (oui/non).
⚠️ La calculabilité ne dépend pas du langage de programmation : un problème calculable en Python l'est aussi en Java, en C, etc. Et un problème indécidable l'est dans tous les langages.
Un programme est une donnée§
Un programme est un fichier texte, donc une suite de caractères : on peut le passer en paramètre à un autre programme. C'est ce que font tous les jours :
- l'interpréteur Python (
python3 test.py→python3reçoittest.pyen entrée), - un compilateur (
gcc fichier.c), - un antivirus (analyse un
.exe), - un linter (
pylint mon_code.py), - un debugger (exécute un programme pas à pas).
Conséquence : un programme peut s'analyser lui-même.
Vocabulaire§
| Terme | Définition |
|---|---|
| Algorithme | Suite finie d'instructions élémentaires, déterministe, qui termine et résout un problème. |
| Problème de décision | Problème dont la réponse est binaire (oui / non). |
| Décidable | Qui admet un algorithme de décision (terminaison + réponse correcte). |
| Indécidable | Aucun algorithme universel ne peut décider le problème. |
| Calculable | Une fonction pour laquelle il existe un algorithme qui la calcule. |
| Problème de l'arrêt | « Étant donné P et x, est-ce que P(x) termine ? » → indécidable. |
| Raisonnement par l'absurde | Supposer le contraire de ce qu'on veut prouver, dériver une contradiction, conclure. |
Le problème de l'arrêt§
Énoncé§
On cherche à écrire une fonction halt(prog, x) qui :
- prend en entrée un programme
prog(son code-source) et une entréex, - renvoie
Truesi l'exécution deprog(x)s'arrête, - renvoie
Falsesiprog(x)boucle indéfiniment.
Cette fonction doit elle-même toujours terminer, et donner la bonne réponse pour n'importe quel programme prog.
Théorème (Turing & Church, 1936)§
Le problème de l'arrêt est indécidable : il n'existe pas de programme
haltqui réponde correctement pour toute entrée(prog, x).
Ce résultat est fondamental :
- Il ne dit pas qu'écrire
haltest difficile — il dit que c'est mathématiquement impossible. - Il est indépendant du langage (Python, C, Java, futur, …).
- Il est indépendant de la puissance de la machine (même un ordinateur infiniment rapide ne peut pas).
Démonstration par l'absurde (sans formalisme)§
Étape 1 — Hypothèse. On suppose qu'un programme halt(prog, x) existe et fonctionne correctement (termine toujours, répond juste).
Étape 2 — Construction de sym. Avec halt, on peut construire :
def sym(prog):
if halt(prog, prog) == True:
while True:
print("vers l'infini et au-dela !") # boucle infinie
else:
return 1 # s'arrete
sym reçoit un programme prog et :
- entre dans une boucle infinie si
prog(prog)s'arrête ; - termine en renvoyant 1 si
prog(prog)ne s'arrête pas.
Étape 3 — Question diagonale. Que vaut sym(sym) ? Deux cas :
- Cas 1 :
halt(sym, sym) = True. Cela signifie quesym(sym)s'arrête. Mais d'après le code desym, dans ce cas on entre dans la boucle infinie →sym(sym)ne s'arrête pas. Contradiction. - Cas 2 :
halt(sym, sym) = False. Cela signifie quesym(sym)ne s'arrête pas. Mais d'après le code, dans ce cassymexécutereturn 1→sym(sym)s'arrête. Contradiction.
Étape 4 — Conclusion. L'hypothèse de l'existence de halt mène à une contradiction dans tous les cas. Donc halt n'existe pas : le problème de l'arrêt est indécidable. CQFD
Diagramme§
flowchart TD
H["Hypothese : halt existe"] --> S["Construction de sym(prog) :<br/>boucle si halt(prog,prog) = True<br/>termine si halt(prog,prog) = False"]
S --> Q["Que fait sym(sym) ?"]
Q --> C1["Cas 1 : halt(sym,sym) = True<br/>-> sym(sym) doit s arreter<br/>mais sym(sym) entre en boucle<br/><b>Contradiction</b>"]
Q --> C2["Cas 2 : halt(sym,sym) = False<br/>-> sym(sym) doit boucler<br/>mais sym(sym) renvoie 1<br/><b>Contradiction</b>"]
C1 --> CCL["Conclusion : halt n existe pas<br/><b>Le probleme de l arret est indecidable</b>"]
C2 --> CCL
Pièges classiques au bac§
- Confondre indécidable et difficile :
haltn'est pas « long à exécuter » — il ne peut pas exister. Aucun langage, aucun ordinateur futur ne le permettra. - Croire que tout problème de décision est décidable : c'est faux ; le problème de l'arrêt en est le contre-exemple canonique.
- Confondre décidabilité et complexité : un problème peut être décidable mais coûteux. Décidable = il existe un algo qui termine. Complexité = à quel coût.
- Oublier que l'algorithme doit terminer pour TOUTES les entrées : un programme qui répond bien sur 99 % des cas mais boucle parfois ne décide pas le problème.
- Mal mener le raisonnement par l'absurde : il faut bien partir de l'hypothèse opposée, dériver la contradiction, puis conclure.
- Sortir du programme au bac : on attend la démonstration du problème de l'arrêt (avec
haltetsym), sans formalisme (pas de machine de Turing).
Questions types au bac§
Q1. Donner la définition d'un problème décidable.
Un problème de décision est décidable s'il existe un algorithme qui, pour toute instance, termine en un nombre fini d'étapes et donne la bonne réponse (oui/non). « Termine toujours » est essentiel : un algorithme qui boucle parfois ne décide pas le problème.
Q2. Donner un exemple de problème décidable et expliquer pourquoi.
La primalité : tester si
nest premier en essayant tous les diviseurskde 2 àn−1. La boucle se termine après au plusn−2itérations, donc l'algorithme termine pour toute entrée et donne la bonne réponse.
Q3. Énoncer le problème de l'arrêt et son statut.
Le problème de l'arrêt demande s'il existe un algorithme
halt(P, x)qui, pour tout programmePet toute entréex, termine et renvoieTruesiP(x)s'arrête,Falsesinon. Le théorème de Turing (1936) affirme que le problème de l'arrêt est indécidable : un tel algorithme n'existe pas.
Q4. Démontrer l'indécidabilité du problème de l'arrêt (raisonnement par l'absurde).
Supposons par l'absurde que
halt(prog, x)existe et fonctionne correctement. On construit le programmesym(prog)qui : entre en boucle infinie sihalt(prog, prog) == True, et renvoie1sinon. On considèresym(sym): – sihalt(sym, sym) = True, alorssym(sym)doit s'arrêter ; or par constructionsymentre en boucle infinie : contradiction. – sihalt(sym, sym) = False, alorssym(sym)ne doit pas s'arrêter ; or par constructionsymrenvoie 1 : contradiction. Dans les deux cas, contradiction. L'hypothèse est fausse :haltn'existe pas. Le problème de l'arrêt est indécidable.
Q5. Pourquoi un programme peut-il prendre un autre programme en paramètre ?
Parce qu'un programme est un fichier texte, c'est-à-dire une suite de caractères — donc une donnée comme une autre. C'est ce que font les compilateurs, interpréteurs, antivirus, linters, debuggers. Rien n'empêche un programme de se prendre lui-même comme paramètre, ce qui est essentiel à la démonstration de l'indécidabilité du problème de l'arrêt.
Q6. L'indécidabilité du problème de l'arrêt est-elle une limite technologique ?
Non. C'est une limite mathématique fondamentale, indépendante du langage de programmation et de la puissance de la machine. Aucun progrès technologique futur ne pourra la lever.
Liens§
- Page séquence (Lyotard) : https://lyotardjulien.forge.apps.education.fr/terminale-specialite-nsi-au-lycee-notre-dame/90_sequence_90/90_sequence_90/
- Cours détaillé : https://lyotardjulien.forge.apps.education.fr/bifurcation-site-coilhac-term/decidabilite_calculabilite/cours/
- Vidéo Arte « L'Entscheidungsproblem ou la fin des mathématiques ? » (série Voyages au pays des maths, 2023).
- Vidéo Science Étonnante (David Louapre) sur la machine de Turing.