NSI Terminale : programme officiel

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.

Génère ta fiche depuis TON coursFiches, flashcards et QCM générés par IA (gratuit)

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

Fonction calculable
Fonction pour laquelle il existe un algorithme qui termine sur toute entrée et renvoie la valeur attendue.
Problème décidable
Problème de décision (réponse oui/non) pour lequel un programme répond correctement sur toute entrée en temps fini.
Problème de l'arrêt
Question « le programme P s'arrête-t-il sur l'entrée x ? » ; démontré indécidable par Turing en 1936.
Thèse de Church-Turing
Affirmation selon laquelle tout ce qui est calculable l'est par une machine de Turing, donc par tout langage usuel.
Turing-complet
Se dit d'un langage capable de calculer tout ce qu'une machine de Turing calcule ; tous les langages généralistes le sont.
Machine universelle
Machine capable de simuler n'importe quelle autre machine à partir de sa description ; modèle théorique de l'ordinateur.

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.

Envie de QCM générés depuis ton propre cours ?

Créer mes QCM gratuitement

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.