Activités préparatoires#
Calculabilité et décidabilité
Activité 1 Un programme peut en manger un autre#
recettes, programmes qui lisent des programmes, et un devin malheureux
Durée : 25 min · Sans ordinateur, par deux
Consignes
- On lit, on prédit, on joue ; on répond sur le cahier. Aucun mot de vocabulaire n’est attendu avant l’exercice 4.
Exercice 1 — La recette de crêpes #
Une fiche porte la recette des crêpes. Recopier et compléter sur le cahier le tableau suivant : pour chaque situation, dire qui travaille (la « machine »), ce qu’il reçoit (la « donnée ») et si la recette est exécutée (on obtient des crêpes) ou seulement lue comme un texte.
| Situation | Qui travaille ? | Ce qu’il reçoit | Exécutée ou lue ? |
|---|---|---|---|
| Un cuisinier suit la recette. | |||
| Une photocopieuse en tire dix exemplaires. | |||
| Un traducteur la met en anglais. | |||
| Un correcteur orthographique la relit. | |||
| Un éditeur compte le nombre de lignes de la recette pour la mise en page. |
- Un même texte peut-il être tantôt « des instructions à suivre », tantôt « une donnée à traiter » ?
Corrigé
| Situation | Qui travaille ? | Ce qu’il reçoit | Exécutée ou lue ? |
|---|---|---|---|
| cuisinier | le cuisinier | la recette | exécutée |
| photocopieuse | la photocopieuse | la recette | lue (copiée) |
| traducteur | le traducteur | la recette | lue (traduite) |
| correcteur orthographique | le correcteur | la recette | lue (vérifiée) |
| compter les lignes | l’éditeur | la recette | lue (mesurée) |
- Oui : le même texte est une suite d’instructions pour le cuisinier, et une simple donnée pour tous les autres. Tout dépend de qui le reçoit et de ce qu’il en fait.
Exercice 2 — Python lit du Python #
On considère la fonction suivante, enregistrée dans un fichier test.py, suivie de l’appel accueil(3) :
def accueil(n):
for k in range(n):
print("bonjour")
-
Dans un terminal, on tape
python3 test.py. Qu’est-ce qui s’affiche ? Dans cette commande, quel est le programme qui travaille, et quelle est sa donnée ? -
On range maintenant le texte de la fonction dans une chaîne de caractères, et on écrit une autre fonction :
source = 'def accueil(n):\n for k in range(n):\n print("bonjour")\n' def compter_lignes(code): nb = 0 for c in code: if c == "\n": # un passage a la ligne nb += 1 return nbQue renvoie
compter_lignes(source)? Un « bonjour » est-il affiché ? -
En Python,
exec(chaine)exécute le programme écrit dans la chaîne. Qu’affiche l’instructionexec(source + "accueil(2)\n")? -
La fonction
compter_lignesa elle aussi un texte (six lignes). Peut-on lui donner son propre texte en entrée ? Que renverrait-elle ?
Corrigé
-
Il s’affiche trois fois
bonjour. Le programme qui travaille estpython3(l’interpréteur) ; sa donnée est le fichiertest.py, c’est-à-dire le texte d’un programme. (Etpython3est lui-même lancé par le terminal, qui tourne sur le système d’exploitation…) -
compter_lignes(source)renvoie \(3\) (trois passages à la ligne) ; aucunbonjourn’est affiché : le texte deaccueilest lu, pas exécuté — comme la recette par la photocopieuse. -
Deux
bonjour:execexécute le texte reçu (définition deaccueil, puis appelaccueil(2)) — comme le cuisinier.execest un interpréteur Python dans Python. -
Oui : le texte de
compter_lignesest une chaîne comme une autre ; elle renverrait \(6\). Un programme peut recevoir son propre texte en entrée : rien de magique, c’est une donnée.
Exercice 3 — Le devin et le contrariant #
Le jeu (à deux). Le devin écrit en secret sur un papier une prédiction : « tu vas lever la main » ou « tu ne vas pas lever la main », puis tend le papier au contrariant. Le contrariant lit la prédiction et fait exactement le contraire. Jouer trois manches en échangeant les rôles.
-
Combien de fois le devin a-t-il eu raison ? Existe-t-il une prédiction gagnante pour le devin ? Pourquoi ?
-
Que changerait la règle si le contrariant n’avait pas le droit de lire la prédiction ?
-
Le menteur. La phrase « Cette phrase est fausse. » est-elle vraie ? fausse ?
-
Le barbier. Dans un village, le barbier rase tous les hommes qui ne se rasent pas eux-mêmes, et seulement ceux-là. Le barbier se rase-t-il lui-même ?
-
Qu’ont en commun le contrariant, la phrase du menteur et le barbier ?
Corrigé
-
Le devin a eu raison zéro fois. Aucune prédiction n’est gagnante : quelle que soit celle qu’il écrit, le contrariant la lit et fait l’inverse. Le devin n’est pas « mauvais » : sa tâche est impossible dès que sa prédiction est lue par celui qu’elle concerne.
-
Le contrariant ne pourrait plus contredire : le devin aurait raison une fois sur deux au hasard, et la contradiction disparaîtrait. Tout le piège vient de ce que la prédiction porte sur celui qui la lit et lui est donnée.
-
Ni l’un ni l’autre : si elle est vraie, ce qu’elle dit est vrai, donc elle est fausse ; si elle est fausse, ce qu’elle dit est faux, donc elle est vraie (paradoxe du menteur).
-
S’il se rase, il fait partie de ceux qui se rasent eux-mêmes, donc il ne devrait pas se raser ; s’il ne se rase pas, il devrait se raser. Aucune réponse ne tient : un tel barbier ne peut pas exister.
-
Les trois parlent d’eux-mêmes (ou reçoivent un énoncé sur eux-mêmes) et le contredisent : c’est l’auto-référence.
Exercice 4 — Mettre des mots #
-
Recopier et compléter sur le cahier, avec vos mots.
-
Pour l’ordinateur, le texte d’un programme est avant tout …
-
Un programme qui lit le texte d’un autre programme et l’exécute s’appelle …
-
Un programme peut même recevoir en entrée …
-
Le contrariant est imbattable parce qu’il …
-
-
Une question pour la suite. On rêve d’un programme « devin » qui lirait le texte de n’importe quel programme et prédirait, sans l’exécuter, s’il finira par s’arrêter ou s’il tournera pour toujours. Un tel devin peut-il exister ? Donner votre intuition, en pensant au contrariant.
Corrigé
-
Mots attendus : une donnée (une chaîne de caractères) ; un interpréteur ; son propre texte (le programme peut se prendre lui-même en entrée) ; lit la prédiction qui le concerne et fait le contraire.
-
Intuition attendue : non. Si un tel devin existait, on pourrait écrire un programme « contrariant » qui demande au devin ce qu’il va faire lui-même, puis fait l’inverse (boucler si le devin prédit l’arrêt, s’arrêter sinon). C’est exactement la preuve du cours. On laisse la question ouverte : le cours y répond.