Alan Turing est souvent vu comme le père de l'informatique.
Quelques dates clés :
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.
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.
Une machine de Turing est une machine conceptualisée par Alan Turing. C'est une machine imaginaire que l'on peut représenter ainsi:
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.
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.
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.
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.
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.
Tout traitement réalisable mécaniquement peut-être accompli par une machine de Turing.
En informatique, la calculabilité étudie ce qu’un ordinateur peut ou ne peut pas résoudre à l’aide d’un programme.
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.
Un problème est dit non calculable lorsqu’aucun algorithme ne peut le résoudre dans tous les cas possibles.
La calculabilité ne dépend pas de la puissance de l’ordinateur, mais des limites théoriques de l’informatique.
Étant donné un programme et une entrée, déterminer avec certitude si ce programme va s’arrêter ou tourner indéfiniment. Il n’existe aucun algorithme capable de répondre correctement dans tous les cas.
Écrire un programme capable d’identifier avec certitude tous les programmes malveillants possibles. Ce problème est non calculable car un virus peut se comporter comme un programme normal.
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.
Un problème est décidable lorsqu’un algorithme permet de répondre correctement dans tous les cas, sans jamais boucler indéfiniment.
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.
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.
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.
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 :
Regardons \(B(B)\)
\(B\) ne peut pas exister donc A non plus.
Un algorithme est dit correct s’il produit toujours le résultat attendu pour toutes les entrées valides.
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é.
Pour les algorithmes utilisant des boucles, on utilise souvent un invariant de boucle.
Un invariant est une propriété qui est vraie :
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.
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.
max_val dans cet algorithme ?max_val.Un algorithme est dit terminant s’il s’arrête après un nombre fini d’étapes, quelle que soit l’entrée fournie.
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.
Pour prouver qu’un algorithme termine, on montre qu’à chaque étape une quantité diminue strictement et qu’elle ne peut pas diminuer indéfiniment.
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.
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 :
n est pair.n est impair.n ? Justifier.