Chapitre 15 : Calculabilité, décidabilité.

🕐 Historique:

Alan Turing est souvent vu comme le père de l'informatique.

Quelques dates clés :

  • 1912 : Naissance d'Alan Turing à Londres.
  • 1936 : Publication de "On Computable Numbers", où il introduit la machine de Turing, posant les bases de l'informatique moderne.
  • 1940-1945 : Travaille à Bletchley Park pendant la Seconde Guerre mondiale, où il contribue à décrypter la machine Enigma.
  • 1950 : Propose le test de Turing dans un article sur l'intelligence artificielle, pour évaluer si une machine peut imiter l'intelligence humaine.
  • 1952 : Condamné pour homosexualité et forcé à subir une castration chimique.
  • 1954 : Mort d'Alan Turing, officiellement par suicide, bien que les circonstances restent débattues.

1. Tout programme peut être une donnée:

Tout programme peut être vu comme une donnée :

Cette précision est là pour bien mettre en avant que de nos jours qu'un algorithme est programmable et n'est donc pas induit dans la conception de la machine elle même. On fait ainsi la différence, par exemple, entre une horloge mécanique et une montre programmée informatiquement.

2. Church-Turing

Dans les années 1930, les travaux des mathématiciens Alonso Church et Alan Turing ont permis d'éclaircir ce qu'est un programme basés sur des calculs.

3.Machine de Turing

Une machine de Turing est une machine conceptualisée par Alan Turing. C'est une machine imaginaire que l'on peut représenter ainsi:

4. Exercice

A faire dans le cahier.

On possède la table de transition suivante.

Etat Valeur lue Ecriture Direction Nouvel état
0 vide vide gauche 1
0 0 0 droite 0
0 1 1 droite 0
0 2 2 droite 0
0 3 3 droite 0
0 4 4 droite 0
0 5 5 droite 0
0 6 6 droite 0
0 7 7 droite 0
0 8 8 droite 0
0 9 9 droite 0
1 0 1 gauche 2
1 1 2 gauche 2
1 2 3 gauche 2
1 3 4 gauche 2
1 4 5 gauche 2
1 5 6 gauche 2
1 6 7 gauche 2
1 7 8 gauche 2
1 8 9 gauche 2
1 9 0 gauche 1
1 Vide 1 STOP
2 0 0 gauche 2
2 1 1 gauche 2
2 2 2 gauche 2
2 3 3 gauche 2
2 4 4 gauche 2
2 5 5 gauche 2
2 6 6 gauche 2
2 7 7 gauche 2
2 8 8 gauche 2
2 9 9 gauche 2
2 Vide Vide STOP

Appliquer la table de transition ci-dessus sur le ruban suivant :

2 3 5

L'initialisation se fait sur la case 2 avec pour état 0.

5. Exercice

A faire dans le cahier.

Refaire l'exercice 4 avec le ruban suivant :

2 9 9

L'initialisation se fait sur la case 2 avec pour état 0.

6. Exercice

Refaire l'exercice 4 avec le ruban suivant :

A faire dans le cahier.

9 9 9

L'initialisation se fait sur le tout premier 9 avec pour état 0.

7. Exercice

A faire dans le cahier.

On considère le ruban suivant :

1 1 0 1 1

Ecrire une table de transition permettant de remplacer le 0 par un 1.

L'initialisation se fait sur la case vide la plus à gauche. Le programme s'arretera sur cette même case.

8. Exercice

A faire dans le cahier.

On considère le ruban suivant :

1 1 0 1 1

Ecrire une table de transition permettant de remplacer le 0 par un 1 et réciproquement puis de rajouter un 1 à l'avant dernière case.

L'initialisation se fait sur le tout premier 1 et le programme stoppera sur la case vide la plus à droite.

9. Thèse de Church-Turing

Tout traitement réalisable mécaniquement peut-être accompli par une machine de Turing.

10. La calculabilité en informatique

Définition

En informatique, la calculabilité étudie ce qu’un ordinateur peut ou ne peut pas résoudre à l’aide d’un programme.

Problème calculable

Un problème est dit calculable s’il existe un algorithme qui fournit une réponse correcte et qui termine pour toute entrée possible.

Problème non calculable

Un problème est dit non calculable lorsqu’aucun algorithme ne peut le résoudre dans tous les cas possibles.

Limites de l’informatique

La calculabilité ne dépend pas de la puissance de l’ordinateur, mais des limites théoriques de l’informatique.

11. Exemples de problèmes calculables

12. Exemples de problèmes non calculables

13. La décidabilité en informatique

Définition

En informatique, un problème est dit décidable s’il existe un algorithme qui donne une réponse oui ou non pour toutes les entrées possibles, et qui se termine toujours.

Problème décidable

Un problème est décidable lorsqu’un algorithme permet de répondre correctement dans tous les cas, sans jamais boucler indéfiniment.

Problème indécidable

Un problème est indécidable lorsqu’aucun algorithme ne peut répondre correctement pour toutes les entrées tout en garantissant de toujours s’arrêter.

Lien avec la calculabilité

La décidabilité concerne des problèmes à réponse oui / non. Tout problème décidable est calculable, mais certains problèmes calculables ne sont pas décidable sous forme de question fermée.

Exemple célèbre

Le problème de l’arrêt consiste à savoir si un programme s’arrêtera ou non pour une entrée donnée. Ce problème est indécidable : aucun algorithme ne peut toujours donner la bonne réponse.

14. Le problème de l'arrêt

On peut se poser la question s'il est possible de savoir si un problème (un algorithme) s'arrêtera.

Est-il possible d'écrire un algorithme permettant de voir si n'importe quel autre algorithme s'arrête ou non?

Raisonnons par l'absurde :

Imaginons que ce programme que l'on appellera \(A\) existe.

Si on lui donne un programme \(P\) quelconque, alors \(A(P)=VRAI\) si le programme P s'arrête et \(A(P)=FAUX\) si le programme P ne s'arrête pas.

Regardons maintenant un programme \(B\) qui est définit de la manière suivante :

  1. Il prend un programme \(P\) puis évalue \(A(P)\).
  2. Si \(A(P)\) est \(VRAI\), il lance une boucle infinie.
  3. Si \(A(P)\) est \(FAUX\), il s'arrête.

Regardons \(B(B)\)

\(B\) ne peut pas exister donc A non plus.

15. Prouver la correction d’un algorithme

Qu’est-ce que la correction d’un algorithme ?

Un algorithme est dit correct s’il produit toujours le résultat attendu pour toutes les entrées valides.

Objectif d’une preuve de correction

Prouver la correction d’un algorithme consiste à montrer, de manière logique et rigoureuse, que l’algorithme fait exactement ce qui est demandé dans l’énoncé.

Deux aspects de la correction

Rôle des invariants

Pour les algorithmes utilisant des boucles, on utilise souvent un invariant de boucle.

Un invariant est une propriété qui est vraie :

🛠 Méthode générale de preuve

Exemple simple

Algorithme : calculer la somme des éléments d’une liste.

somme = 0
pour chaque element de la liste :
    somme = somme + element

Invariant : après chaque itération, somme est égale à la somme des éléments déjà parcourus.

À la fin de la boucle, tous les éléments ont été parcourus, donc somme est bien la somme totale.

16. Exercice :

A faire dans le cahier

On considère l’algorithme suivant, écrit en Python :

def maximum(liste):
    max_val = liste[0]
    for x in liste:
        if x > max_val:
            max_val = x
    return max_val
  

On suppose que liste est une liste non vide de nombres.

  1. Quel est le rôle de la variable max_val dans cet algorithme ?
  2. Formuler un invariant de boucle concernant max_val.
  3. Expliquer pourquoi cet invariant est vrai :
    • avant la boucle,
    • conservé à chaque itération,
    • utile à la fin de la boucle.
  4. En déduire que l’algorithme renvoie bien le plus grand élément de la liste.

17. La terminaison d’un algorithme

Définition

Un algorithme est dit terminant s’il s’arrête après un nombre fini d’étapes, quelle que soit l’entrée fournie.

Pourquoi la terminaison est importante

Un algorithme qui ne termine pas ne donne jamais de résultat. La terminaison est donc une condition indispensable pour qu’un algorithme soit correct.

Causes fréquentes de non-termination

Principe de preuve de terminaison

Pour prouver qu’un algorithme termine, on montre qu’à chaque étape une quantité diminue strictement et qu’elle ne peut pas diminuer indéfiniment.

Exemple simple

def compte_a_rebours(n):
    while n > 0:
        n = n - 1

Ici, la variable n est un nombre entier qui diminue strictement à chaque tour et ne peut pas devenir négative. La boucle termine donc forcément.

18. Exercice : Terminaison d’un algorithme

A faire dans le cahier

On considère l’algorithme suivant :

def mystere(n):
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = n + 1
    return n

On suppose que n est un entier strictement positif.

Questions :

  1. Expliquer ce que fait cet algorithme lorsque n est pair.
  2. Expliquer ce que fait cet algorithme lorsque n est impair.
  3. L’algorithme se termine-t-il pour toutes les valeurs de n ? Justifier.
  4. Indiquer si la terminaison de cet algorithme est prouvée ou simplement observée expérimentalement.