<?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 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="100" format="html">
    <text><![CDATA[<p>Un fichier d'octets, lu par d'autres programmes</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>
  <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 programme</strong>, pas seulement chargé en mémoire.</p>]]></text>
    </feedback>
  </answer>
  <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>
</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 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="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 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>
  <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 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>
</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="100" format="html">
    <text><![CDATA[<p>Un algorithme calcule f en temps fini</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>
  <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 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 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>
</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 à 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>
  <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>
</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>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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle s'implémente dans tout langage universel</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 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="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>
</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="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>
  <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="100" format="html">
    <text><![CDATA[<p>Un algorithme répond oui/non en temps fini</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>
</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é 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>
  <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é 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="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>
</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 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="100" format="html">
    <text><![CDATA[<p>Aucun algorithme ne peut répondre pour toute entrée</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>
  <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>
</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>À 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>Un algorithme peut-il prédire l'arrêt de tout programme ?</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Comment arrêter un programme qui boucle sans fin du tout ?</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>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>
</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="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="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>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>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>
  <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 via le décideur</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>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>
</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 nombreuses autres propriétés : équivalence de deux programmes, absence de bugs, terminaison sur toutes les entrées, etc. Les outils d'analyse de code 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="100" format="html">
    <text><![CDATA[<p>On ne peut pas détecter toutes les boucles infinies</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : aucun programme ne pourra repérer toutes les boucles infinies ou tous les bugs de terminaison. C'est pourquoi les tests, les revues de code et les assertions restent indispensables.</p>]]></text>
    </feedback>
  </answer>
  <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="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 pour les fonctions, décidable pour les problèmes 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="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 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le faire pour tout programme, en 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 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>
</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 seul appareil exécute tout programme fourni 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 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>
  <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>
</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 en Python un interpréteur de Python, c'est-à-dire un programme qui lit le texte d'un autre programme Python et l'exécute. Que montre cet exemple ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Interpréteurs, compilateurs et systèmes d'exploitation manipulent tous des programmes comme des données. C'est aussi ce qui permet de télécharger un logiciel, de le stocker, puis de l'exécuter.</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 le problème de l'arrêt devient décidable pour Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'interpréteur exécute le programme qu'il reçoit, il ne prédit pas s'il s'arrêtera. Le problème de l'arrêt reste indécidable, quel que soit le langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que Python calcule plus de fonctions que les autres langages</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les langages de programmation usuels calculent les mêmes fonctions. Écrire un interpréteur ne change rien aux capacités de calcul du langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un programme peut exécuter un autre programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'interpréteur traite le texte d'un programme comme une donnée d'entrée et l'exécute. C'est l'expression concrète de la dualité programme/donnée.</p>]]></text>
    </feedback>
  </answer>
  <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>
</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>Cela rejoint le problème de l'arrêt, 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 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>
  <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>
</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>On considère trois problèmes : (1) déterminer si un<br/>
entier est premier ; (2) chercher si un caractère<br/>
apparaît dans une chaîne ; (3) déterminer si un programme<br/>
quelconque finit par s'arrêter. Lesquels sont<br/>
<strong>décidables</strong> ? Sélectionnez la proposition 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>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>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="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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les deux premières oui, le problème de l'arrêt non</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>
</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>Nour l'exécute pour n = 27 : le programme s'arrête après 111 passages dans la boucle. Laquelle des affirmations suivantes cet unique essai permet-il de <strong>réfuter</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un test peut réfuter une affirmation générale en exhibant un contre-exemple, mais il ne peut pas prouver qu'un programme s'arrête pour toutes les entrées. Même pour un programme de cinq lignes, prouver la terminaison peut être très difficile, et aucune méthode automatique ne s'applique à tous les programmes, puisque le problème 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>Le programme ne s'arrête pour aucun entier impair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 27 est impair et le programme s'arrête pour lui. Un seul contre-exemple suffit à réfuter une affirmation qui porte sur tous les entiers impairs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme s'arrête pour tout entier n &gt; 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'essai est compatible avec cette affirmation, mais ne la démontre pas. Aucun nombre fini d'essais réussis ne prouve qu'un programme s'arrête pour une infinité d'entrées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme s'arrête pour tout entier pair</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'essai porte sur 27, un entier impair, et ne dit rien des entiers pairs. Cette affirmation n'est ni confirmée ni réfutée par cet essai.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il existe un entier n &gt; 0 pour lequel le programme ne s'arrête pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'essai montre que 27 n'est pas un tel entier, mais un autre entier pourrait l'être. Pour réfuter cette affirmation, il faudrait vérifier tous les entiers, ce qu'aucun test ne permet.</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 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="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 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="100" format="html">
    <text><![CDATA[<p>La calculer reviendrait à décider l'arrêt, impossible</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="0" format="html">
    <text><![CDATA[<p>Il a personnellement inventé tout le réseau 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Fonder la calculabilité, prouver l'arrêt indécidable</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>
</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>N'est plus un problème</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un problème difficile reste<br/>
un problème. Sa décidabilité et sa<br/>
complexité sont des résultats<br/>
mathématiques permanents, qu'on sache<br/>
ou non le résoudre rapidement.</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Disparaît complètement automatiquement après quelques années</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la décidabilité et la<br/>
complexité d'un problème sont des<br/>
propriétés mathématiques. Elles ne<br/>
disparaissent ni avec le temps qui<br/>
passe, ni avec les progrès matériels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il reste décidable, le temps n'entre pas en compte</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>
</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="100" format="html">
    <text><![CDATA[<p>Les mêmes fonctions y sont calculables</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 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="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 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="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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il existe des limites théoriques (1936) à ce qu'un ordinateur décide</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>
</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 faisable</strong> (parité, tri) ; <strong>décidable mais coûteux</strong> (essayer tous les sous-ensembles d'une grande liste) ; <strong>indécidable</strong> (arrêt). La calculabilité dit si un algorithme existe ; le coût d'exécution dit ensuite s'il est utilisable 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>Les trois sont décidables et faciles à résoudre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (c) est indécidable, et (b), bien que décidable, demande par la méthode directe d'examiner jusqu'à 2¹⁰⁰ sous-ensembles. Seule (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) facile, (b) décidable mais coûteux, (c) indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : (a) se résout par un simple test de parité. (b) est décidable : un algorithme qui énumère les 2¹⁰⁰ sous-ensembles termine toujours, mais leur nombre rend ce calcul irréalisable en pratique. (c) est l'arrêt, démontré indécidable. Cette graduation montre que « décidable » ne signifie pas « facile ».</p>]]></text>
    </feedback>
  </answer>
  <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>
</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>python<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="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>
  <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="100" format="html">
    <text><![CDATA[<p>Quelle que soit la réponse de arrete?(D, D),<br/>
le comportement réel de D(D) la contredit :<br/>
arrete? ne peut donc pas exister</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le cœur de la preuve de<br/>
Turing. Si arrete?(D, D) renvoie True,<br/>
D(D) entre dans la boucle infinie au lieu de<br/>
s'arrêter ; s'il renvoie False, D(D)<br/>
renvoie immédiatement au lieu de boucler. Dans<br/>
les deux cas, la prédiction est démentie :<br/>
aucune valeur de retour ne peut être correcte,<br/>
donc la supposition initiale (existence<br/>
d'arrete?) est fausse. C'est un raisonnement<br/>
par l'absurde fondé sur l'auto-référence (D<br/>
reçoit son propre code).</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>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q28 : L'arrêt d'un programme donné</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le problème de l'arrêt est indécidable. Peut-on malgré tout savoir<br/>
si ce programme s'arrête ?<br/>
`<code>python<br/>
i = 0<br/>
while i &lt; 10:<br/>
    i = i + 1<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'indécidabilité est une impossibilité générale : pour un programme<br/>
particulier, un raisonnement peut très bien établir l'arrê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>Non, aucun programme ne peut être jugé, le problème étant indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indécidabilité porte sur l'existence d'une méthode<br/>
générale, pas sur chaque programme pris isolément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, car la boucle while interdit toute conclusion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une boucle while dont le compteur progresse vers la<br/>
borne se termine, et on peut le démontrer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement en l'exécutant, sans pouvoir le prouver</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un raisonnement sur la variable i prouve l'arrêt<br/>
sans exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, en dix tours ; l'indécidabilité vise le cas général</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : i augmente de un à chaque tour et atteint<br/>
10. L'indécidabilité affirme qu'aucun procédé unique ne<br/>
tranche pour tous les programmes, pas qu'aucun programme ne<br/>
peut être jugé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q29 : Exécuter pour savoir</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour savoir si un programme s'arrête, on l'exécute pendant une<br/>
heure. Au bout de l'heure, il tourne encore. Qu'a-t-on appris ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Simuler un programme permet de confirmer un arrêt, jamais d'établir<br/>
un non-arrêt : c'est une des raisons de l'indécidabilité.</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>Qu'il ne s'arrêtera jamais, une heure étant largement suffisante</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : certains programmes s'arrêtent après des jours ou des<br/>
siècles de calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Qu'il contient une erreur de syntaxe non détectée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une erreur de syntaxe empêche le lancement, elle ne<br/>
fait pas tourner le programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Rien de certain, il peut s'arrêter plus tard ou jamais</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'exécution ne tranche que si le programme<br/>
s'arrête. Tant qu'il tourne, les deux issues restent possibles,<br/>
et aucune durée d'attente ne lève le doute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Qu'il s'arrêtera, tout programme finissant par terminer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : while True: pass ne termine jamais.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q30 : Deux programmes équivalents</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Existe-t-il un algorithme qui, pour deux programmes quelconques,<br/>
décide s'ils renvoient toujours le même résultat pour les mêmes<br/>
entrées ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Beaucoup de questions sur le comportement des programmes se<br/>
ramènent au problème de l'arrêt et héritent de son indécidabilité.</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>Non, sauf si les deux programmes sont écrits dans le même langage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le langage ne change rien, le problème reste<br/>
indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, ce problème est indécidable, comme celui de l'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : s'il existait, on comparerait un programme<br/>
quelconque à un programme qui ne s'arrête jamais, et l'on<br/>
saurait s'il s'arrête sur au moins une entrée, ce qui est<br/>
impossible. L'équivalence de programmes est indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, en les exécutant sur toutes les entrées possibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les entrées sont en nombre infini, l'exécution ne<br/>
finirait jamais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, en comparant les deux codes source ligne à ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux textes différents peuvent calculer la même<br/>
chose, une boucle et une formule par exemple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q31 : S'arrêter sur toutes les entrées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le problème de l'arrêt porte sur un programme et une entrée<br/>
donnée. Le problème « ce programme s'arrête-t-il sur toutes les<br/>
entrées ? » est-il décidable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La technique de réduction transfère l'indécidabilité : si résoudre<br/>
un problème B permettait de résoudre le problème de l'arrêt, B<br/>
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="0" format="html">
    <text><![CDATA[<p>Non, mais il devient décidable pour les entrées entières</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la nature des entrées ne change rien, les entiers<br/>
suffisent à coder n'importe quelle donnée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, il suffit de tester chaque entrée l'une après l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les entrées sont infinies, et une seule exécution qui<br/>
ne finit pas bloque le test.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, car il est plus simple que le problème de l'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il est au moins aussi difficile, puisqu'il permettrait<br/>
de résoudre le problème de l'arrêt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, il est indécidable lui aussi, sans algorithme général</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour un programme p et une entrée x, on<br/>
construit un programme qui ignore son entrée et exécute p<br/>
sur x ; il s'arrête sur toutes les entrées exactement quand<br/>
p s'arrête sur x. Décider l'un déciderait l'autre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q32 : Un langage sans boucle `while`</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un langage sans récursivité, dont les seules boucles sont des<br/>
for parcourant un range fixé avant la boucle, tout programme<br/>
s'arrête. Le problème de l'arrêt y est-il décidable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Décidabilité de l'arrêt et puissance du langage vont en sens<br/>
inverse : garantir la terminaison coûte des fonctions calculables.</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>Non, car les boucles for peuvent aussi être infinies</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un for sur un range fixé fait un nombre de tours<br/>
connu d'avance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, le problème de l'arrêt est indécidable dans tout langage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indécidabilité vaut pour les langages capables de<br/>
tout calculer, ce qui n'est pas le cas ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, et ce langage est aussi puissant que Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : s'il l'était, le problème de l'arrêt y serait<br/>
indécidable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, trivialement, mais ce langage ne peut pas tout calculer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la réponse est toujours « oui ». Le prix à payer<br/>
est que ce langage ne peut pas exprimer toutes les fonctions<br/>
calculables, par exemple une recherche dont on ignore la durée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q33 : Un ordinateur plus puissant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un ordinateur mille fois plus rapide permettrait-il de résoudre<br/>
le problème de l'arrêt ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Calculabilité et vitesse sont deux questions distinctes : la<br/>
première dit ce qui est possible, la seconde en combien de temps.</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>Oui, la vitesse permettant d'explorer tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les cas sont en nombre infini, aucune vitesse finie ne<br/>
les épuise.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, mais un ordinateur quantique le résoudrait</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un ordinateur quantique calcule les mêmes fonctions,<br/>
parfois plus vite ; il ne franchit pas la limite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, la limite est mathématique et non matérielle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la démonstration ne suppose rien sur la vitesse<br/>
ou la mémoire de la machine. Aucun progrès technique ne lève<br/>
une impossibilité logique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, à condition d'y ajouter assez de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoire n'intervient pas davantage dans<br/>
l'impossibilité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q34 : Une propriété du texte d'un programme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le problème « le texte de ce programme contient-il le mot-clé<br/>
while ? » est-il décidable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinguer les propriétés syntaxiques, toujours décidables, des<br/>
propriétés du comportement, 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="100" format="html">
    <text><![CDATA[<p>Oui, un parcours du texte source suffit à répondre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la question porte sur le texte, pas sur le<br/>
comportement. Une lecture du fichier répond en temps fini, pour<br/>
tout programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, sauf si le programme s'arrête sur toute entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'arrêt du programme n'a aucun rapport avec la<br/>
présence d'un mot dans son texte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, toute question sur un programme est indécidable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seules certaines questions sur le comportement le<br/>
sont ; les propriétés du texte se vérifient.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement en exécutant le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : nul besoin d'exécuter, il suffit de lire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q35 : Lister tous les programmes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Peut-on écrire un programme qui énumère, un par un, tous les<br/>
programmes Python possibles ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les programmes forment un ensemble dénombrable : cette remarque<br/>
est au départ de la preuve qu'il existe des fonctions non<br/>
calculables.</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>Oui, mais uniquement ceux dont on sait qu'ils s'arrêtent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'énumération porte sur les textes, sans rien<br/>
décider de leur comportement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, car un programme ne peut pas manipuler un programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un programme est une donnée comme une autre, un<br/>
interpréteur en manipule en permanence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, ce sont des textes finis, énumérables par longueur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un programme est une suite finie de caractères<br/>
pris dans un alphabet fini. En engendrant les textes par<br/>
longueur croissante et en gardant ceux qui sont des programmes<br/>
valides, chacun finit par apparaître.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, car ils sont en nombre infini et ne peuvent être listés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les entiers aussi sont infinis, et on sait les<br/>
énumérer sans jamais finir.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q36 : Un problème à un nombre fini de cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un problème n'a que mille instances possibles. Est-il décidable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La décidabilité ne parle que d'existence : un problème fini est<br/>
toujours décidable, même quand on ignore quel algorithme le<br/>
résout.</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>Non, s'il faut une infinité d'étapes pour chaque cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la table répond en un nombre fini d'étapes, quel que<br/>
soit le cas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, il peut être indécidable comme le problème de l'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indécidabilité exige une infinité d'instances ; avec<br/>
mille cas, la table existe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, seulement si les mille réponses sont connues aujourd'hui</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la décidabilité est l'existence d'un algorithme, pas<br/>
le fait de le connaître.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, une table des mille réponses constitue un algorithme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un algorithme qui cherche l'instance dans la<br/>
table et renvoie la réponse associée termine toujours. Il<br/>
existe, même si personne ne connaît encore son contenu.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Calculabilité et décidabilité — Q37 : Plus de fonctions que de programmes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Les programmes forment un ensemble dénombrable, mais l'ensemble des<br/>
fonctions des entiers vers les entiers ne l'est pas. Qu'en<br/>
déduit-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'argument de dénombrement prouve l'existence de fonctions non<br/>
calculables sans en exhiber une ; le problème de l'arrêt en donne<br/>
un exemple explicite.</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>Rien, deux ensembles infinis ayant toujours la même taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe des infinis de tailles différentes, c'est<br/>
précisément le point.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que chaque programme calcule plusieurs fonctions à la fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un programme calcule une seule fonction ; le<br/>
raisonnement va dans l'autre sens.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que les fonctions non calculables sont en nombre fini</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elles sont au contraire infiniment plus nombreuses que<br/>
les calculables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Qu'il existe des fonctions qu'aucun programme ne calcule</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque programme calcule au plus une fonction.<br/>
Avec moins de programmes que de fonctions, certaines fonctions<br/>
ne sont calculées par aucun programme.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
