Aller au contenu

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

★☆☆Environ 5 min

Pour chacune des trois questions suivantes, écris une fonction Python qui renvoie un booléen, puis explique pourquoi le problème est décidable.

  1. Un entier naturel n est-il pair ?
  2. Un entier naturel n est-il un multiple de 7 ?
  3. Une liste d'entiers t est-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
  1. 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.

  2. Pour la question 2, on écrit def multiple_de_7(n): return n % 7 == 0. Là encore, un calcul unique suffit, sans boucle.

  3. Pour la question 3, on écrit une boucle for i in range(len(t) - 1) qui renvoie False dès que t[i] > t[i+1], et True à la sortie de la boucle. La liste est finie, donc la boucle fait au plus len(t) - 1 tours.

  4. 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

★☆☆Environ 5 min

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
  1. On repère la condition : est_pair(n) renvoie True quand le reste de la division de n par 2 vaut 0.

  2. Parmi les entiers de 1 à 20, les pairs sont 2, 4, 6, 8, 10, 12, 14, 16, 18 et 20.

  3. 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

★☆☆Environ 8 min

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.

  1. Écris une fonction est_compose(n) qui répond à la question « n est-il non premier ? » en utilisant est_premier.
  2. Explique pourquoi est_compose est elle aussi un programme qui termine toujours.
  3. 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
  1. On écrit def est_compose(n): return not est_premier(n). La fonction appelle est_premier puis inverse la réponse.

  2. est_premier(n) termine toujours par hypothèse, et la négation est une opération immédiate : est_compose termine donc toujours aussi. On retrouve le fait que le complémentaire d'un ensemble décidable est décidable 3.

  3. De 2 à 30, il y a 29 entiers.

  4. Parmi eux, 10 sont premiers : 2, 3, 5, 7, 11, 13, 17, 19, 23 et 29.

  5. 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

★★☆Environ 10 min

Voici un programme.

def descente(n):
    while n != 0:
        n = n - 2
    return "fini"
  1. Pour quelles entrées n entières positives ou nulles le calcul s'arrête-t-il ? Justifie.
  2. Pour les entiers n de 0 à 20 (inclus), combien de calculs s'arrêtent ?
  3. 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
  1. Si n est pair, la suite n, n-2, n-4, … atteint exactement 0, donc la boucle s'arrête.

  2. Si n est 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.

  3. Entre 0 et 20, les entiers pairs sont 0, 2, 4, …, 20, soit 11 valeurs. Onze calculs s'arrêtent.

  4. 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 de descente est 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

★★☆Environ 12 min

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.

  1. Cette fonction termine-t-elle toujours ?
  2. Résout-elle le problème de l'arrêt ? Donne une situation où elle se trompe.
  3. 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
  1. 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.

  2. Elle ne résout pas le problème de l'arrêt, car la réponse False signifie 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éponse False.

  3. Pour la question 3, les valeurs de n sont : 50, 25, 12, 6, 3, 1.

  4. La boucle s'arrête quand n vaut 1. Il faut 5 divisions pour passer de 50 à 1, donc le calcul de f(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

★★☆Environ 15 min

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"
  1. Que fait paradoxe(p) lorsque p s'arrête sur lui-même ? Et lorsque p ne s'arrête pas sur lui-même ?
  2. On exécute paradoxe(paradoxe). Montre que ce calcul conduit à une contradiction.
  3. 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
  1. Si arret(p, p) vaut True, paradoxe(p) entre dans une boucle infinie. Si arret(p, p) vaut False, paradoxe(p) renvoie immédiatement « fini » : le calcul s'arrête.

  2. Dans paradoxe(paradoxe), on prend p = paradoxe. Premier cas : si arret(paradoxe, paradoxe) vaut True, la fonction prédit que le calcul s'arrête, mais paradoxe(paradoxe) boucle alors indéfiniment. Contradiction.

  3. Second cas : si arret(paradoxe, paradoxe) vaut False, la fonction prédit que le calcul ne s'arrête pas, mais paradoxe(paradoxe) renvoie « fini » et s'arrête. Nouvelle contradiction.

  4. Les deux cas sont impossibles. L'hypothèse de départ était donc fausse : aucune fonction arret ne 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

★★☆Environ 10 min

Supposons que le problème de l'arrêt soit décidable, avec une fonction arret(p, x) qui termine toujours.

  1. Écris une fonction boucle_infinie(p, x) qui renvoie True si le calcul de p sur x ne s'arrête jamais.
  2. Que peut-on dire de la décidabilité du problème « le calcul de p sur x boucle indéfiniment » ?
  3. 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
  1. On écrit def boucle_infinie(p, x): return not arret(p, x).

  2. Cette fonction termine toujours si arret termine 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.

  3. Réciproquement, si on disposait d'un décideur boucle_infinie, alors not boucle_infinie(p, x) serait un décideur pour l'arrêt.

  4. 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 pp sur xx 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

★★★Environ 15 min

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.

  1. Le programme p contient-il plus de 10 lignes ?
  2. Le programme p renvoie-t-il toujours le résultat 0, quelle que soit l'entrée ?
  3. Le programme p utilise-t-il le mot-clé while ?
  4. Le programme p s'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
  1. 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.

  2. Question 3 : même raison. On cherche le mot while dans le texte, ce qui termine toujours. Elle est décidable.

  3. 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.

  4. 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

★★★Environ 15 min

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.

  1. Pourquoi ce logiciel ne peut-il pas exister ?
  2. 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
  1. 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.

  2. 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 for sur des listes finies, qui terminent toujours.

  3. 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

★★★Environ 12 min

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.

  1. Ce problème est-il décidable ? Justifie.
  2. Combien de mots de passe de 6 lettres minuscules existe-t-il ?
  3. 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 kk sur un alphabet de 2626 lettres est 26k26^k.

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
  1. Le nombre de mots à tester est fini, donc la recherche exhaustive termine toujours. Le problème est décidable.

  2. Chaque lettre a 26 choix, indépendamment des autres : il y a 266=308 915 77626^6 = 308\,915\,776 mots de passe possibles.

  3. À 10610^6 tests par seconde, le temps maximal est 308 915 776106≈309\dfrac{308\,915\,776}{10^6} \approx 309 secondes, soit environ 5 minutes. C'est raisonnable.

  4. Pour 20 lettres, il y aurait 262026^{20} mots, un nombre qui dépasse 102810^{28}. Le même calcul donne un temps de plus de 102210^{22} 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 xx et renvoie f(x)f(x) 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)

  1. Calculabilité et décidabilité, Éduscol (Ministère de l'Éducation nationale). Consulté le 7 novembre 2026.
  2. Calculabilité (Cours M1 MEEF NSI), Université Grenoble Alpes. Consulté le 7 novembre 2026.
  3. Décidabilité, Wikipédia. Consulté le 7 novembre 2026.
  4. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page