{"id":1756,"date":"2024-04-04T14:28:47","date_gmt":"2024-04-04T12:28:47","guid":{"rendered":"https:\/\/actilud.com\/info\/?p=1756"},"modified":"2024-11-28T17:15:12","modified_gmt":"2024-11-28T16:15:12","slug":"la-machine-de-turing-presentation","status":"publish","type":"post","link":"https:\/\/actilud.com\/info\/blog\/la-machine-de-turing-presentation\/","title":{"rendered":"La machine de Turing : pr\u00e9sentation"},"content":{"rendered":"<p>La <em>machine de Turing<\/em> est un mod\u00e8le math\u00e9matique mis au point par le c\u00e9l\u00e8bre math\u00e9maticien Alan Turing en 1936. G\u00e9n\u00e9ralement, on pr\u00e9sente le mod\u00e8le comme un moyen de d\u00e9montrer les capacit\u00e9s d&rsquo;un ordinateur. Ce qu&rsquo;une machine de Turing peut faire, un ordinateur peut &#8211; ou pourra &#8211; le faire. Ce qu&rsquo;une machine de Turing ne peut pas faire, aucun ordinateur ne pourra jamais le r\u00e9aliser.<\/p>\n<p>Cette pr\u00e9sentation est exacte mais restrictive. En fait, la machine de Turing permet de d\u00e9finir ce qui est <em>calculable<\/em>, que ce soit par un ordinateur, un humain&#8230; ou un extra-terrestre, du moins si les lois de l&rsquo;univers sont les m\u00eames partout.<\/p>\n<p>Ainsi, lorsqu&rsquo;un math\u00e9maticien r\u00e9alise une machine de Turing destin\u00e9e \u00e0 accomplir une t\u00e2che, il d\u00e9montre que la t\u00e2che est calculable, et produit donc un th\u00e9or\u00e8me. Celui-ci peut \u00eatre r\u00e9utilis\u00e9 dans une d\u00e9monstration plus vaste.<\/p>\n<h1>Int\u00e9r\u00eat p\u00e9dagogique<\/h1>\n<p>Le fonctionnement d&rsquo;une machine de Turing est tr\u00e8s simple \u00e0 comprendre et son apprentissage ne prend que quelques minutes. Mais les programmes \u00e0 d\u00e9velopper demandent une r\u00e9elle capacit\u00e9 d&rsquo;analyse, d&rsquo;organisation et d&rsquo;anticipation. Les quelques d\u00e9fis que nous proposons sur Actilud en sont des exemples.<\/p>\n<h1>Fonctionnement du mod\u00e8le<\/h1>\n<p>La machine se pr\u00e9sente comme une bande, de taille infinie, d\u00e9coup\u00e9e en cases. Chaque case peut contenir un signe &#8211; une lettre, un chiffre, une image, peu importe. Le nombre de signes possibles est quelconque, mais fini, et constitue la <em>collection.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1911 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1.png\" alt=\"\" width=\"976\" height=\"58\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1.png 1401w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1-300x18.png 300w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1-1024x61.png 1024w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1-768x45.png 768w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande-1-720x43.png 720w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Sur cette bande se prom\u00e8ne une <em>t\u00eate de lecture.<\/em> Celle-ci peut <em>lire <\/em>un signe, <em>le remplacer <\/em>par un autre, et <em>se d\u00e9placer<\/em> d&rsquo;une case vers la droite ou vers la gauche. Elle est contr\u00f4l\u00e9e par un programme. Sa vitesse d&rsquo;ex\u00e9cution est infinie (c&rsquo;est un mod\u00e8le !)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1913 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete.png\" alt=\"\" width=\"1068\" height=\"137\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete.png 1407w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete-300x38.png 300w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete-1024x131.png 1024w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete-768x98.png 768w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_bande_tete-720x92.png 720w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>La machine poss\u00e8de un nombre quelconque, mais fini, d&rsquo;<em>\u00e9tats.<\/em> Par convention, les \u00e9tats sont symbolis\u00e9s par la lettre Q et chaque \u00e9tat poss\u00e8de un nom par d\u00e9faut : q0, q1, q2&#8230; Les \u00e9tats permettent de s\u00e9lectionner les instructions \u00e0 ex\u00e9cuter. Le premier \u00e9tat de la liste est l&rsquo;\u00e9tat par d\u00e9faut, dans lequel la machine va se placer au d\u00e9marrage du traitement.<\/p>\n<p>Chaque <em>instruction <\/em>est une condition suivie par une action, cod\u00e9e de la mani\u00e8re suivante :<\/p>\n<blockquote><p>Si la machine se trouve dans l&rsquo;\u00e9tat q0, et que la t\u00eate lit le signe <em>X<\/em>, y \u00e9crire le signe <em>Y<\/em>, d\u00e9placer la t\u00eate d&rsquo;une case \u00e0 gauche ou \u00e0 droite (ou rester en place), et passer \u00e0 l&rsquo;\u00e9tat q1.<\/p><\/blockquote>\n<p>Une instruction est <em>ex\u00e9cut\u00e9e <\/em>lorsque les conditions sont remplies : l&rsquo;\u00e9tat et le signe correspondent. Une fois l&rsquo;instruction ex\u00e9cut\u00e9e, la machine parcourt \u00e0 nouveau la liste des instructions, et ainsi de suite. La machine <em>s&rsquo;arr\u00eate<\/em> lorsqu&rsquo;aucune instruction n&rsquo;a pu \u00eatre ex\u00e9cut\u00e9e.<\/p>\n<p>Voil\u00e0 c&rsquo;est tout. Quand je disais que l&rsquo;apprentissage \u00e9tait court&#8230;<\/p>\n<h2>Un exemple pour comprendre<\/h2>\n<p>Soit une bande contenant un certain nombre de b\u00e2tons contigus. R\u00e9alisons un programme qui va ajouter un nouveau b\u00e2ton \u00e0 la s\u00e9rie.<\/p>\n<figure id=\"attachment_1783\" aria-describedby=\"caption-attachment-1783\" style=\"width: 495px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1783 \" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_batons_avant_apres.png\" alt=\"\" width=\"495\" height=\"212\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_batons_avant_apres.png 700w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_batons_avant_apres-300x129.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><figcaption id=\"caption-attachment-1783\" class=\"wp-caption-text\">Avant ex\u00e9cution et apr\u00e8s ex\u00e9cution.<\/figcaption><\/figure>\n<p>Nous positionnons la t\u00eate sur un des b\u00e2tons et d\u00e9marrons la machine dans l&rsquo;\u00e9tat q0. Voici les instructions :<\/p>\n<blockquote><p>q0, | , | , \u2192, q0<\/p>\n<p>q0, \u2610, |, stop<\/p><\/blockquote>\n<h3>Explications<\/h3>\n<p>Si la machine se trouve dans l&rsquo;\u00e9tat q0 et que la t\u00eate lit un b\u00e2ton (signe \u00ab\u00a0|\u00a0\u00bb), \u00e9crire un b\u00e2ton, d\u00e9placer la t\u00eate vers la droite (c&rsquo;est la fl\u00e8che), rester dans l&rsquo;\u00e9tat q0. Le fait de r\u00e9\u00e9crire le m\u00eame signe dans une case ne change donc rien \u00e0 la bande. C&rsquo;est le moyen de \u00ab\u00a0survoler\u00a0\u00bb une case sans la modifier : on r\u00e9\u00e9crit son contenu.<\/p>\n<p>Si la machine est dans l&rsquo;\u00e9tat q0, qu&rsquo;elle lit un <em>blanc<\/em>, c&rsquo;est \u00e0 dire une case \u00ab\u00a0vide\u00a0\u00bb mat\u00e9rialis\u00e9e par \u2610, alors \u00e9crire un b\u00e2ton, se placer dans l&rsquo;\u00e9tat <em>stop. <\/em>Comme cet \u00e9tat n&rsquo;est\u00a0 pas d\u00e9fini dans le programme, la machine s&rsquo;arr\u00eate. Le choix du nom n&rsquo;a pas d&rsquo;importance, nous aurions pu appeler cet \u00e9tat autrement : <em>q1<\/em>, <em>arr\u00eat<\/em>&#8230; Pour arr\u00eater volontairement une machine, il suffit d&rsquo;invoquer un \u00e9tat qui n&rsquo;existe pas.<\/p>\n<p>Notons qu&rsquo;en informatique, un \u00ab\u00a0vide\u00a0\u00bb est toujours quelque-chose. Dans le mod\u00e8le de Turing, les cases \u00ab\u00a0vides\u00a0\u00bb sont en fait remplies de signes \u00ab\u00a0blancs\u00a0\u00bb.<\/p>\n<p>On le voit, ici il n&rsquo;y a qu&rsquo;un seul \u00e9tat actif. De fait, on peut simplifier l&rsquo;\u00e9criture en restant dans le m\u00eame \u00e9tat\u00a0 :<\/p>\n<blockquote><p>|,|,\u2192<\/p>\n<p>\u2610,|, stop<\/p><\/blockquote>\n<p>Que fait la machine ? Vous l&rsquo;avez compris: tant que la t\u00eate lit un b\u00e2ton, la machine d\u00e9place la t\u00eate vers la droite. D\u00e8s qu&rsquo;elle trouve une case vide, elle y \u00e9crit un b\u00e2ton et s&rsquo;arr\u00eate. La machine ajoute donc un b\u00e2ton \u00e0 la fin de la s\u00e9rie et\u00a0 s&rsquo;arr\u00eate sur celui-ci.<\/p>\n<h1>Les machines de Turing sur Actilud<\/h1>\n<h2>La bande<\/h2>\n<p>\u00c9videmment, la bande a une taille limit\u00e9e. Sur Actilud, il y a 1000 cases, ce qui permet d\u00e9j\u00e0 de s&rsquo;amuser un peu. En cons\u00e9quence, notre machine peut rencontrer une erreur \u00ab\u00a0fatale\u00a0\u00bb, lorsque la t\u00eate tente de sortir de la bande, par la gauche ou par la droite. Dans ce cas, tout le processus s&rsquo;interrompt.<\/p>\n<p>Une bande n&rsquo;est pas \u00ab\u00a0vide\u00a0\u00bb. En fait, lorsqu&rsquo;on \u00ab\u00a0efface\u00a0\u00bb la bande, on remplit chaque case avec un signe \u00ab\u00a0blanc\u00a0\u00bb. \u00c0 part cela, les signes \u00ab\u00a0blancs\u00a0\u00bb sont trait\u00e9s exactement comme les autres signes de la collection.<\/p>\n<h2>La t\u00eate de lecture<\/h2>\n<p>Pas de vitesse infinie ! La t\u00eate peut fonctionner en mode \u00ab\u00a0pas \u00e0 pas\u00a0\u00bb, en deux temps, ce qui est le mode p\u00e9dagogique par excellence. Elle peut aussi avancer avec deux vitesses, ou fonctionner en t\u00e2che de fond, au maximum de la vitesse possible dans le navigateur.<\/p>\n<h2>La collection<\/h2>\n<p>La collection sur Actilud contient des images de fruits et l\u00e9gumes, des \u00e9motic\u00f4nes, des lettres majuscules et minuscules, des chiffres, quelques symboles. Cela permet de r\u00e9aliser des programmes cons\u00e9quents. Lorsque l&rsquo;on \u00e9crit un programme, il est bon de pr\u00e9ciser la collection sur laquelle celui-ci travaille. Par exemple : C={[a-z],[A-Z],[0-9],\u2610} &#8211; la collection se compose des lettres minuscules a \u00e0 z, majuscules A \u00e0 Z, des chiffres de 0 \u00e0 9 et du blanc.<\/p>\n<h2>Les \u00e9tats<\/h2>\n<p>Le nombre d&rsquo;\u00e9tats n&rsquo;est pas limit\u00e9, mais il d\u00e9pend bien s\u00fbr de la taille de la m\u00e9moire disponible sur votre ordinateur. Pour la simplicit\u00e9, nous avons regroup\u00e9 les instructions dans les \u00e9tats. Il n&rsquo;est donc pas n\u00e9cessaire de faire r\u00e9f\u00e9rence \u00e0 l&rsquo;\u00e9tat de d\u00e9part dans la programmation des instructions, puisqu&rsquo;elles sont raccroch\u00e9es \u00e0 cet \u00e9tat.<\/p>\n<p>On peut se contenter des noms par d\u00e9faut (q0, q1,&#8230;) mais il est possible de donner des noms particuliers \u00e0 chaque \u00e9tat.<\/p>\n<h2>Les machines<\/h2>\n<p>Dans chaque instruction on peut sp\u00e9cifier, en plus de l&rsquo;\u00e9tat de destination, le nom d&rsquo;une machine \u00e0 lancer. Votre programme peut donc contenir du code pour <em>plusieurs <\/em>machines, qui peuvent s&rsquo;imbriquer : une machine A lance une machine B, qui lance une machine C&#8230;<\/p>\n<p>C&rsquo;est l&rsquo;id\u00e9e du \u00ab\u00a0th\u00e9or\u00e8me\u00a0\u00bb pr\u00e9c\u00e9demment \u00e9voqu\u00e9e : par exemple, vous avez r\u00e9alis\u00e9 une machine qui d\u00e9cr\u00e9mente un entier naturel. Vous pouvez la r\u00e9utiliser dans une machine qui transforme un entier naturel en une suite de b\u00e2tons.<\/p>\n<p>Lancer une machine \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une machine n&rsquo;est pas une entorse au mod\u00e8le : en effet, Turing a d\u00e9montr\u00e9 que l&rsquo;on peut cr\u00e9er une machine universelle, c&rsquo;est \u00e0 dire une machine de Turing qui simule le fonctionnement d&rsquo;une machine de Turing d\u00e9crite sur la bande. Mais, comme il est illusoire de r\u00e9aliser ceci sur notre petite bande de 1000 cases, je propose donc de lancer de nouvelles machines \u00e0 l&rsquo;int\u00e9rieur des instructions.<\/p>\n<p>Cela permet surtout de r\u00e9utiliser du code. Bien s\u00fbr, il n&rsquo;y a aucune obligation d&rsquo;utiliser cette fonctionnalit\u00e9.<\/p>\n<p>Si vous \u00eates d\u00e9butant(e), vous allez certainement commencer par coder une seule machine. Vous pouvez ignorer les deux paragraphes suivants, <em>appel des machines <\/em>et <em>r\u00e9cursion. <\/em>Vous y reviendrez plus tard, quand vous serez plus aguerri(e).<\/p>\n<h3>Appel des machines<\/h3>\n<p>Lorsqu&rsquo;une machine en appelle une autre, la machine appelante est stock\u00e9e dans une pile : c&rsquo;est un emplacement en m\u00e9moire qui contient chaque machine appelante, dans l&rsquo;ordre d&rsquo;arriv\u00e9e. Lorsque la machine appel\u00e9e a termin\u00e9, la machine appelante est sortie de la pile et son ex\u00e9cution reprend.<\/p>\n<p>Jusqu&rsquo;\u00e0 500 machines peuvent \u00eatre stock\u00e9es dans la pile. Au-del\u00e0, le programme s&rsquo;interrompt avec une erreur fatale : \u00ab\u00a0d\u00e9bordement de pile\u00a0\u00bb.<\/p>\n<p>Une machine appel\u00e9e d\u00e9marre toujours dans son \u00e9tat par d\u00e9faut.<\/p>\n<p>Lorsqu&rsquo;une machine appel\u00e9e s&rsquo;arr\u00eate \u00ab\u00a0normalement\u00a0\u00bb, c&rsquo;est \u00e0 dire hors erreur fatale, elle rend la main \u00e0 la machine appelante.<\/p>\n<p>La machine appelante se retrouve dans l&rsquo;\u00e9tat qu&rsquo;elle avait au moment de l&rsquo;appel de la machine appel\u00e9e.<\/p>\n<p>Lorsqu&rsquo;une machine appel\u00e9e rencontre une erreur fatale, tout le processus s&rsquo;arr\u00eate et la pile est vid\u00e9e.<\/p>\n<h3>R\u00e9cursion<\/h3>\n<p>Le d\u00e9bordement de pile peut \u00eatre un handicap lorsque l&rsquo;on utilise des formules r\u00e9cursives. Mais, si on place la machine appelante dans un \u00e9tat d&rsquo;arr\u00eat juste avant de lancer une nouvelle machine, la pile n&rsquo;est pas sollicit\u00e9e.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1894 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_stop_machine.png\" alt=\"\" width=\"550\" height=\"62\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_stop_machine.png 550w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_stop_machine-300x34.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>L&rsquo;exemple ci-dessus montre une instruction. Si la t\u00eate lit un 1, il faut mettre un 1, ne pas bouger, aller dans l&rsquo;\u00e9tat \u00ab\u00a0stop\u00a0\u00bb qui est notre \u00e9tat d&rsquo;arr\u00eat, et lancer la machine qui s&rsquo;appelle \u00ab\u00a0D\u00e9cr\u00e9mente\u00a0\u00bb, que l&rsquo;on a programm\u00e9e par ailleurs. Ici la pile n&rsquo;est pas sollicit\u00e9e, car il n&rsquo;y a pas lieu d&#8217;empiler la machine actuelle qui est arr\u00eat\u00e9e juste avant le d\u00e9marrage de la machine appel\u00e9e.<\/p>\n<p>Si vous utilisez la r\u00e9cursion, analysez bien votre programme : tr\u00e8s souvent, on n&rsquo;a effectivement pas besoin de relancer la machine appelante, \u00e0 la fin de l&rsquo;ex\u00e9cution de la machine appel\u00e9e.<\/p>\n<p>L&rsquo;optimisation de la pile est automatique dans bien des langages \u00e9volu\u00e9s; je pense bien s\u00fbr au Javascript utilis\u00e9 sur le site, mais aussi \u00e0 ce cher vieux Logo, qui fait un usage immod\u00e9r\u00e9 de la r\u00e9cursion.<\/p>\n<h2>Les instructions<\/h2>\n<p>Comme on le voit dans l&rsquo;exemple ci-dessus, tout est visuel sur Actilud. Les instructions se manipulent comme les autres objets du site.<\/p>\n<h3>Signe particulier&#8230;<\/h3>\n<p>J&rsquo;ai programm\u00e9 un signe particulier qui est une petite extension au mod\u00e8le : le signe \u2200 qui signifie \u00ab\u00a0pour tout\u00a0\u00bb ou \u00ab\u00a0quel que soit\u00a0\u00bb, en maths.<\/p>\n<p>On ne peut pas poser ce signe sur la bande; il est r\u00e9serv\u00e9 aux instructions.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1896 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout2.png\" alt=\"\" width=\"389\" height=\"65\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout2.png 389w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout2-300x50.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/>La signification de \u2200 d\u00e9pend de sa position dans l&rsquo;instruction.<\/p>\n<p>En premi\u00e8re position, le signe \u2200 signifie: \u00ab\u00a0pour tout signe lu\u00a0\u00bb ou \u00ab\u00a0quel que soit le signe lu\u00a0\u00bb &#8211; donc la condition est toujours vraie si la machine rencontre cette instruction, y compris pour le signe \u00ab\u00a0blanc\u00a0\u00bb.<\/p>\n<p>En seconde position, le signe \u2200 signifie: \u00ab\u00a0\u00e9crire sur la bande le signe lu, quel qu&rsquo;il soit\u00a0\u00bb.<\/p>\n<p>Notre instruction, ici, signifie donc: quel que soit le signe lu, \u00e9crire le m\u00eame signe sur la bande (autrement dit, il ne se passe rien apparemment sur la bande), aller \u00e0 droite, et rester dans le m\u00eame \u00e9tat puisqu&rsquo;aucun \u00e9tat n&rsquo;est sp\u00e9cifi\u00e9.<\/p>\n<p>Cette \u00e9criture est pratique car elle permet d&rsquo;\u00e9conomiser des tas de lignes de code. C&rsquo;est pourquoi je l&rsquo;ai ajout\u00e9e. Elle est compatible avec le mod\u00e8le, car le symbole \u2200 remplace une s\u00e9rie d&rsquo;instructions presque identiques : si ma collection est form\u00e9e de chiffres de 0 \u00e0 9 et du blanc, le signe \u2200 permet d&rsquo;\u00e9viter l&rsquo;\u00e9criture de 10 instructions.<\/p>\n<p>On constate qu&rsquo;apr\u00e8s elle, aucune autre instruction ne peut s&rsquo;ex\u00e9cuter, car elle est toujours vraie. On doit donc la placer en fin de liste et placer les exceptions \u00e0 la r\u00e8gle <em>avant<\/em> celle-ci. Celles et ceux qui ont d\u00e9j\u00e0 programm\u00e9 un pare-feu appr\u00e9cieront&#8230;<\/p>\n<p>Les deux instructions ci-dessous sont \u00e9quivalentes :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1897 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout3.png\" alt=\"\" width=\"545\" height=\"127\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout3.png 545w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_pour_tout3-300x70.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>Dans les deux cas, la t\u00eate r\u00e9-\u00e9crit la fraise et se d\u00e9place \u00e0 gauche. La premi\u00e8re \u00e9criture est int\u00e9ressante dans l&rsquo;interface d&rsquo;Actilud, car lorsqu&rsquo;on a beaucoup d&rsquo;objets dans la m\u00eame situation, on peut produire rapidement un lot d&rsquo;instructions de ce type en changeant l&rsquo;objet de gauche mais en laissant le signe \u2200 \u00e0 droite. Mais elle est moins lisible que la seconde \u00e9criture; avec un clic de plus dans l&rsquo;\u00e9diteur, sur la fl\u00e8che rouge de transfert, on peut recopier le signe de gauche \u00e0 la position de droite.<\/p>\n<p>Souvent, lorsque l&rsquo;on manipule des nombres, on doit se placer au d\u00e9but ou \u00e0 la fin du nombre \u00e9tudi\u00e9 avant de d\u00e9marrer un traitement. Voici un un exemple de machine qui parcourt un entier naturel, sans le modifier, jusqu&rsquo;\u00e0 atteindre la droite du nombre. Il y a un chiffre par case et les chiffres se suivent. Au d\u00e9part, la t\u00eate est plac\u00e9e quelque part sur un des chiffres formant le nombre.<\/p>\n<p>Sans le signe \u2200 :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1816 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_deplace_droite.png\" alt=\"\" width=\"415\" height=\"608\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_deplace_droite.png 415w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_deplace_droite-205x300.png 205w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_deplace_droite-328x480.png 328w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>Avec le signe \u2200 :<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1987 aligncenter\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing-pluscourt.png\" alt=\"\" width=\"377\" height=\"88\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing-pluscourt.png 377w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing-pluscourt-300x70.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/p>\n<p>C&rsquo;est plus court, n&rsquo;est-ce pas ?<\/p>\n<p>Attention tout de m\u00eame, les deux programmes ne sont pas tout \u00e0 fait \u00e9quivalents ! Tout d\u00e9pend de la collection !<\/p>\n<p>Sur une collection limit\u00e9e aux 10 chiffres et au blanc, les deux programmes fonctionnent de la m\u00eame fa\u00e7on :<\/p>\n<figure id=\"attachment_1818\" aria-describedby=\"caption-attachment-1818\" style=\"width: 369px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1818 \" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_simple.png\" alt=\"\" width=\"369\" height=\"79\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_simple.png 546w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_simple-300x64.png 300w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><figcaption id=\"caption-attachment-1818\" class=\"wp-caption-text\">Collection = {0,1,2,3,4,5,6,7,8,9,\u2610}<\/figcaption><\/figure>\n<p>Mais voici un cas o\u00f9 les deux programmes diff\u00e8rent !<\/p>\n<p>On commence toujours sur le premier chiffre \u00e0 gauche, le chiffre \u00ab\u00a02\u00a0\u00bb de 24.<\/p>\n<figure id=\"attachment_1820\" aria-describedby=\"caption-attachment-1820\" style=\"width: 468px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1820\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_pour_tout.png\" alt=\"\" width=\"468\" height=\"179\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_pour_tout.png 729w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_pour_tout-300x115.png 300w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/03\/turing_nombre_pour_tout-720x276.png 720w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><figcaption id=\"caption-attachment-1820\" class=\"wp-caption-text\">Collection = {0,1,2,3,4,5,6,7,8,9,+,=, \u2610}<\/figcaption><\/figure>\n<p>Le premier programme, sur la bande du haut, se termine apr\u00e8s le 24, sur le signe \u00ab\u00a0+\u00a0\u00bb, et correspond \u00e0 notre souhait. Le second, sur la bande du bas, se termine tout \u00e0 la fin de la formule, sur le premier blanc rencontr\u00e9. Selon l&rsquo;effet recherch\u00e9 ce peut \u00eatre souhaitable, mais il convient de bien le pr\u00e9ciser dans la description de la machine.<\/p>\n<h2>Listage<\/h2>\n<p>On peut lister les machines programm\u00e9es sous une forme moins ludique, mais plus compacte. Le listage n&rsquo;est pas une sauvegarde car on ne peut pas recr\u00e9er automatiquement les machines \u00e0 partir du listage, mais il permet de conserver une trace de son travail et surtout d&rsquo;\u00eatre \u00e0 l&rsquo;aise pour y r\u00e9fl\u00e9chir. On peut aussi s&rsquo;inspirer de cette \u00e9criture pour pr\u00e9parer le travail, ou trouver des bugs. Voil\u00e0 ce que donne le listage du programme sans \u2200 :<\/p>\n<blockquote><p>Machine\u00a0: [AllerDroite]<br \/>\n# Se d\u00e9placer \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un entier naturel jusqu&rsquo;\u00e0 la premi\u00e8re case \u00e0 droite du nombre.<br \/>\n\u00c9tat\u00a0: VaDroite<br \/>\n# Se d\u00e9place \u00e0 droite sur chaque chiffre.<br \/>\nVaDroite, 0 , 0 , \u2192 , VaDroite<br \/>\nVaDroite, 1 , 1 , \u2192 , VaDroite<br \/>\nVaDroite, 2 , 2 , \u2192 , VaDroite<br \/>\nVaDroite, 3 , 3 , \u2192 , VaDroite<br \/>\nVaDroite, 4 , 4 , \u2192 , VaDroite<br \/>\nVaDroite, 5 , 5 , \u2192 , VaDroite<br \/>\nVaDroite, 6 , 6 , \u2192 , VaDroite<br \/>\nVaDroite, 7 , 7 , \u2192 , VaDroite<br \/>\nVaDroite, 8 , 8 , \u2192 , VaDroite<br \/>\nVaDroite, 9 , 9 , \u2192 , VaDroite<\/p><\/blockquote>\n<p>Pour conserver un listage, faites un copier\/coller vers un document.<\/p>\n<h2>Sauvegarde<\/h2>\n<p>Bien entendu, votre travail peut \u00eatre sauvegard\u00e9; rendez-vous dans le menu \u00ab\u00a0ex\u00e9cuter\u00a0\u00bb et cliquez sur l&rsquo;ic\u00f4ne de la disquette. L\u00e0, vous pouvez sauvegarder les machines que vous venez de d\u00e9finir et m\u00eame la bande. Pour les connaisseurs, le fichier obtenu est un fichier de type <em>json <\/em>assorti d&rsquo;un code de hachage, pour \u00e9viter que l&rsquo;on modifie intempestivement le contenu du fichier; le but est d&rsquo;\u00e9viter les plantages si on fait n&rsquo;importe quoi. Ne modifiez donc pas le fichier \u00e0 la main, il sera refus\u00e9.<\/p>\n<p>Le fichier est disponible dans le dossier de t\u00e9l\u00e9chargements de votre appareil.<\/p>\n<p>Pour lire un fichier, utiliser l&rsquo;ic\u00f4ne <em>ouvrir fichier<\/em> dans la barre d&rsquo;outils. L\u00e0, vous pouvez choisir les modalit\u00e9s de chargement. Une modalit\u00e9 pratique permet d&rsquo;ajouter les machines charg\u00e9es \u00e0 celles <em>d\u00e9j\u00e0 pr\u00e9sentes<\/em>. Cela permet donc de r\u00e9utiliser facilement une machine dans un nouveau projet.<\/p>\n<h2>Confidentialit\u00e9<\/h2>\n<p>Votre travail a lieu exclusivement sur la machine locale. Aucune sauvegarde n&rsquo;est effectu\u00e9e sur le serveur; il ne r\u00e9cup\u00e8re pas vos donn\u00e9es. Lorsque vous r\u00e9alisez une sauvegarde, c&rsquo;est le programme qui est dans votre navigateur qui envoie le fichier; ce n&rsquo;est pas le serveur.<\/p>\n<h1>Nos d\u00e9fis<\/h1>\n<p>Vous trouverez sur le site d&rsquo;information quelques propositions de d\u00e9fis de programmation;\u00a0 bien s\u00fbr la liste n&rsquo;est pas exhaustive.<\/p>\n<h1>Les \u00e9tapes pour programmer une machine<\/h1>\n<p>La toute premi\u00e8re \u00e9tape devrait avoir lieu sur papier, au crayon et \u00e0 la gomme ! C&rsquo;est la phase de conception. Seuls les programmeurs aguerris peuvent s&rsquo;en passer ! Donc, pour qu&rsquo;un d\u00e9butant se serve convenablement de la machine <em>il faut imp\u00e9rativement r\u00e9aliser ce travail pr\u00e9paratoire.<\/em><\/p>\n<p>La mise en place des instructions se fait en trois \u00e9tapes. Tout d&rsquo;abord, on cr\u00e9e une machine. Puis, dans cette machine, on cr\u00e9\u00e9e un \u00e9tat. Enfin, dans cet \u00e9tat, on d\u00e9finit des instructions.<\/p>\n<p>Comme \u00e9crit plus haut, les instructions sont rassembl\u00e9es dans les \u00e9tats, ce qui simplifie les tests et le classement. Dans une instruction, on ne fait donc jamais de test sur l&rsquo;\u00e9tat courant de la machine, puisque seules les instructions correspondant \u00e0 l&rsquo;\u00e9tat en cours sont ex\u00e9cut\u00e9es.<\/p>\n<p>On peut revenir en arri\u00e8re et cr\u00e9er un nouvel \u00e9tat, avec ses propres instructions, autant de fois que n\u00e9cessaire. On peut dupliquer les \u00e9tats, les fusionner. De m\u00eame pour les machines. Tout est visuel sur le site et gr\u00e2ce \u00e0 de nombreux boutons de contr\u00f4le, la programmation est au moins aussi efficace, voire plus, qu&rsquo;avec un \u00e9diteur de texte&#8230; avec un peu d&rsquo;entra\u00eenement bien s\u00fbr. Voyez la vid\u00e9o ci-dessous.<\/p>\n<h1>Le mode d&#8217;emploi<\/h1>\n<p>Voici une vid\u00e9o muette, <em><strong>courte<\/strong>, <\/em>en deux langues, pour comprendre comment se servir de la machine sur Actilud. Une fois n&rsquo;est pas coutume, c&rsquo;est mieux et plus rapide qu&rsquo;une description \u00e9crite.\u00a0 <em>Si elle ne s&rsquo;affiche pas, actualisez la page.<\/em><\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"https:\/\/drive.google.com\/file\/d\/1-H_5MGJ0ECeNQ1rOm6N3NDymXZ-wIEGX\/preview\" width=\"640\" height=\"360\" allowfullscreen=\"allowfullscreen\"><span style=\"display: inline-block; width: 0px; overflow: hidden; line-height: 0;\" data-mce-type=\"bookmark\" class=\"mce_SELRES_start\">\ufeff<\/span><\/iframe><\/p>\n<h1>Lien vers le site<\/h1>\n<p style=\"text-align: center;\"><a href=\"https:\/\/actilud.com\/fr\/machine_turing\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2024 size-full\" src=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/04\/machine_turing.png\" alt=\"\" width=\"200\" height=\"200\" srcset=\"https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/04\/machine_turing.png 200w, https:\/\/actilud.com\/info\/wp-content\/uploads\/2024\/04\/machine_turing-150x150.png 150w\" sizes=\"auto, (min-width: 960px) 75vw, 100vw\" \/><\/a><br \/>\n<a href=\"https:\/\/actilud.com\/fr\/machine_turing\">Lien vers le site<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La machine de Turing est un mod\u00e8le math\u00e9matique mis au point par le c\u00e9l\u00e8bre math\u00e9maticien Alan Turing en 1936. G\u00e9n\u00e9ralement, on pr\u00e9sente le mod\u00e8le comme un moyen de d\u00e9montrer les capacit\u00e9s d&rsquo;un ordinateur. Ce qu&rsquo;une machine de Turing peut faire, un ordinateur peut &#8211; ou pourra &#8211; le faire. Ce qu&rsquo;une machine de Turing ne [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-1756","post","type-post","status-publish","format-standard","hentry","category-machine-de-turing"],"_links":{"self":[{"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/posts\/1756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/comments?post=1756"}],"version-history":[{"count":159,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/posts\/1756\/revisions"}],"predecessor-version":[{"id":2512,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/posts\/1756\/revisions\/2512"}],"wp:attachment":[{"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/media?parent=1756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/categories?post=1756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actilud.com\/info\/wp-json\/wp\/v2\/tags?post=1756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}