Aller au contenu

Décidabilité et calculabilité

I. Introduction⚓

  • Programme en tant que donnĂ©e

Un compilateur, un dĂ©bugueur, un interprĂ©teur sont des programmes qui prennent en paramĂštres d’autres programmes. C’est aussi le cas d’un logiciel de tĂ©lĂ©chargement, ou d’un systĂšme d’exploitation qui va faire tourner d’autres programmes. Ainsi, tout programme peut ĂȘtre perçu comme une donnĂ©e pour un autre programme.

  • CalculabilitĂ© et dĂ©cidabilitĂ©, deux notions proches

Étudier la calculabilitĂ© d’une fonction ou la dĂ©cidabilitĂ© d’un problĂšme, c’est chercher si cette fonction peut ĂȘtre calculĂ©e, ou si ce problĂšme peut ĂȘtre rĂ©solu, Ă  l’aide d'un algorithme.

II. ProblĂšmes de dĂ©cision et dĂ©cidabilitĂ©âš“ïžŽ

  • DĂ©finitions Un problĂšme de dĂ©cision est un problĂšme qui prend une entrĂ©e (une donnĂ©e) et renvoie en sortie oui ou non. Un problĂšme de dĂ©cision est dit dĂ©cidable s'il existe un algorithme qui, pour chaque entrĂ©e, rĂ©pond par oui ou par non Ă  la question posĂ©e par le problĂšme. S'il n'existe pas un tel algorithme, le problĂšme est dit indĂ©cidable.

2.1. Classement des problĂšmes de dĂ©cision⚓

2.1.1. ProblĂšmes ayant une solution en temps polynomial⚓

  • Deux entiers n et p sont-ils premiers entre eux ?
  • Un programme en Python est-il syntaxiquement correct ?
  • Un graphe est-il connexe ?

On note P l’ensemble des problĂšmes de dĂ©cision rĂ©solubles en temps polynomial.

2.1.2. ProblĂšmes ayant une solution, mais pas en temps polynomial⚓

  • Une grille de Sudoku a-t-elle une solution ?
  • Un graphe donnĂ© peut-il ĂȘtre colorĂ© avec trois couleurs sans que deux sommets voisins aient la mĂȘme couleur ?
  • Étant donnĂ© un entier d, des villes et les distances entre les villes, existe-t-il un trajet passant par toutes les villes de longueur infĂ©rieur Ă  d ? (problĂšme du voyageur de commerce, TSP).

ProblĂšmes NP

Entre les catĂ©gories 1 et 2, on peut considĂ©rer la catĂ©gorie des problĂšmes NP (Non dĂ©terministe Polynomial). Il s’agit des problĂšmes pour lesquels la vĂ©rification d’une solution candidate donnĂ©e est en temps polynomial, mais la recherche d’une solution est a priori en temps exponentiel. On se demande s’il existe pour ces problĂšmes des solutions en temps polynomial. C’est une des plus grandes questions ouvertes en informatique. Est-ce que P = NP ?

2.2. ProblĂšmes pour lesquels on ne connaĂźt pas d’algorithmes⚓

  • Étant donnĂ© des entiers n et k et un chiffre c, existe-t-il une expression avec les opĂ©rateurs +, -, ×, /, √ et ! utilisant au plus k fois le chiffre c dont la valeur est n ? (problĂšme Tchisla)

2.3. ProblĂšmes indĂ©cidables (pour lesquels on sait qu’il n’existe pas d’algorithme)⚓

  • Peut-on paver le plan avec des polyominos de formes donnĂ©es ?

    Un polyomino est une piĂšce type Tetris, c’est-Ă -dire constituĂ©e de carrĂ©s identiques juxtaposĂ©s. Si certains polyominos permettent de former un rectangle, on pourra paver le plan, mais avec les piĂšces donnĂ©es ci-dessous, cela semble difficile.

    En 1970, Solomon W. Golomb montre que ce problĂšme est indĂ©cidable, qu’il n’existe pas d’algorithme acceptant un nombre fini de formes de polyominos en entrĂ©e et indiquant en sortie si on peut paver le plan avec ces formes.

  • Une Ă©quation diophantienne donnĂ©e possĂšde-t-elle une solution entiĂšre ?

    Une Ă©quation diophantienne est une Ă©quation polynomiale Ă  plusieurs variables Ă  coefficient entiers, comme \(2x – 4 y + 6z = 0\), \(x^2 – 4xy + y^3 = 8\) ou \(x^3 + y^3 + z^3 = 42\), etc.

    En 1900, David Hilbert demande s’il existe un algorithme capable de dĂ©cider pour n’importe quelle Ă©quation diophantienne si elle possĂšde ou non une solution. C’est le dixiĂšme problĂšme d’une sĂ©rie de 23 problĂšmes difficiles qu’il pose au congrĂšs international des mathĂ©maticiens Ă  Paris.

    Ce n’est qu’en 1970 qu’un mathĂ©maticien russe, Iouri Matiassevitch, prouve qu’il n’existe pas un tel algorithme, donc qu’il s’agit d’un problĂšme indĂ©cidable. Cela ne signifie pas qu’une Ă©quation donnĂ©e ne peut pas ĂȘtre rĂ©solue, mais qu’il n’existe pas une mĂ©thode unique applicable Ă  toutes les Ă©quations diophantiennes.

    A propos des équations diophantiennes : problÚme de la somme de trois cubes
    ‱ \(x^3 + y^3 + z^3 = 43\) admet pour solution \(x = 2\), \(y = 2\) et \(z = 3\).
    ‱ \(x^3 + y^3 + z^3 = 42\) est restĂ©e sans solution jusqu’en septembre 2019 !

    Andrew Booker et Andrew Sutherland l’ont trouvĂ© aprĂšs une recherche exhaustive sur Charity Engine.

    Des travaux mathématiques préalables leur ont permis de réduire les cas à explorer plutÎt que de faire une simple triple boucle.

    Plus d’un million d’heures de calcul parallĂ©lisĂ© (114 ans) ont permis de trouver comme solution :

    \(x = -80538738812075974\)

    \(y = 80435758145817515\)

    \(z = 12602123297335631\).

    En mars 2019, Andrew Booker avait trouvé une solution à \(x^3 + y^3 + z^3 = 33\).

    On connaĂźt maintenant des solutions Ă  \(x^3 + y^3 + z^3 = k\) pour tous les entiers \(k\) entre \(0\) et \(1000\) Ă  l’exception des valeurs \(114\), \(390\), \(627\), \(633\), \(732\), \(921\) et \(975\) (en fĂ©vrier 2024).

Programme en tant que donnĂ©e, calculabilitĂ©, dĂ©cidabilitĂ©, et problĂšme de l'arrĂȘt⚓

  • Comprendre que tout programme est aussi une donnĂ©e.
  • Comprendre que la calculabilitĂ© ne dĂ©pend pas du langage de programmation utilisĂ©.
  • Montrer, sans formalisme thĂ©orique, que le problĂšme de l’arrĂȘt est indĂ©cidable.
  • ThĂšse de Church
Décidabilité - Calculabilité - Cédric Gerland (18:22)

IndĂ©cidabilitĂ© du problĂšme de l’arrĂȘt⚓

On considĂšre une fonction, qui pour tout algorithme et valeur d’entrĂ©e pour cet algorithme, indique si l’algorithme s’arrĂȘte ou pas. Cette fonction est incalculable, ce qui revient Ă  dire que le problĂšme de l'arrĂȘt est indĂ©cidable. Ce rĂ©sultat a Ă©tĂ© prouvĂ© par Alan Turing en 1936.

En d’autres termes, il n'existe pas de programme qui prenne en argument n'importe quel programme avec une valeur d’entrĂ©e et qui, en temps fini, renvoie « oui » si l'exĂ©cution du programme reçu en argument finit par s'arrĂȘter avec l’entrĂ©e spĂ©cifiĂ©e et « non » s'il ne finit pas.

Proof That Computers Can't Do Everything (The Halting Problem) (07:52)

  • DĂ©monstration :

    Preuve n°1 (classique)

    On suppose qu’il existe un programme halt, qui prend en argument le code d’un programme P (sous forme de chaĂźne de caractĂšres) et un argument x de P et renvoie True si P s’arrĂȘte sur x, et False sinon.

    On s’intĂ©resse plus prĂ©cisĂ©ment aux programmes qui prennent en paramĂštre une chaine de caractĂšres : x est donc une chaĂźne de caractĂšres. On considĂšre la fonction suivante :

    🐍 Editeur
    def contradiction(P: str):
        if halt(P, P):
            while True:
                print("Le code boucle")
        else:
            print("Le code s’arrĂȘte")
    
    Que se passe-t-il quand on lance contradiction(code_contradiction) ?

    • Soit cet appel s’arrĂȘte : dans ce cas, halt(code_contradiction, code_contradiction) renvoie True et on entre dans une boucle infinie. C’est absurde !

    • Soit cet appel ne s’arrĂȘte pas : halt(code_contradiction, code_contradiction) renvoie False, puis le programme s’arrĂȘte !

    Dans les deux cas, on aboutit à une contradiction. On en déduit que le programme halt ne peut pas exister.

    Preuve n°2

    On suppose qu’il existe une fonction halt(f, x) -> bool: qui prend en paramĂštres le code source d’une fonction f et un argument x de cette fonction puis indique si f(x) s’arrĂȘte ou boucle indĂ©finiment.

    On considĂšre la fonction contradiction, prenant en argument un entier x.

    🐍 Editeur
    def contradiction(x):
        if halt(code_contradiction, x):
            while True:
                print("Le code boucle")
        else:
            print("Le code s’arrĂȘte")
    

    Que fait contradiction(0) (ou contradiction(37), etc.) ?

    • Si halt(code_contradiction, 0) == True, alors contradiction(0) doit s’arrĂȘter. Or, dans ce cas, on entre dans une boucle infinie !

    • A l’inverse, si halt(code_contradiction, 0) == False, alors contradiction(0) ne s’arrĂȘte pas, et pourtant, dans ce cas, selon le code, contradiction(0) s’arrĂȘte !

    Dans les deux cas, on arrive à une contradiction, ce qui prouve que la fonction halt n’existe donc pas !!!

    Le PROBLEME DE L'ARRET est donc INDECIDABLE !

La machine de Turing : tout ne se calcule pas !⚓

Le Blob (Cité des sciences et Industrie & Palais de la découverte) (10:25)

Machine de Turing virtuelle⚓

Machine de Turing par Bordas (application web)

Comment fonctionne une machine de Turing ?⚓

Application en ligne sur Interstices.info

CalculabilitĂ© et dĂ©cidabilitĂ© (doc. Eduscol)⚓

Fichier PDF

DĂ©cidabilitĂ© et complexitĂ© (vidĂ©os)⚓

Vidéos de Gilles Bailly-Maitre de l'Université de La Rochelle

#1/4 : Machines de Turing⚓

Machines de Turing (49:48)

#2/4 : ComplexitĂ©âš“ïžŽ

Complexité (32:28)

#3/4 : Classe P vs classe NP⚓

Classe P vs classe NP (38:55)

#4/4 : ProblĂšmes NP-complets⚓

ProblĂšmes NP-complets (32:19)