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
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.
-
Démonstration :
Preuve n°1 (classique)
On suppose quâil existe un programme
halt
, qui prend en argument le code dâun programmeP
(sous forme de chaĂźne de caractĂšres) et un argumentx
deP
et renvoieTrue
siP
sâarrĂȘte surx
, etFalse
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 :
đ EditeurQue se passe-t-il quand on lancedef contradiction(P: str): if halt(P, P): while True: print("Le code boucle") else: print("Le code sâarrĂȘte")
contradiction(code_contradiction)
?-
Soit cet appel sâarrĂȘte : dans ce cas,
halt(code_contradiction, code_contradiction)
renvoieTrue
et on entre dans une boucle infinie. Câest absurde ! -
Soit cet appel ne sâarrĂȘte pas :
halt(code_contradiction, code_contradiction)
renvoieFalse
, 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 fonctionf
et un argumentx
de cette fonction puis indique sif(x)
sâarrĂȘte ou boucle indĂ©finiment.On considĂšre la fonction
contradiction
, prenant en argument un entierx
.đ Editeurdef contradiction(x): if halt(code_contradiction, x): while True: print("Le code boucle") else: print("Le code sâarrĂȘte")
Que fait
contradiction(0)
(oucontradiction(37)
, etc.) ?-
Si
halt(code_contradiction, 0) == True
, alorscontradiction(0)
doit sâarrĂȘter. Or, dans ce cas, on entre dans une boucle infinie ! -
A lâinverse, si
halt(code_contradiction, 0) == False
, alorscontradiction(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 ! -