Numérique et sciences informatiques (spécialité) · TerminaleBac
Calculabilité et décidabilité : exercices corrigés de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Un problème de décision est décidable quand un programme Python calcule son prédicat pour toutes les entrées possibles, en terminant toujours 1.
- Le problème de l'arrêt est indécidable : aucun programme ne prédit, pour tout programme et toute entrée, si le calcul s'arrête 3.
- Un problème peut être décidable en théorie et hors de portée en pratique, faute de temps ou de ressources : c'est le domaine de la complexité 3.
- Pour répondre à une question « décidable ou non ? », cherche d'abord un programme qui termine toujours ; sinon, cherche un argument par l'absurde.
Comment utiliser ces exercices
Cette page te propose de t'entraîner sur la calculabilité et la décidabilité, deux notions qui répondent à une question simple : existe-t-il un programme qui résout ce problème ? Les exercices sont rangés par difficulté croissante. Les premiers vérifient le vocabulaire et les définitions. Les suivants te demandent de raisonner sur des programmes qui bouclent. Les derniers t'invitent à construire de petits raisonnements par l'absurde, comme celui qui établit l'indécidabilité du problème de l'arrêt.
Tente chaque exercice sur papier avant d'ouvrir les indices. Ne regarde la correction qu'une fois que tu as écrit une réponse, même fausse : comparer ta réponse à la correction apprend bien plus que la lire à froid.
Les exercices
Exercice 1 Reconnaître un prédicat décidable
Pour chacune des trois questions suivantes, écris une fonction Python qui renvoie un booléen, puis explique pourquoi le problème est décidable.
- Un entier naturel
nest-il pair ? - Un entier naturel
nest-il un multiple de 7 ? - Une liste d'entiers
test-elle triée par ordre croissant ?
Indice 1
Un problème est décidable quand ta fonction termine pour toutes les entrées possibles.
Indice 2
Pour la question 3, compare chaque élément de la liste avec le suivant : combien de comparaisons au maximum ?
Voir la correction pas à pas
Pour la question 1, on écrit
def est_pair(n): return n % 2 == 0. Cette fonction effectue une seule opération et se termine toujours.Pour la question 2, on écrit
def multiple_de_7(n): return n % 7 == 0. Là encore, un calcul unique suffit, sans boucle.Pour la question 3, on écrit une boucle
for i in range(len(t) - 1)qui renvoieFalsedès quet[i] > t[i+1], etTrueà la sortie de la boucle. La liste est finie, donc la boucle fait au pluslen(t) - 1tours.Chaque fonction termine pour toute entrée et renvoie la bonne réponse. D'après la définition, chaque prédicat est calculable, donc chaque problème est décidable 1.
Les trois problèmes sont décidables, car on a exhibé pour chacun un programme qui termine toujours 1. Cette méthode directe, écrire un programme, est la façon la plus simple de montrer qu'un problème est décidable.
Exercice 2 Compter les réponses positives d'un prédicat
On considère le programme suivant.
def est_pair(n):
return n % 2 == 0
Pour combien d'entiers n de 1 à 20 (inclus) la fonction est_pair(n) renvoie-t-elle True ?
Indice 1
Écris les entiers de 1 à 20 et repère ceux dont le reste dans la division par 2 vaut 0.
Voir la correction pas à pas
On repère la condition :
est_pair(n)renvoieTruequand le reste de la division denpar 2 vaut 0.Parmi les entiers de 1 à 20, les pairs sont 2, 4, 6, 8, 10, 12, 14, 16, 18 et 20.
On les compte : il y en a 10.
La fonction renvoie True pour 10 entiers entre 1 et 20. Comme elle termine pour chaque entier et ne se trompe jamais, elle calcule bien le prédicat associé : c'est la situation d'un problème décidable 1.
Exercice 3 Le complémentaire d'un problème décidable
On dispose d'une fonction est_premier(n) qui termine toujours et renvoie True si l'entier n supérieur ou égal à 2 est premier, False sinon.
- Écris une fonction
est_compose(n)qui répond à la question «nest-il non premier ? » en utilisantest_premier. - Explique pourquoi
est_composeest elle aussi un programme qui termine toujours. - Combien d'entiers de 2 à 30 (inclus) sont non premiers ?
Indice 1
Que renvoie la négation not appliquée à un booléen ?
Indice 2
Les nombres premiers inférieurs ou égaux à 30 sont : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29.
Voir la correction pas à pas
On écrit
def est_compose(n): return not est_premier(n). La fonction appelleest_premierpuis inverse la réponse.est_premier(n)termine toujours par hypothèse, et la négation est une opération immédiate :est_composetermine donc toujours aussi. On retrouve le fait que le complémentaire d'un ensemble décidable est décidable 3.De 2 à 30, il y a 29 entiers.
Parmi eux, 10 sont premiers : 2, 3, 5, 7, 11, 13, 17, 19, 23 et 29.
Le nombre d'entiers non premiers est donc 29 − 10 = 19.
Il y a 19 entiers non premiers entre 2 et 30. Retiens la technique : inverser la réponse d'un décideur donne un décideur pour la question contraire 3. Nous réutiliserons cette idée dans un exercice sur le problème de l'arrêt.
Exercice 4 Un programme qui peut ne pas s'arrêter
Voici un programme.
def descente(n):
while n != 0:
n = n - 2
return "fini"
- Pour quelles entrées
nentières positives ou nulles le calcul s'arrête-t-il ? Justifie. - Pour les entiers
nde 0 à 20 (inclus), combien de calculs s'arrêtent ? - Le fait que ce programme précis boucle parfois contredit-il la décidabilité de la question «
descente(n)s'arrête-t-elle ? »
Indice 1
Regarde la suite des valeurs prises par n quand n est impair.
Indice 2
Pour la question 3, demande-toi s'il est possible d'écrire un programme qui répond à cette question pour cette fonction précise, en terminant toujours.
Voir la correction pas à pas
Si
nest pair, la suiten, n-2, n-4, …atteint exactement 0, donc la boucle s'arrête.Si
nest impair, la suite passe par 1, puis −1, −3, … : elle saute par-dessus 0 sans jamais le valoir. La boucle ne s'arrête jamais.Entre 0 et 20, les entiers pairs sont 0, 2, 4, …, 20, soit 11 valeurs. Onze calculs s'arrêtent.
Pour la question 3, la réponse est non. On peut écrire
def s_arrete(n): return n % 2 == 0, qui termine toujours et donne la bonne réponse pour ce programme. Le problème de l'arrêt dedescenteest donc décidable.
Onze calculs s'arrêtent entre 0 et 20. Le point important est la portée du résultat de Turing : l'indécidabilité concerne le problème général, où l'on cherche un programme qui répond pour n'importe quel programme et n'importe quelle entrée 4. Pour un programme particulier, la question peut parfaitement être décidable.
Exercice 5 Simuler pendant un nombre borné d'étapes
Un élève propose de « résoudre » le problème de l'arrêt en exécutant le programme p sur l'entrée x pendant au plus 1 000 000 d'étapes : si le calcul s'arrête avant, il répond True, sinon il répond False.
- Cette fonction termine-t-elle toujours ?
- Résout-elle le problème de l'arrêt ? Donne une situation où elle se trompe.
- Pour se faire la main, considère la fonction suivante.
def f(n):
c = 0
while n > 1:
n = n // 2
c += 1
return c
Combien de tours de boucle le calcul de f(50) effectue-t-il ?
Indice 1
Que sait-on quand la simulation est interrompue au bout de 1 000 000 d'étapes ?
Indice 2
Pour la question 3, écris les valeurs successives de n : 50, 25, …
Voir la correction pas à pas
La fonction de l'élève arrête toujours sa simulation au bout de 1 000 000 d'étapes au plus. Elle termine donc pour toute entrée.
Elle ne résout pas le problème de l'arrêt, car la réponse
Falsesignifie seulement « pas arrêté dans le délai fixé ». Un programme qui s'arrête après 2 000 000 d'étapes obtient la mauvaise réponseFalse.Pour la question 3, les valeurs de
nsont : 50, 25, 12, 6, 3, 1.La boucle s'arrête quand
nvaut 1. Il faut 5 divisions pour passer de 50 à 1, donc le calcul def(50)effectue 5 tours de boucle.
Le programme de l'élève termine toujours mais se trompe parfois : il ne décide donc pas le problème de l'arrêt. Aucun autre programme ne le peut d'ailleurs, puisque ce problème est indécidable 3. Sur un petit programme comme f(50), en revanche, la simulation complète donne la réponse : 5 tours.
Exercice 6 Le raisonnement par l'absurde de Turing
On suppose qu'il existe une fonction Python arret(p, x) qui termine toujours et renvoie True si le programme p s'arrête sur l'entrée x, et False sinon. On définit alors :
def paradoxe(p):
if arret(p, p):
while True:
pass
else:
return "fini"
- Que fait
paradoxe(p)lorsqueps'arrête sur lui-même ? Et lorsquepne s'arrête pas sur lui-même ? - On exécute
paradoxe(paradoxe). Montre que ce calcul conduit à une contradiction. - Que peut-on en déduire sur l'existence de
arret?
Indice 1
Distingue deux cas : arret(paradoxe, paradoxe) vaut True, ou il vaut False.
Indice 2
Dans chaque cas, compare ce que prédit arret avec ce que fait réellement paradoxe(paradoxe).
Voir la correction pas à pas
Si
arret(p, p)vautTrue,paradoxe(p)entre dans une boucle infinie. Siarret(p, p)vautFalse,paradoxe(p)renvoie immédiatement « fini » : le calcul s'arrête.Dans
paradoxe(paradoxe), on prendp = paradoxe. Premier cas : siarret(paradoxe, paradoxe)vautTrue, la fonction prédit que le calcul s'arrête, maisparadoxe(paradoxe)boucle alors indéfiniment. Contradiction.Second cas : si
arret(paradoxe, paradoxe)vautFalse, la fonction prédit que le calcul ne s'arrête pas, maisparadoxe(paradoxe)renvoie « fini » et s'arrête. Nouvelle contradiction.Les deux cas sont impossibles. L'hypothèse de départ était donc fausse : aucune fonction
arretne peut exister.
Tu viens de refaire, à l'échelle du lycée, l'idée de la preuve d'indécidabilité du problème de l'arrêt, démontrée par Turing en 1936 3. Cette preuve repose sur un argument diagonal, déjà imaginé par Cantor en 1891 et très employé en calculabilité 4. Ici, le programme est appliqué à lui-même : c'est le coeur de l'argument.
Exercice 7 Décider le problème de l'arrêt grâce au complémentaire
Supposons que le problème de l'arrêt soit décidable, avec une fonction arret(p, x) qui termine toujours.
- Écris une fonction
boucle_infinie(p, x)qui renvoieTruesi le calcul depsurxne s'arrête jamais. - Que peut-on dire de la décidabilité du problème « le calcul de
psurxboucle indéfiniment » ? - Quelle conséquence tires-tu pour ce problème, sachant que le problème de l'arrêt est en réalité indécidable ?
Indice 1
Pense à l'exercice sur le complémentaire d'un problème décidable.
Indice 2
Pour la question 3, raisonne par contraposée : si boucle_infinie était décidable, que pourrait-on en déduire pour arret ?
Voir la correction pas à pas
On écrit
def boucle_infinie(p, x): return not arret(p, x).Cette fonction termine toujours si
arrettermine toujours : le problème « boucle indéfiniment » serait décidable, ce qui est cohérent avec le fait que le complémentaire d'un ensemble décidable est décidable 3.Réciproquement, si on disposait d'un décideur
boucle_infinie, alorsnot boucle_infinie(p, x)serait un décideur pour l'arrêt.Or un tel décideur n'existe pas, puisque le problème de l'arrêt est indécidable 3. Il n'existe donc pas non plus de décideur pour « le calcul boucle indéfiniment ».
Un problème et son contraire sont décidables ou indécidables ensemble. Le problème « le calcul de sur ne s'arrête jamais » est donc indécidable, tout comme le problème de l'arrêt.
Exercice 8 Classer des questions sur les programmes
Pour chaque question portant sur un programme Python p donné sous forme de texte, dis si elle relève du théorème de Rice (donc indécidable ou triviale), ou si elle est décidable pour une autre raison. Justifie.
- Le programme
pcontient-il plus de 10 lignes ? - Le programme
prenvoie-t-il toujours le résultat 0, quelle que soit l'entrée ? - Le programme
putilise-t-il le mot-cléwhile? - Le programme
ps'arrête-t-il pour toute entrée ?
Indice 1
Le théorème de Rice concerne les questions qui dépendent seulement du résultat du calcul.
Indice 2
Une question sur le texte du programme, et non sur son comportement, se règle en lisant ce texte.
Voir la correction pas à pas
Question 1 : elle porte sur le texte du programme, pas sur son comportement. On compte les lignes, c'est un calcul qui termine toujours. Elle est décidable et ne relève pas du théorème de Rice, qui concerne les questions dépendant seulement du résultat du calcul 3.
Question 3 : même raison. On cherche le mot
whiledans le texte, ce qui termine toujours. Elle est décidable.Question 2 : elle dépend uniquement du résultat produit par le programme. Elle n'est pas triviale, car certains programmes renvoient toujours 0 et d'autres non. D'après le théorème de Rice, elle est indécidable 3.
Question 4 : elle porte sur la terminaison du calcul, une propriété de comportement. Elle est elle aussi indécidable d'après le théorème de Rice 3, ce qui rejoint le problème de l'arrêt.
La frontière passe entre les questions sur le texte du programme, qu'on peut lire et analyser, et les questions sur son comportement, qu'il faudrait pouvoir prédire pour tous les programmes. Les secondes sont indécidables ou triviales d'après le théorème de Rice 3.
Exercice 9 Pourquoi un testeur universel de programmes n'existe pas
Une entreprise promet un logiciel « détecteur de bogues parfait » : pour n'importe quel programme écrit dans un langage de programmation usuel, il annoncerait en temps fini si ce programme s'arrête ou boucle indéfiniment.
- Pourquoi ce logiciel ne peut-il pas exister ?
- Cela signifie-t-il qu'aucun outil d'analyse de programmes n'a de sens ? Propose une version réaliste du logiciel.
Indice 1
Relis ce que dit le résultat de Turing à propos des langages de programmation suffisamment puissants.
Indice 2
Un outil peut répondre « oui », « non » ou « je ne sais pas ».
Voir la correction pas à pas
Le logiciel décrit décide le problème de l'arrêt pour tous les programmes d'un langage usuel. Or il n'existe pas de programme capable de tester n'importe quel programme d'un langage suffisamment puissant afin de conclure dans tous les cas s'il s'arrête 3. La promesse est donc impossible à tenir.
Cela n'interdit pas les outils d'analyse partielle. Un outil peut traiter correctement certaines familles de programmes, par exemple ceux qui n'ont que des boucles
forsur des listes finies, qui terminent toujours.Une version réaliste peut répondre « s'arrête », « ne s'arrête pas » ou « je ne sais pas ». Elle reste fiable quand elle tranche, et elle avoue son ignorance sinon.
L'indécidabilité n'empêche pas d'écrire des outils utiles : elle interdit seulement un outil qui serait à la fois toujours correct, toujours terminant et valable pour tous les programmes. Les logiciels réels renoncent à l'une de ces trois exigences.
Exercice 10 Décidable en théorie, hors de portée en pratique
Un problème consiste à retrouver un mot de passe de 6 lettres minuscules (26 lettres possibles) en testant tous les mots possibles, un par un.
- Ce problème est-il décidable ? Justifie.
- Combien de mots de passe de 6 lettres minuscules existe-t-il ?
- Un ordinateur teste 1 000 000 de mots par seconde. Le temps de calcul de la recherche exhaustive te semble-t-il raisonnable ? Que dire d'un mot de passe de 20 lettres ?
Indice 1
Le nombre de mots de longueur sur un alphabet de lettres est .
Indice 2
Divise le nombre de mots par le nombre de tests par seconde pour obtenir un temps en secondes.
Voir la correction pas à pas
Le nombre de mots à tester est fini, donc la recherche exhaustive termine toujours. Le problème est décidable.
Chaque lettre a 26 choix, indépendamment des autres : il y a mots de passe possibles.
À tests par seconde, le temps maximal est secondes, soit environ 5 minutes. C'est raisonnable.
Pour 20 lettres, il y aurait mots, un nombre qui dépasse . Le même calcul donne un temps de plus de secondes, très supérieur à toute durée humaine : la recherche est décidable mais impraticable.
Il y a 308 915 776 mots de passe possibles de 6 lettres. Un ensemble peut être théoriquement décidable sans que la décision puisse être prise en pratique, faute de temps ou de ressources suffisantes 3. La théorie de la complexité étudie précisément ce coût 3, alors que la calculabilité se limite à l'existence d'un algorithme 4.
Les questions qu'on se pose
Quelle est la différence entre « calculable » et « décidable » ?
Le mot calculable s'applique à une fonction : elle est calculable si un programme termine pour toute entrée et renvoie 1. Le mot décidable s'applique à un problème de décision, dont la réponse est « oui » ou « non ». Il est décidable quand le prédicat associé, la fonction qui renvoie True ou False, est calculable 1. Les deux mots expriment donc la même idée, pour deux types d'objets.
Si un programme boucle indéfiniment sur une entrée, le problème est-il indécidable ?
Non. Un programme précis qui boucle sur certaines entrées ne rend pas indécidable la question de son arrêt : dans l'exercice sur la fonction descente, un test sur la parité de n suffit à répondre. L'indécidabilité du problème de l'arrêt concerne la question générale, posée pour n'importe quel programme et n'importe quelle entrée 4.
Un problème décidable est-il forcément facile à résoudre ?
Non. Décidable signifie seulement qu'il existe un programme qui termine toujours avec la bonne réponse. Ce programme peut demander un temps considérable, voire des ressources dépassant ce que l'on peut réunir en pratique 3. Mesurer ce coût est l'objet de la théorie de la complexité, distincte de la calculabilité 4.
Sources
Programme visé : Calculabilité et décidabilité · Éduscol (Ministère de l'Éducation nationale)
- Calculabilité et décidabilité, Éduscol (Ministère de l'Éducation nationale). Consulté le 7 novembre 2026.
- Calculabilité (Cours M1 MEEF NSI), Université Grenoble Alpes. Consulté le 7 novembre 2026.
- Décidabilité, Wikipédia. Consulté le 7 novembre 2026.
- Théorie de la calculabilité, Wikipédia. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.