Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Trying to access array offset on value of type null in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Trying to access array offset on value of type null in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149
nsi:terminales:calculabilite:ancien [GoupillWiki]

Outils pour utilisateurs

Outils du site


nsi:terminales:calculabilite:ancien

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Calculabilité - Décidabilité

Ce cours est sans doute ce qu'il y aura de plus théorique et abstrait cette année. Il traite d'un sujet fondamental de l'informatique théorique. C'est un cours difficile dont il faut surtout comprendre quelques idées que nous résumerons en fin de cours.

Diaporama

Décidabilité

Conjecture de Goldbach

Il s'agit d'une conjecture mathématique qui va nous servir d'exemple pour comprendre ce qu'est la décidabilité.

Conjecture : Tout nombre pair peut s'écrire comme la somme de deux nombres premiers.

Exemples : $126 = 113 + 13$, $128 = 109 + 19 = 31 + 97$… Il peut y avoir plusieurs solutions, l'important est qu'il y en ait au moins une.

Cette conjecture a été vérifiée pour tous les nombres pairs jusqu'à $4\times 10^{18}$. La plupart des mathématiciens pensent qu'elle est vraie. Mais elle n'a pas encore été démontrée.

Pour prouver que la conjecture est toujours vraie, une liste d'exemples ne suffit pas. Il y a une infinité de nombres premiers, on ne peut les tester tous. Il faut un raisonnement, une démonstration.

Au contraire, il suffirait de trouver un contre-exemple pour prouver que la conjecture est fausse. Cependant, le contre-exemple pourrait s'avérer impossible à trouver par une recherche systématique. Il pourrait exister une démonstration montrant qu'un contre-exemple doit exister sans nous dire sa valeur.

Néanmoins, si des contre-exemples existent, en théorie on doit pouvoir les trouver en les cherchant, même si en pratique cette recherche peut s'avérer humainement impossible – par exemple si elle dure plus que l'âge de l'univers.

Se peut-il qu'elle soit toujours vraie mais qu'il soit impossible de le démontrer ?

Une proposition est décidable s'il existe un raisonnement – une démonstration – qui conclut sur la validité ou l'invalidité de la proposition. S'il n'existe aucune démonstration permettant de décider dans un sens ou dans l'autre, alors la proposition est indécidable.

La conjecture de Golbach est peut-être indécidable ou peut-être qu'il existe une démonstration mais qu'on ne l'a pas trouvée. Il est difficile de de démontrer qu'une démonstration n'existe pas…

L'un des objectifs de ce cours est de prouver qu'il existe des propositions indécidables.

David Hilbert (1862 - 1943)

David Hilbert est considéré comme un des plus grands mathématiciens du XXe siècle. En 1920, il propose un programme de recherche visant à bâtir les mathématiques sur des bases plus rigoureuses.

Il propose que les mathématiques soient fondées sur des axiomes – vérités premières admises – correctement choisis, en nombre le plus petit possible.



Exemple de la géométrie : Euclide, savant grec vers -300, est célèbre pour ses traités de mathématiques et surtout pour sa méthode. Il commence par poser quelques évidences, les axiomes, en très petit nombre. Puis il démontre, par pure logique, sans ajouter d'hypothèse supplémentaire.


  • Axiome 1 : il existe toujours une droite passant par deux points du plan.
  • Axiome 2 : tout segment peut être étendu suivant sa direction en une droite infinie.
  • Axiome 3 : à partir d'un segment, il existe un cercle dont le centre est un des points du segment et dont le rayon est la longueur du segment.
  • Axiome 4 : tous les angles droits sont égaux entre eux.
  • Axiome 5 : étant donné un point et une droite ne passant pas par ce point, il existe une seule droite passant par ce point et parallèle à la première.

Ces axiomes peuvent supposer de définir également ce que l'on entend par segment, cercle, … (mais pas obligatoirement !)

Le 5e axiome a fait beaucoup travailler les mathématiciens : on a pensé qu'il n'était pas nécessaire, qu'on pouvait le déduire à partir des 4 premiers. En désespoir de cause, certains mathématiciens ont essayé de changer le 5e axiome, disant par exemple qu'il existait plusieurs parallèles passant par un point extérieur à une droite. Ce faisant, ils ont découvert de nouvelles géométries tout à fait cohérentes mais différentes de la géométrie d'Euclide !

David Hilbert se demande : toute propriété pouvant être énoncée – sans ambiguïté, dans le langage mathématique – est-elle décidable. Dit autrement : existe-t-il des propriété indécidables.

Hilbert est connu aussi pour ses 23 problèmes. Il s'agit de grands problèmes mathématiques de l'époque (1900) et qui devaient marquer le XXe siècle. Le fameux théorème de Fermat en fait partie.

Kurt Gödel (1906 - 1978)

En 1929, le logicien Kurt Gödel prouve que la réponse est oui, il existe des propriétés indécidables, dans certain cas. Voici – en gros traits – ce que dit Gödel :

Dans une théorie mathématique contenant $\mathbb{N}$ – donc une théorie permettant de décrire les entiers naturels – on a deux possibilités, selon le choix des axiomes de départ :

  • soit certaines vérités sont indémontrables – indécidables,
  • soit on aboutit à des contradictions.

Pour que la théorie reste cohérente – pas de contradiction – il faut donc accepter l'idée que certaines vérités restent indécidables.



Un mot sur la démonstration de Gödel car elle a une grande ressemblance avec ce qui va suivre en informatique : Gödel se pose des questions sur les démonstrations portant sur l'ensemble $\mathbb{N}$.

  • Une démonstration ou un simple énoncé mathématique est une sorte de suite de déclaration logique portant sur des nombres.
  • L'énoncé est donc une suite de symboles mathématiques. Gödel propose d'associer un codage à chaque symbole – comme un codage de caractère informatique – de sorte que l'énoncé devient un long code – comme un fichier texte dans un ordinateur. Le code correspondant à une démonstration peut être compris comme un grand nombre.
  • Donc à chaque énoncé mathématique on peut associer un nombre – voilà pourquoi il avait besoin de $\mathbb{N}$. Puisque les énoncés portent sur des nombres et que les énoncés (d'une certaine façon), sont des nombres, alors les énoncés portent sur des énoncés, et un énoncé peut alors parler de lui-même et on peut construire des contradictions du genre Le menteur qui dit “Je mens”.

Dans ce genre, on connaît aussi le paradoxe de Russel (1901). C'est un paradoxe mathématique mais qui a une formulation plus imagée, le paradoxe du Barbier : dans une ville, un arrêté stipule que le barbier ne doit raser que les hommes qui ne se rasent pas eux-mêmes et seulement ceux-cis, et bien sûr que tout les hommes doivent être rasés. Le barbier est coincé !

Gödel, comme Russel, n'ont pas cassé les mathématiques. Ils ont montré que les constructions mathématiques antérieures étaient trop naïves. Ils ont tous deux révolutionné les mathématiques.

Décidabilité et informatique

Nous avons dit : Propriété décidable = Il existe une démonstration permettant de dire si la propriété est vraie ou non.

En informatique, on donne au mot un sens légèrement différent :

Problème décidable en informatique : Il existe un algorithme de longueur finie et de temps d'exécution fini qui répond oui ou non à la question posée.

Exercice 1

  1. Le problème de savoir si 442 est pair est-il décidable ?
  2. Le problème de savoir si 443 est premier est-il décidable ?

On parle aussi d'ensemble décidable. Un ensemble est décidable quand la question de savoir si tel élément appartient à l'ensemble est un problème décidable.

Exercice 2

  1. L'ensemble des nombres pairs est-il décidable ?
  2. L'ensemble des nombres premiers est-il décidable ?

On utilise parfois le terme ensemble récursif au lieu de ensemble décidable. Dans ce sens, récursif n'a absolument rien à voir avec l'idée de fonction récursive qui s'appelle elle-même. Ces termes sont très utilisés dans la théorie des langages informatiques qui est à la base de notions importantes comme les expressions régulières ou encore la conception de langages de programmation.

Machine de Turing (Alan Turing 1912 - 1954)

Principe

  • Les données à traiter sont écrites sur une bande magnétique qui peut avancer ou reculer.
  • Quand la machine s'arrête sur un symbole elle peut lire le symbole et écrire un autre symbole.
  • La machine est fabriquée pour faire un travail bien défini. Par exemple, multiplier par 2. Alors on écrit les symboles 345 sur la bande, et la machine, à la fin de son traitement, aura remplacé 345 par 690, c'est à dire le double.

À quoi sert-elle ?

On se pose des questions comme “Y a-t-il des problèmes indécidables ? Lesquels ?”

Si on veut justifier qu'un problème est indécidable, il faut montrer qu'aucun algorithme d'aucune sorte ne permettra la décision, même avec des technologies que l'on ne connaît pas encore.

La machine de Turing fait penser à un ordinateur primitif. Mais elle ne sert pas à fabriquer un ordinateur. La machine de Turing est une machine abstraite que l'on n'essaie même pas de fabriquer. Elle sert seulement à réfléchir sur les algorithmes, à dire ce qui est possible et ce qui ne l'est pas.

Le principe des raisonnements à suivre est que tout programme, quelque soit le langage ou la machine, peut trouver un équivalent sous forme d'une machine de Turing – éventuellement gigantesque. Donc, si on ne peut pas faire résoudre un problème avec une machine de Turing, alors on ne pourra pas le résoudre avec aucune autre machine, même pas avec une technologie extraterrestre super-puissante !

J'insiste : l'approche est théorique. La machine de Turing est seulement imaginée. Remplacer un ordinateur moderne par une machine de Turing serait très difficile, peut-être impossible en pratique, mais théoriquement possible.

Fonctionnement d'une machine de Turing

  • La machine utilise un ruban découpé en cases. Dans les cases ont peut trouver des symboles : 0, 1, A, #, etc.
  • Pour une case vide, on convient que le symbole est _
  • La machine étant théorique, on peut dire que la bande est infinie dans les deux sens. Par contre, au démarrage, il y a un nombre fini de symboles sur la bande.
  • La machine possède une tête de lecture / écriture lui permettant de lire le symbole écrit et d'en écrire un. Écrire _ revient à effacer le contenu.
  • On peut déplacer la bande d'un côté ou de l'autre ce qui revient à déplacer la tête de lecture / écriture.
  • La machine possède des états de fonctionnement. Il s'agit d'une simple variable disant par exemple “je suis dans l'état 0”, “je suis dans l'état 1” et qui fonctionne comme une simple étiquette.
  • Au démarrage la machine est dans l'état initial. Au gré de son fonctionnement elle passe d'un état à l'autre. Quand elle arrive dans l'état final, elle s'arrête, elle a terminé.
  • La machine a une table de fonctionnement. C'est en quelque sorte son programme.

Séquence de fonctionnement

  1. Lecture du symbole sous la tête de lecture / écriture.
  2. Dans la table, recherche de la ligne correspondant à l'état en cours et au symbole lu. Soit (L) cette ligne.
  3. (L) indique quel symbole il faut écrire → Écriture de ce symbole sur la bande.
  4. (L) indique si la tête doit se décaler d'une case à gauche, une case à droite, ou ne pas bouger → Exécution du mouvement.
  5. (L) indique dans quel état la machine doit passer → Actualisation de l'état.
  6. Si l'état courant est l'état final, arrêt. Sinon la machine recommence en 1.

Les machines de Turing ont toutes ce fonctionnement. Les différentes machines se caractérisent par :

  • la site des symboles autorisés,
  • la table de transition.

Un exemple de machine

Soit une machine acceptant les symboles 0 et 1 (le symbole _ est toujours possible)

Voici sa table de transition :

État en cours Symbole lu Écrire Mouvement État suivant
init 1 0 droite init
init 0 1 droite init
init _ _ gauche retour
retour 1 1 gauche retour
retour 0 0 gauche retour
retour _ _ droite fin

Exercice 3

Supposons qu'au démarrage il est écrit [1]10010010 sur la bande.

Décrire le déroulement du fonctionnement de la machine.

J'ai utilisé les [] pour indiquer la position de la tête de lecture / écriture.

Exercice 4

Utiliser le site http://morphett.info/turing/ pour simuler la machine précédente.

Il est courant, pour alléger le tableau, d'utiliser des symboles comme * pour dire “N'importe quel caractère” (pour symbole lu) ou “Aucun changement” (pour Écrire).

En général, on fait commencer la machine au début du mot écrit sur la bande et on fait en sorte que la machine revienne à la même position quand elle s'arrête.

Idée de mot

Les symboles écrits sur la bande forment un mot. Ce mot peut être compris comme un nombre. Par exemple, le mot 110010 est l'écriture binaire de 50.

Exercice 5

  1. Concevez la machine qui, partant de l'écriture binaire d'un nombre $n$, termine avec l'écriture binaire de $2\cdot n$.
  2. Concevez la machine qui, partant de l'écriture binaire d'un nombre $n$, termine avec l'écriture binaire de $2n+1$.
  3. Concevez la machine qui, partant de l'écriture binaire d'un nombre $n$, termine avec l'écriture binaire de $n+1$. C'est plus difficile !

Utilisation de symboles supplémentaires

Nos exemples sont des machines utilisant les symboles 0 et 1. Les mot initial et le mot final ne doivent contenir que les symboles 0 et 1.

Mais parfois, le bon déroulement du programme peut nécessiter d'ajouter d'autres symboles. On est autorisé à ajouter ces symboles en les choisissant pour qu'ils ne créent pas de confusion. On utilise souvent #.

Exercice 6

Concevez un programme qui partant d'un mot $u$ écrit avec des 0 et des 1, termine avec l'écriture inversée de $u$. Par exemple 11000 doit devenir 00011.

Vous aurez besoin d'utiliser un symbole supplémentaire.

Définition mathématique d'une machine

Cette définition sort du programme de terminale NSI. Je vous la donne pour vous donner une idée de l'aspect de l'abstraction des raisonnement que l'on peut mener. Il se peut que vous ayez des cours d'informatique théorique dans le supérieur et ils peuvent tout aussi abstraits qu'un cours de maths – à vrai dire, ce genre de cours prends place dans des cursus maths - info.

On appelle $\Sigma$ l'ensemble des symboles sur lesquels la machine doit pouvoir calculer. On raisonne souvent en ne considérant que les symboles 0 et 1. $\Sigma$ ne contient pas _. $\Sigma$ est appelé un alphabet. On parle aussi de langage pour l'ensemble des mots sur laquelle la machine est susceptible de fonctionner.

Définition : Une machine de Turing sur un alphabet $\Sigma$ est la donnée de

  • un ensemble fini $\Gamma$, l’alphabet de ruban, qui contient $\Sigma$ et d'autres symboles dont au moins le symbole vide _ ;
  • un ensemble fini $Q$, les états ;
  • un élément $i \in Q$, l’état initial ;
  • un élément $f \in Q$, l’état final ;
  • une fonction $\delta : (Q \setminus \lbrace f \rbrace) \times \Gamma \to \Gamma \times \{-1, 0, +1\} \times Q$, la table de transitions.

Ce n'est rien d'autre que ce que l'on a défini plus haut mais avec une rigueur mathématique qui permet un raisonnement abstrait et universel.

Calculabilité

Dans les années 1930, Alonzo Church (1903 - 1995) invente le $\lambda$-calcul. C'est un langage informatique théorique ou tout est fonction. Les travaux de Church précèdent de peu ceux de Turing mais ils finiront par travailler ensemble.

Les langages de programmation Lisp, Haskell, oCaml sont influencés par le $\lambda$-calcul.

Nous allons poursuivre avec les machines de Turing bien que historiquement, les résultats qui nous intéressent ont d'abord été formulés dans le cadre du $\lambda$-calcul de Church. Les deux approches sont équivalentes.

Machine en tant que fonction

On place un mot sur le ruban. Comme le raisonnement est très général et abstrait, on peut imaginer une machine qui fonctionne avec n'importe quel type de symbole (du moment qu'ils sont en nombre fini)

Pour simplifier, on ne va envisager que les symboles de $\Sigma = \lbrace 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\rbrace$, de sorte que le mot écrit sur le ruban représente un nombre entier.

Donc la machine commence avec un nombre $u$ sur le ruban et termine (si elle termine) avec un nombre $v$. On pourra noter comme en mathématiques : $M: u \mapsto v$.

Exemples : On a vu plus haut que l'on pouvait réaliser une machine $M: n \mapsto n+1$ ou encore $M : n \mapsto 2\cdot n$.

Fonction calculable

Intuitivement, une fonction $f$ est une fonction calculable s'il existe une méthode précise qui, étant donné l'antécédent $x$, permet de calculer en un temps fini l'image $f(x)$ en un nombre fini d'étapes.

La thèse de Church -- Turing nous dit qu'une fonction est calculable si et seulement on peut concevoir une machine de Turing réalisant cette fonction.

J'insiste pour plus de clarté : Si un certain calcul n'est pas faisable avec une machine de Turing, alors il est impossible de le faire quelle que soit la méthode !

Exercice 7

  1. Les fonctions $n \mapsto n+1$, $n\mapsto 2\cdot n$ sont-elles calculable ?
  2. La fonction $n \mapsto n^2 + 3 n + 17$ est-elle calculable ?
  3. La fonction $n \mapsto 12$ est-t-elle calculable ?
  4. La fonction dont le tableau de valeur est le suivant est-elle calculable ?
$n$ 1 2 3 4 5 6 7 8 9 10
$f(n)$ 1 1 2 1 2 3 1 2 3 4

Existe-t-il des fonctions non calculables ?

On retrouve un problème semblable à celui de la décidabilité : Existe-t-il des fonctions non calculables ? Comment prouvera-t-on qu'il existe des fonctions pour lesquels aucune méthode fini ne permet d'aboutir au résultat ?

La réponse est : OUI !

Preuve : Il y a plus de fonctions que de machines.

Cette preuve peut sembler surprenante car le nombre de machines possibles est infini – je rappelle qu'en gros, deux machines diffèrent par leur table de transition et rien ne nous empêche d'écrire toutes sortes de tables de transitions. Comment le nombre de fonctions pourrait-il être plus grand encore ?

Le nombre de fonctions est infini lui aussi mais d'un infini d'un ordre plus grand.

Sans rentrer dans trop de détails, on prouve en mathématiques qu'il existe différentes sortes d'infinis. On appelle cardinal d'un ensemble le nombre d'éléments de cet ensemble. Par exemple $card(\left\lbrace 1 ; 4 ; 17\right\rbrace) = 3$ car l'ensemble a 3 éléments. $card(\mathbb{N})$ est bien sûr infini. Cela peut sembler étonnant mais on peut dire qu'il y a “autant” d'éléments dans $\mathbb{N}$ que dans $\mathbb{Z}$ ou $\mathbb{Q}$. En revanche, il y a infiniment plus d'éléments dans $\mathbb{R}$. Dit autrement, $card(\mathbb{N})$ et $card(\mathbb{R})$ sont tous les deux infinis, mais le second est un infini beaucoup plus grand !

Eh bien nous y sommes : le nombres de fonction est un infini semblable à $card(\mathbb{R})$ et le nombre de machines différentes possibles est un infini semblable à $card(\mathbb{N})$. Il y a donc plus de fonctions que de machines et donc on ne peut pas associer une machine à chaque fonction ⇒ Il y a des fonctions non calculables.

On pourrait même dire que les fonctions non calculables sont infiniment plus nombreuses que les fonctions calculables…

Voyons comment se faire une idée de ce que pourrait-être une fonction non calculable. Les fonctions calculables sont des fonctions qui une forme de régularité. Elles sont tellement régulières que parfois on peu énoncé une formule de type $f(x)$ qui s'applique à tous les $x$. Mais une fonction est d'abord une association $f:x\mapsto y$ et rien n'oblige qu'il existe une quelconque forme de régularité dans l'association des $x$ et des $y$. On pourrait imaginer une fonction $f$ dont le tableau de valeur, infini, ne présente aucune forme de régularité. Il faudrait alors une machine dont l'écriture de la table de transition serait infinie ce qui n'est pas possible.

Vous pouvez comparer cette idée avec la différence entre $\mathbb{Q}$ et $\mathbb{R}$. Les nombres de $\mathbb{Q}$ peuvent être des nombres dont l'écriture décimale est infinie, comme :

$$\frac{3}{17} = 0,1764705882352941\,1764705882352941\,1764705882352941\,\cdots$$

L'écriture est infinie, mais elle se répète suivant un schéma. En revanche, on sait que $\mathbb{R}$ contient des nombres, comme $\pi$, dont l'écriture décimale est infini et ne présente aucun schéma.

Lien avec la décidabilité

Nous avons dit : Problème décidable = Il existe un algorithme de longueur finie et de temps d'exécution fini qui répond oui ou non à la question posée.

Nous pourrions chercher une fonction $D(x)$ qui reçoit comme antécédent $x$ une certaine question et qui renvoie en sortie oui ou non. Si une telle fonction était calculable, alors on pourrait écrire un algorithme qui calcul $D(x)$ et alors $x$ serait décidable.

Mais nous avons dit que certains problèmes ne sont pas décidables… Donc on ne peut pas réaliser $D$ sur une machine et elle n'est pas calculable.

La calculabilité et la décidabilité sont donc deux notions liées.

Problème de l'arrêt

Nous avons un argument qui justifie qu'il doit exister des problèmes incalculables / indécidables. Mais nous voulons faire mieux : nous voulons en trouver un.

Machine universelle

J'ai indiqué que dans la démonstration de Kurt Gödel, une astuce permet de considérer un énoncé mathématique soit en tant qu'énoncé, soit en tant que nombre.

Nous allons exploiter la machine de Turing avec une idée semblable : La machine va simultanément être machine et donnée.

Cette idée est essentielle. Dans un ordinateur un exécutable est un fichier qui correspond à une suite d'instruction que la machine peut exécuter, un programme. Mais le fichier exécutable est aussi un fichier, c'est à dire une suite de 0 et de 1 sur un disque dur et nous pouvons lire ce fichier, le copier, le modifier… Il n'y a pas de différence fondamentale entre le fichier en tant que programme à exécuter et le fichier en tant que donnée.

Certaines architectures de microcontrôleur / microprocesseur ont deux mémoires : une pour les données, l'autre pour le programme. On parle d'architecture Harvard. Dans ce cas, données et programmes sont bien séparés. Mais l'architecture la plus courante mélange les deux, c'est l'architecture Von Neumann, en vigueur dans tous nos ordinateurs.

Théorème

Là encore, j'utilise une écriture théorique qui dépasse le programme de NSI. Remarquez qu'il s'agit bien d'un théorème avec toute la rigueur mathématique nécessaire.

Il existe une machine $U$ telle que pour toute machine $M$ et tout entier $x$, on e peut trouver un mot $m$ tel que

  • $U(m\#x) = 1\#y$ avec $y = M(x)$, si $M(x)$ existe
  • $U(m\#x) = 0$ si $M(x)$ n'est pas défini.

Que signifie ce théorème ?

Soit une fonction calculable $f: x \mapsto y$. Elle est calculable, donc on peut fabriquer machine $M$ qui calcule $f$.

C'est une machine spécifique, faite exprès pour calculer $f$, elle ne calcule rien d'autre. Elle est comme un circuit électronique qui, une fois soudé, ne saurait faire qu'un calcul.

Le théorème nous dit que l'on peut fabriquer une machine U et que sur cette machine U on pourra simuler le fonctionnement de n'importe quelle machine M. Il suffira pour cela de déterminer un certain mot m, correspondant à la machine M.

Vous pouvez comprendre U comme un ordinateur moderne et $m$ comme un programme : On fournit à l'ordinateur deux données :

  • le programme à exécuter, m
  • la donnée x sur laquelle exécuter le programme.

Le cœur du raisonnement tient sur le double statut de m. m représente le fonctionnement d'une machine en tant que programme exécutable ; m est une donnée écrite traitée par la machine U.

La machine $U$ peut simuler toutes les machines possibles. Elle est universelle.

On peut représenter cela de façon plus synthétique.

L'arrêt

Il s'agit du problème incalculable que l'on veut énoncer.

Soit $M$ représentant une machine quelconque. $m$ est le nombre représentant $M$ sur la machine universelle. $x$ est une donnée.

On se demande si la fonction $A$ telle que $A(m,x) = \begin{cases}1\text{ si }M(x)\text{ termine}\\0\text{ sinon}\end{cases}$ est calculable.

On sait que certains programmes, quand on leur fournit certaines entrées, peuvent entrer dans une boucle infinie et ne jamais terminer. Sur un programme particulier on peut arriver à savoir s'il terminera ou s'il ne terminera pas. La fonction $A$ qui nous intéresse serait une fonction qui ferait ce travail pour n'importe quel programme $m$, automatiquement.

Nous allons raisonner par l'absurde en supposant que la machine A existe. Cela signifie qu'il existe un programme $a$ que l'on pourrait énoncer ainsi :

FONCTION A(m,x)
  Entrées :
    m: programme correspondant à M
    x: entrée pour laquelle on veut M(x) = f(x)
  DÉBUT
    SI l'exécution de M(x) termine ALORS
      RENVOYER 1
    SINON
      RENVOYER 0
    FIN
  FIN

Nous allons prouver – c'est le principe d'un raisonnement par l'absurde – que l'existence de A aboutit à une contradiction. Pour énoncer cette contradiction, à partir de A, nous concevons une machine Q – ou un programme q ce qui revient au même.

FONCTION Q(m)
  Entrées :
    m: programme correspondant à M
  DÉBUT
    Soit x = m
    SI l'exécution de A(m,x) == 1 ALORS
      TANT QUE 1==1 RÉPÉTER
        # ceci est une boucle infinie
      FIN
    SINON
      RENVOYER 1
    FIN
  FIN

Donc si A(m,m) == 1, Q entre dans une boucle infinie et ne termine pas.

Notez bien ce qui se passe ne ligne 6 : m est un code, un nombre, pouvant être vu comme un programme ou une donnée. Quand on appelle A(m,x), m est utilisé en tant que programme et x en tant que donnée, un nombre par exemple. Mais en ayant posé x = m, on va utiliser simultanément m selon les deux points de vue possibles.

Et maintenant, que se passe-t-il si on essaie de calculer Q(q) ?

Autrement dit que se passe-t-il si on calcule Q(x) avec x = q.

  • Soit l'exécution de Q(q) termine Dans ce cas, A(q,q) == 1 et donc en ligne 6 de l'exécution de Q, on entre dans une boucle infinie ⇒ Q(q) ne termine pas.
  • Soit l'exécution de Q(q) ne termine pas. Dans ce cas, A(q,q) == 0 et donc en ligne 6 de l'exécution de Q on oriente vers le SINON et Q(q) termine en renvoyant 1.

Nous avons obtenu la contradiction : si Q(q) termine ⇒ Q(q) ne termine pas ; si Q(q) ne termine pas ⇒ Q(q) termine. C'est illogique. Pour lever la contradiction, on est obliger de rejeter l'hypothèse disant que A existe.

De façon équivalente, le problème de l'arrêt, est indécidable. C'est à dire qu'il n'existe pas d'algorithme universel qui pour tout algorithme $\alpha$ et toute entrée $x$, pourra conclure $\alpha(x)$ termine ou $\alpha(x)$ ne termine pas.

Le paradoxe du menteur

Comme annoncé, la démonstration repose sur une contradiction comme celle du menteur qui dit “je mens”.

La démonstration est compliquée parce qu'elle se veut très rigoureuse : Dans le paradoxe du menteur, on se dit qu'il y a juste un truc lié à l'ambiguïté des mots, que personne ne mens jamais tout le temps de façon systématique, que cela n'a aucun sens, c'est juste amusant.

La démonstration de Gödel et le problème de l'arrêt s'attache à reproduire la même idée d'une façon très rigoureuse en ne laissant aucune ambiguïté possible, par simple utilisation de la logique.

Pour la route, une contradiction performative – c'est à dire une phrase qui devient une contradiction par le simple fait de la dire, un peu comme “oh, vous savez, moi, je suis très modeste !”.

Définition : Le mot le plus court ne pouvant être défini par aucune définition de moins de cent lettres.

Notez bien que cette définition compte 74 lettres : cette définition de 74 lettres définit un mot qui ne peut pas être défini par une définition de moins de 100 lettres !

nsi/terminales/calculabilite/ancien.txt · Dernière modification : de goupillwiki