<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Calculabilité et décidabilité</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Notion de programme en tant que donnée, calculabilité,<br/>
décidabilité, indépendance de la calculabilité vis-à-vis<br/>
du langage de programmation, problème de l'arrêt et son<br/>
indécidabilité (présentés sans formalisme théorique).</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q01 : Programme et donnée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi peut-on dire qu'<strong>un programme est aussi une<br/>
donnée</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un compilateur prend en entrée un programme (donnée<br/>
texte) et en produit un autre (programme exécutable).<br/>
Un interpréteur Python lit un programme et l'exécute<br/>
ligne par ligne. Cette dualité programme/donnée<br/>
ouvre la voie à toute la métacomputation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cette affirmation est fausse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est au contraire l'un des principes<br/>
fondamentaux de l'informatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'un programme contient toujours des données en entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on parle ici du programme lui-même<br/>
considéré comme donnée, pas de ses entrées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'il occupe de la mémoire vive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est vrai mais incomplet : la phrase clé est<br/>
que le programme peut être <strong>lu par un autre<br/>
programme</strong>, pas seulement chargé en mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'un programme est stocké dans un fichier, manipulé, transmis et lu par d'autres programmes (compilateur, interpréteur, antivirus...) au même titre que n'importe quelle donnée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sur un disque, un fichier .py<br/>
est une suite d'octets exactement comme une<br/>
image ou un texte. C'est cette idée qui rend<br/>
possibles les compilateurs, les interpréteurs<br/>
ou la mise à jour automatique des logiciels.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q02 : Programme manipulé par un autre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel des exemples suivants illustre <strong>un programme<br/>
manipulé comme une donnée</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les compilateurs, les interpréteurs, les<br/>
débogueurs, les antivirus ou encore les<br/>
transpileurs sont autant de programmes dont<br/>
l'entrée est elle-même un programme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un compilateur qui lit un fichier .c et produit un fichier exécutable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour le compilateur, le fichier<br/>
.c est une donnée d'entrée comme une autre.<br/>
Sa sortie est elle-même un programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme qui calcule un déterminant de matrice</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la donnée traitée est une matrice<br/>
de nombres, pas un programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme qui affiche « Bonjour »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun programme n'est manipulé comme<br/>
donnée dans cet exemple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme qui calcule la somme de deux nombres saisis par l'utilisateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ici, les données sont des nombres,<br/>
pas un programme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q03 : Fonction calculable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie qu'une fonction f est <strong>calculable</strong><br/>
au sens informatique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La calculabilité capture l'idée de<br/>
« ce qu'on peut résoudre par algorithme ». Elle<br/>
ne dit rien sur la rapidité (cette question relève<br/>
de la complexité) ni sur la facilité d'écriture<br/>
(qui dépend du langage et du programmeur).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction est continue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la continuité est une notion<br/>
mathématique sans rapport avec la<br/>
calculabilité informatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction s'exécute en moins d'une seconde</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la calculabilité n'impose aucune<br/>
contrainte de temps. Seule l'existence d'un<br/>
algorithme fini est requise.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction renvoie toujours un entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune contrainte sur le type de<br/>
sortie. Une fonction calculable peut renvoyer<br/>
des chaînes, des listes, des booléens, etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il existe un algorithme qui, pour toute entrée valide, calcule f en un nombre fini d'étapes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la calculabilité dit qu'on<br/>
dispose d'un procédé algorithmique fini pour<br/>
obtenir le résultat. Le temps d'exécution<br/>
peut être très long, mais doit rester fini.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q04 : Exemple de fonction calculable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel des éléments suivants définit une fonction<br/>
<strong>calculable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les fonctions arithmétiques usuelles, les<br/>
fonctions sur les chaînes, le tri d'une liste,<br/>
l'évaluation d'une expression : toutes sont<br/>
calculables. L'indécidabilité concerne au contraire<br/>
les questions portant sur le <strong>comportement</strong> des<br/>
programmes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui prend en entrée un programme et renvoie « oui » s'il s'arrête, « non » sinon</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément le problème de<br/>
l'arrêt, qui est <strong>indécidable</strong>, donc non<br/>
calculable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui à un texte associe « oui » s'il représente un programme correct</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : si « correct » signifie « sans bug<br/>
logique », ce problème est lié à<br/>
l'indécidabilité de l'arrêt et n'est pas<br/>
calculable en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction qui à un programme associe le nombre exact d'instructions qu'il exécutera dans tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour certaines entrées, le programme<br/>
peut ne jamais s'arrêter ; on ne peut donc pas<br/>
toujours répondre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La fonction qui à un entier n associe son carré n²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un algorithme trivial<br/>
(return n * n) calcule cette fonction en<br/>
temps fini pour tout entier n.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q05 : Indépendance du langage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une fonction est calculable. Que peut-on en<br/>
déduire sur les langages de programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tous les langages de programmation usuels sont<br/>
« équivalents » en pouvoir calculatoire : ce qu'on<br/>
peut programmer dans l'un, on peut le programmer<br/>
dans les autres. Les différences se situent au<br/>
niveau de la lisibilité, de la performance ou de<br/>
l'écosystème, pas de la calculabilité.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le résultat de la fonction varie selon le langage utilisé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction (au sens mathématique) est<br/>
la même quel que soit le langage qui<br/>
l'implémente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle ne peut être écrite qu'en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'a aucune capacité<br/>
algorithmique particulière. Les autres<br/>
langages universels font tout aussi bien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle peut être implémentée dans n'importe quel langage de programmation universel (Python, C, Java, OCaml...)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la calculabilité ne dépend<br/>
pas du langage utilisé. Tout langage assez<br/>
expressif (autorisant boucles ou récursivité,<br/>
conditions, mémoire) peut implémenter<br/>
n'importe quelle fonction calculable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle nécessite obligatoirement un langage récursif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut tout calculer avec des<br/>
boucles itératives, sans récursion explicite.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q06 : Problème décidable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>problème décidable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Exemples décidables : « cet entier est-il pair ? »,<br/>
« ce mot est-il dans le dictionnaire ? », « ce<br/>
nombre est-il premier ? ». Pour chacun, on dispose<br/>
d'un algorithme qui répond toujours en temps fini.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un problème pour lequel il existe un algorithme qui répond toujours « oui » ou « non » en un nombre fini d'étapes, pour toute instance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un problème décidable est un<br/>
problème de décision (« oui »/« non ») dont<br/>
la réponse est <strong>calculable</strong> pour toutes les<br/>
entrées. L'algorithme doit toujours<br/>
terminer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème dont la réponse est connue par avance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la décidabilité concerne l'existence<br/>
d'un algorithme général, pas la connaissance<br/>
a priori.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème qui n'a pas de solution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est exactement l'inverse. Un<br/>
problème décidable a une solution<br/>
algorithmique systématique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème facile à résoudre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la décidabilité ne dit rien sur la<br/>
difficulté. Beaucoup de problèmes décidables<br/>
sont très coûteux à résoudre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q07 : Exemple de problème décidable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel de ces problèmes est clairement <strong>décidable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Beaucoup de propriétés <strong>syntaxiques</strong> sur les<br/>
programmes (longueur du code, présence d'un<br/>
mot-clé...) sont décidables, mais les propriétés<br/>
<strong>sémantiques</strong> (comportement, terminaison,<br/>
résultat) sont rarement décidables.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Étant donné un programme, dire s'il contient un bug logique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce problème est indécidable au sens<br/>
général (lié au problème de l'arrêt).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Étant donné un programme Python, dire s'il s'arrêtera sur l'entrée 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une instance du problème de<br/>
l'arrêt, qui est indécidable en général.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Étant donné un entier n, déterminer s'il est divisible par 7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un simple test n % 7 == 0<br/>
répond toujours en temps fini, pour tout<br/>
entier n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Étant donné deux programmes, dire s'ils calculent la même fonction sur toute entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est aussi un problème indécidable<br/>
en général.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q08 : Problème indécidable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>problème indécidable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un problème indécidable est une <strong>limite<br/>
théorique</strong> de l'informatique : il existe des<br/>
questions qu'aucun ordinateur, présent ou futur,<br/>
ne pourra résoudre dans le cas général.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème qui demande beaucoup de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la consommation mémoire n'a aucun<br/>
rapport avec la décidabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème dont la réponse change selon la machine utilisée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la décidabilité est indépendante de<br/>
la machine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un problème difficile, qu'on n'a pas encore résolu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « indécidable » est un résultat<br/>
mathématique d'<strong>inexistence</strong>, pas d'attente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un problème de décision pour lequel il n'existe aucun algorithme qui, pour toute entrée, donne une réponse correcte en temps fini</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il ne s'agit pas de dire<br/>
qu'on n'a pas trouvé d'algorithme : on a<br/>
démontré qu'il n'en existe pas, et n'en<br/>
existera jamais.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q09 : Énoncé du problème de l'arrêt</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment énonce-t-on le <strong>problème de l'arrêt</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'enjeu : disposer d'un programme universel<br/>
arrete?(P, e) qui, donné un programme P et<br/>
une entrée e, répondrait toujours « oui » si<br/>
P termine sur e, « non » sinon. Ce programme<br/>
n'existe pas.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comment savoir combien de temps un programme va s'exécuter ?</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une question de complexité,<br/>
pas de calculabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comment arrêter un programme qui boucle sans fin ?</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la question pratique « arrêter un<br/>
programme » (avec Ctrl-C par exemple) n'a<br/>
rien à voir avec le problème théorique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À quel moment faut-il interrompre une compilation ?</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la calculabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Existe-t-il un algorithme qui, pour tout couple (programme, entrée), répond « oui » si le programme s'arrête sur cette entrée, « non » s'il boucle indéfiniment ?</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'énoncé classique. La<br/>
réponse, démontrée par Turing en 1936, est<br/>
<strong>non</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q10 : Statut du problème de l'arrêt</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le problème de l'arrêt est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Démontrer l'indécidabilité de l'arrêt est l'un<br/>
des grands résultats fondateurs de l'informatique<br/>
théorique. Il pose une limite <strong>absolue</strong> à ce<br/>
que les ordinateurs peuvent décider.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Décidable, mais coûteux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il est mathématiquement démontré<br/>
qu'aucun algorithme ne peut le résoudre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : aucun algorithme ne peut<br/>
décider, dans le cas général, si un<br/>
programme arbitraire s'arrête sur une entrée<br/>
donnée. C'est un théorème dû à Alan Turing<br/>
(1936).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Décidable, et résolu par les antivirus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les antivirus utilisent des<br/>
heuristiques (signatures, comportements<br/>
suspects), pas une décision exacte. Une<br/>
détection parfaite reviendrait à résoudre<br/>
l'arrêt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Inconnu de la communauté scientifique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le résultat est connu et démontré<br/>
depuis 1936.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q11 : Idée de la démonstration</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'argument classique de Turing pour montrer que<br/>
l'arrêt est indécidable consiste à supposer qu'on<br/>
possède un tel décideur, puis à :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'idée force est l'<strong>auto-référence</strong> : on<br/>
construit un programme qui interroge le décideur<br/>
à propos de lui-même puis fait le contraire de la<br/>
prédiction. Le décideur ne peut donc pas exister.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Mesurer le temps d'exécution de tous les programmes possibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la démonstration<br/>
d'indécidabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Programmer le décideur en plusieurs langages et comparer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la démonstration ne dépend pas du<br/>
langage utilisé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Construire un programme qui « se contredit » lui-même en utilisant le décideur sur sa propre entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à partir du décideur supposé<br/>
arrete?, on fabrique un programme D qui<br/>
fait l'inverse de ce que prédit arrete? sur<br/>
son propre code. On obtient alors une<br/>
contradiction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réécrire les programmes en machine de Turing</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la machine de Turing est un cadre<br/>
formel possible, mais ce n'est pas l'idée<br/>
centrale de la preuve.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q12 : Conséquence pratique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle conséquence pratique l'indécidabilité du<br/>
problème de l'arrêt a-t-elle sur le développement<br/>
logiciel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'indécidabilité de l'arrêt entraîne celle de<br/>
nombreuses autres propriétés : équivalence de<br/>
deux programmes, absence de bugs, terminaison sur<br/>
toutes les entrées, etc. Les outils d'analyse<br/>
statique sont donc nécessairement <strong>incomplets</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plus aucun nouveau bug ne peut être trouvé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, on continue à<br/>
trouver des bugs régulièrement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On ne peut pas écrire un programme qui détecte toutes les boucles infinies dans n'importe quel autre programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : aucune analyse statique ne<br/>
pourra repérer toutes les boucles infinies<br/>
ou tous les bugs de terminaison. C'est<br/>
pourquoi les tests, les revues de code et les<br/>
assertions restent indispensables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les ordinateurs ne peuvent pas exécuter de programmes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport. L'indécidabilité ne<br/>
concerne que la <strong>prédiction</strong> du<br/>
comportement des programmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les langages modernes ne contiennent plus jamais de boucles infinies</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut tout à fait écrire des<br/>
boucles infinies dans tous les langages,<br/>
volontairement ou non.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q13 : Calculable ou décidable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre <strong>calculable</strong> et<br/>
<strong>décidable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tout problème décidable correspond à une fonction<br/>
indicatrice calculable. La réciproque est vraie :<br/>
pour qu'un problème de décision soit décidable,<br/>
il faut et il suffit que sa fonction indicatrice<br/>
soit calculable.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>« Calculable » signifie « facile », « décidable » signifie « difficile »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la difficulté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>« Calculable » concerne les nombres, « décidable » concerne les chaînes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune contrainte sur le type des<br/>
données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>« Calculable » s'applique aux fonctions, « décidable » aux problèmes de décision (à réponse oui/non)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un problème de décision est<br/>
décidable lorsque la fonction associée<br/>
(« oui » ou « non ») est calculable et que<br/>
l'algorithme termine toujours. Les deux<br/>
notions sont étroitement liées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence, ce sont des synonymes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « calculable » est plus général ;<br/>
« décidable » est réservé aux problèmes à<br/>
réponse binaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q14 : Cas particuliers</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour <strong>certains</strong> programmes, on peut savoir<br/>
facilement s'ils s'arrêtent. Ce qui est<br/>
indécidable, c'est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'indécidabilité concerne l'existence d'un<br/>
algorithme <strong>général</strong>. Cas par cas, beaucoup<br/>
de programmes peuvent être analysés, parfois<br/>
automatiquement. Mais il existera toujours des<br/>
cas où aucun algorithme général ne peut conclure.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>De le faire pour tous les programmes possibles, avec un seul algorithme général</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un humain peut analyser un<br/>
petit programme et raisonner sur sa<br/>
terminaison. Ce qui est impossible, c'est de<br/>
construire un algorithme qui réussisse pour<br/>
<strong>n'importe quel</strong> programme et n'importe<br/>
quelle entrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>De le faire pour les programmes écrits en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la limite ne dépend pas du langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>De le faire en moins d'une heure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la durée<br/>
d'analyse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>De le faire pour les programmes courts</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour les programmes courts, l'analyse<br/>
humaine ou des outils dédiés peuvent souvent<br/>
répondre. C'est le cas général qui est<br/>
indécidable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q15 : Machine universelle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'idée d'<strong>ordinateur universel</strong> repose sur<br/>
laquelle des affirmations suivantes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est cette universalité qui rend possibles les<br/>
ordinateurs polyvalents : un seul appareil<br/>
exécute traitement de texte, jeux, navigateur,<br/>
compilateurs, etc., simplement en chargeant des<br/>
programmes différents.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un même dispositif peut exécuter n'importe quel programme, à condition de lui fournir le code de ce programme en entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est exactement le concept<br/>
de machine universelle de Turing (1936) et,<br/>
en pratique, de tout ordinateur moderne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les programmes peuvent s'écrire sans boucles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans rapport avec l'universalité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les ordinateurs ont le même processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe de nombreux processeurs<br/>
différents (x86, ARM, RISC-V…). L'universalité<br/>
est une propriété logique, pas matérielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout calcul peut s'effectuer instantanément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la vitesse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q16 : Interpréteur écrit dans son langage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On peut écrire un interpréteur Python en Python<br/>
(par exemple via la fonction exec). Que<br/>
montre cet exemple ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette propriété, dite « réflexivité », existe dans<br/>
la plupart des langages modernes (eval en<br/>
JavaScript, en Lisp, etc.). Elle est cohérente<br/>
avec l'idée que les programmes sont des données.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que Python est plus rapide que les autres langages</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que exec rend Python incalculable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : exec ne change rien aux capacités<br/>
de calcul du langage ; il en illustre simplement<br/>
l'aspect réflexif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que exec est une fonction obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : exec est une fonction standard de<br/>
Python, à utiliser avec précaution mais<br/>
toujours valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Qu'un programme peut prendre un autre programme comme donnée et l'exécuter, illustrant la dualité programme/donnée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction exec traite le<br/>
texte d'un programme comme une donnée<br/>
d'entrée et l'exécute. C'est l'expression<br/>
concrète de la dualité programme/donnée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q17 : Détection de logiciels malveillants</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi est-il <strong>impossible</strong> d'écrire un<br/>
antivirus parfait qui détecterait tous les<br/>
logiciels malveillants sans aucune erreur ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet exemple est souvent cité pour illustrer les<br/>
<strong>conséquences pratiques</strong> de l'indécidabilité.<br/>
Les antivirus bons en pratique combinent<br/>
détection par signature, analyse comportementale<br/>
et apprentissage statistique, toujours sans<br/>
garantie absolue.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les antivirus sont mal programmés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la limite est théorique, elle ne<br/>
dépend pas de la qualité de l'implémentation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que reconnaître précisément le comportement d'un programme arbitraire est lié au problème de l'arrêt, qui est indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : décider si un programme aura<br/>
un certain comportement (lire un fichier<br/>
sensible, par exemple) est en général<br/>
indécidable. Les antivirus s'appuient donc<br/>
sur des <strong>heuristiques</strong> (signatures,<br/>
comportements suspects), jamais sur une<br/>
décision exacte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les antivirus sont trop lents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la lenteur n'est pas la cause de<br/>
l'imperfection. Même avec un temps infini,<br/>
aucun algorithme ne peut décider tous les<br/>
cas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les antivirus ne peuvent pas analyser un fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils peuvent l'analyser, mais ne<br/>
peuvent pas en déduire avec certitude tout<br/>
son comportement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q18 : Identifier des problèmes décidables</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les problèmes suivants, lesquels sont<br/>
<strong>décidables</strong> ? Sélectionnez la proposition<br/>
correcte.</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La frontière passe entre les questions<br/>
<strong>syntaxiques</strong> ou portant sur des données<br/>
finies (souvent décidables) et les questions<br/>
portant sur le <strong>comportement</strong> d'un programme<br/>
(souvent indécidables).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les trois sont décidables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le problème de l'arrêt est<br/>
indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>« Cet entier est-il premier ? » et « cette chaîne contient-elle un point d'interrogation ? » sont décidables ; « ce programme s'arrête-t-il ? » ne l'est pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux premières questions<br/>
se résolvent par un algorithme simple et<br/>
terminant ; la dernière est l'archétype du<br/>
problème indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun de ces problèmes n'est décidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la primalité et la recherche d'un<br/>
caractère sont décidables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les problèmes énoncés en français sont décidables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le langage de l'énoncé n'a aucun<br/>
rapport avec la décidabilité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q19 : Programme à terminaison non triviale</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Considérons le programme suivant qui prend en<br/>
entrée un entier n &gt; 0 :</p>
<p>`<code>python<br/>
while n != 1:<br/>
    if n % 2 == 0:<br/>
        n = n // 2<br/>
    else:<br/>
        n = 3 * n + 1<br/>
</code>`</p>
<p>Que peut-on dire de sa <strong>terminaison</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet exemple montre que prédire la terminaison<br/>
d'un programme, même très court, peut être<br/>
extrêmement difficile. Ce n'est pas surprenant :<br/>
le problème général de l'arrêt est indécidable.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Personne ne sait, à ce jour, démontrer qu'il termine pour tout n positif (conjecture de Syracuse)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la suite de Syracuse<br/>
(ou « 3n+1 »). Pour tous les entiers<br/>
testés, le programme termine, mais une<br/>
démonstration générale reste un problème<br/>
mathématique ouvert.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il termine en au plus 100 étapes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour certains n assez petits, le<br/>
nombre d'étapes peut dépasser plusieurs<br/>
centaines.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il termine si et seulement si n est pair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il termine aussi pour beaucoup<br/>
d'entiers impairs (par exemple n = 7).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On a démontré qu'il ne termine jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour tous les entiers testés<br/>
numériquement, il termine.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q20 : Une fonction non calculable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi la fonction « f(P) vaut 1 si le<br/>
programme P s'arrête sur l'entrée vide, 0<br/>
sinon » n'est-elle <strong>pas calculable</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toutes les fonctions « qui s'amusent à prédire<br/>
le comportement » d'un programme arbitraire<br/>
tendent à être non calculables. C'est l'écho<br/>
direct du théorème de Turing.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les programmes ne sont pas tous écrits en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la calculabilité est indépendante<br/>
du langage de programmation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'on ne sait pas représenter un programme comme une donnée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on sait parfaitement représenter un<br/>
programme comme une donnée (texte, octets...).<br/>
C'est précisément le concept clé de la<br/>
calculabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la fonction renvoie un entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec le type de<br/>
sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que la calculer reviendrait à décider le problème de l'arrêt, ce qui est impossible en général</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tout algorithme calculant<br/>
f serait un décideur du problème de<br/>
l'arrêt. Comme ce dernier est indécidable,<br/>
f n'est pas calculable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q21 : Histoire : Alan Turing</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle contribution majeure Alan Turing a-t-il<br/>
apportée en 1936 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Turing (1912-1954) est l'un des fondateurs<br/>
de l'informatique théorique. Son article de 1936<br/>
précède même l'apparition des premiers<br/>
ordinateurs physiques.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il a posé les fondements de la calculabilité moderne et démontré l'indécidabilité du problème de l'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : son article « On Computable<br/>
Numbers » introduit la machine universelle<br/>
(notion d'ordinateur programmable) et<br/>
démontre l'indécidabilité de l'arrêt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a inventé Internet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Internet est apparu dans les années<br/>
1960-70 (ARPANET), bien après Turing.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a écrit le premier compilateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le premier compilateur est<br/>
généralement attribué à Grace Hopper (1952).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a inventé le langage Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python a été créé par Guido van<br/>
Rossum en 1991, des décennies après<br/>
Turing.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q22 : Calculabilité et complexité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un problème <strong>décidable</strong> mais qui demande un<br/>
temps astronomique en pratique :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Décidabilité et complexité sont deux questions<br/>
distinctes : la décidabilité demande s'il existe<br/>
un algorithme ; la complexité demande à quel<br/>
coût (temps, mémoire). Un problème peut être<br/>
« décidable mais inutilisable en pratique ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Disparaît automatiquement après quelques années</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'indécidabilité est un<br/>
résultat mathématique<br/>
intemporel, prouvé une fois<br/>
pour toutes. Elle ne dépend<br/>
ni du temps qui passe, ni<br/>
des progrès matériels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Reste décidable. La calculabilité ne dit rien sur le temps d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un problème peut être<br/>
décidable et avoir une complexité telle que<br/>
l'algorithme reste inutilisable en pratique.<br/>
La distinction calculable / décidable est<br/>
séparée de la question de l'efficacité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'est plus un problème</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un problème indécidable<br/>
reste un problème, même<br/>
si on en connaît une partie<br/>
du domaine. L'indécidabilité<br/>
est un résultat mathématique<br/>
permanent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Devient indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indécidabilité signifie qu'aucun<br/>
algorithme <strong>n'existe</strong>, pas qu'il existe<br/>
mais soit lent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q23 : Programme qui lit son propre code</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi est-il important, en théorie de la<br/>
calculabilité, qu'un programme <strong>puisse lire ou<br/>
manipuler son propre code source</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'auto-référence est un thème récurrent en<br/>
mathématiques (paradoxe du menteur, théorème de<br/>
Gödel) et en informatique théorique. Elle est<br/>
au cœur des grandes limitations de la<br/>
calculabilité.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que c'est l'auto-référence qui rend possible l'argument d'indécidabilité du problème de l'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'argument de Turing<br/>
construit un programme qui interroge le<br/>
décideur d'arrêt à propos de <strong>lui-même</strong>.<br/>
Sans auto-référence, le raisonnement par<br/>
l'absurde ne fonctionnerait pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que cela permet d'écrire des programmes plus rapides</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport direct avec la<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que cela rend les programmes immortels</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La durée de vie d'un<br/>
programme dépend de<br/>
l'environnement d'exécution<br/>
et de la maintenance, pas<br/>
de sa capacité à manipuler<br/>
son propre code source.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que cela évite les bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Manipuler son propre code<br/>
n'évite pas les bugs : c'est<br/>
un mécanisme théorique<br/>
d'auto-référence, sans lien<br/>
avec la qualité logicielle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q24 : Langages équivalents</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Deux langages de programmation A et B sont<br/>
dits <strong>équivalents en calculabilité</strong> si :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'équivalence en calculabilité justifie<br/>
l'expression « tout langage de programmation<br/>
universel ». Quel que soit le langage choisi,<br/>
les questions calculables et décidables sont<br/>
les mêmes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ils s'exécutent à la même vitesse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la vitesse est une question de<br/>
complexité, pas de calculabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ils sont compilés par le même compilateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le compilateur ne change pas la<br/>
puissance du langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Toute fonction calculable dans A l'est aussi dans B, et réciproquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tous les langages usuels<br/>
(Python, C, Java, OCaml, Haskell…) sont<br/>
équivalents en ce sens. C'est précisément<br/>
ce qui justifie qu'on parle de<br/>
« calculabilité » sans préciser le langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ils ont la même syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe peut être très<br/>
différente entre deux langages équivalents.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q25 : Synthèse : Limites de la calculabilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Laquelle des affirmations suivantes résume le<br/>
mieux l'apport de la calculabilité à<br/>
l'informatique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La calculabilité est une boussole : elle dit ce<br/>
qui est faisable algorithmiquement, ce qui ne<br/>
l'est pas, et invite donc à choisir des<br/>
stratégies pragmatiques (heuristiques, tests,<br/>
preuves partielles) lorsqu'on touche aux<br/>
limites.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La calculabilité dépend du processeur utilisé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle est indépendante du matériel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La calculabilité ne sert à rien dans la pratique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle éclaire la conception des<br/>
outils d'analyse statique, des antivirus,<br/>
des compilateurs, etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il existe des limites théoriques, démontrées dès 1936, à ce qu'un ordinateur peut décider, indépendamment de sa puissance ou du langage utilisé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la calculabilité fixe des<br/>
frontières que la technologie ne peut<br/>
franchir. Elle invite à concevoir des<br/>
analyses <strong>incomplètes mais utiles</strong>, et à<br/>
combiner outils automatiques, tests et<br/>
revues humaines.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout problème pourra finir par être résolu avec des ordinateurs assez puissants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément ce que l'indé-<br/>
cidabilité réfute. Aucune puissance de<br/>
calcul ne suffit à résoudre un problème<br/>
indécidable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q26 : Frontière calculable / décidable / faisable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Considérons les trois questions suivantes :<br/>
(a) « Cet entier est-il pair ? », (b) « Existe-t-il<br/>
un sous-ensemble d'une liste de cent entiers dont<br/>
la somme vaut zéro ? », (c) « Ce programme<br/>
arbitraire s'arrête-t-il sur une entrée donnée ? ».<br/>
Comment se classent-elles ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois niveaux à distinguer : <strong>décidable et<br/>
faisable</strong> (parité, primalité, tri) ; <strong>décidable<br/>
mais coûteux</strong> (sac à dos, voyageur de<br/>
commerce) ; <strong>indécidable</strong> (arrêt, équivalence<br/>
sémantique de programmes). La calculabilité<br/>
tranche le binaire « algorithme existe ou<br/>
pas » ; la complexité affine selon le coût.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les trois sont indécidables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (a) et (b) sont parfaitement<br/>
décidables. Pour (b), un algorithme de force<br/>
brute énumère tous les sous-ensembles, ce qui<br/>
termine toujours en temps fini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les trois sont décidables et faciles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (c) est indécidable, (b) n'a pas de<br/>
solution efficace connue (NP-complet). Seule<br/>
(a) est à la fois décidable et facile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(a) facile, (b) indécidable, (c) décidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est exactement l'inverse pour (b)<br/>
et (c). (b) est décidable mais coûteux ; (c)<br/>
est l'archétype de l'indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>(a) décidable et facile, (b) décidable mais<br/>
potentiellement coûteux à résoudre, (c)<br/>
indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : (a) est résolu en O(1) avec<br/>
un test de parité. (b) est le problème de la<br/>
somme partielle, NP-complet : décidable<br/>
(existence d'un algorithme qui termine<br/>
toujours), mais sans algorithme polynomial<br/>
connu, donc lourd en pratique pour de grandes<br/>
listes. (c) est l'arrêt, démontré indécidable.<br/>
Cette graduation montre que « décidable » ne<br/>
signifie pas « facile ».</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q27 : L'argument d'auto-référence en pratique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Supposons qu'on dispose d'un programme arrete?(P, e)<br/>
qui répondrait toujours True ou False. Pour<br/>
construire la contradiction, on définit :<br/>
`<code><br/>
def D(P):<br/>
    if arrete?(P, P):<br/>
        while True: pass<br/>
    return<br/>
</code><br/>
Que se passe-t-il quand on appelle D(D)` ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'argument est un parent direct du paradoxe du<br/>
menteur (« cette phrase est fausse ») et du<br/>
théorème d'incomplétude de Gödel. L'auto-<br/>
référence permet de fabriquer un objet<br/>
contradictoire à partir de tout candidat<br/>
« décideur universel », rendant son existence<br/>
impossible.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Si arrete?(D, D) renvoie True, alors D(D)<br/>
devrait s'arrêter selon la prédiction, mais le<br/>
code entre dans la boucle infinie : contradiction.<br/>
Si arrete?(D, D) renvoie False, alors<br/>
D(D) ne devrait pas s'arrêter, mais le code<br/>
renvoie immédiatement : contradiction. La<br/>
double contradiction prouve que arrete? ne<br/>
peut exister</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le cœur de la preuve de<br/>
Turing. Quel que soit ce que arrete? répond<br/>
sur (D, D), le programme D fait<br/>
précisément l'inverse de ce qui est prédit.<br/>
Aucune valeur de retour ne peut donc être<br/>
correcte. La supposition initiale (existence<br/>
d'arrete?) est donc fausse. C'est un<br/>
raisonnement par l'absurde fondé sur l'auto-<br/>
référence (D reçoit son propre code).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme arrete? retournerait simplement<br/>
une erreur, ce qui résoudrait la situation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on suppose au départ que arrete?<br/>
répond <strong>toujours</strong> par True ou False,<br/>
jamais par une erreur. C'est précisément ce<br/>
que la preuve montre impossible : un tel<br/>
oracle parfait ne peut exister.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme D(D) ne pose aucun problème :<br/>
arrete? répond simplement par défaut</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément le piège. La<br/>
contradiction ne disparaît pas en choisissant<br/>
une réponse par défaut. Quelle que soit la<br/>
réponse de arrete?(D, D), on construit un<br/>
programme qui fait l'inverse, donc la<br/>
prédiction est fausse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La contradiction n'apparaît que si Python est<br/>
compilé, pas interprété</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le langage ou son mode d'exécution<br/>
n'a aucun rôle. La preuve est mathématique et<br/>
se transpose à n'importe quel langage de<br/>
programmation universel.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
