<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Parlons Code &#187; ocaml</title>
	<atom:link href="https://blog.developpez.com/gnuvince/pcategory/ocaml/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/gnuvince</link>
	<description></description>
	<lastBuildDate>Mon, 29 Nov 2010 04:10:23 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Simulateur de machines de Turing (partie 1)</title>
		<link>https://blog.developpez.com/gnuvince/p9539/ocaml/simulateur_de_machines_de_turing_partie_1</link>
		<comments>https://blog.developpez.com/gnuvince/p9539/ocaml/simulateur_de_machines_de_turing_partie_1#comments</comments>
		<pubDate>Mon, 29 Nov 2010 04:10:23 +0000</pubDate>
		<dc:creator><![CDATA[gnuvince]]></dc:creator>
				<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet est le premier d&#8217;une série dans lequel je vais décrire l&#8217;implantation d&#8217;un simulateur simple de machines de Turing dans le langage OCaml. De billet en billet, nous verrons comment améliorer le code pour obtenir un simulateur plus rapide. Commençons tout d&#8217;abord par définir une machine de Turing; si vous ouvrez un livre d&#8217;informatique théorique, vous y trouverez une définition très formelle et un peu intimidante des machines de Turing avec des lettres grecques: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce billet est le premier d&rsquo;une série dans lequel je vais décrire l&rsquo;implantation d&rsquo;un simulateur simple de machines de Turing dans le langage OCaml.  De billet en billet, nous verrons comment améliorer le code pour obtenir un simulateur plus rapide.</p>
<p>Commençons tout d&rsquo;abord par définir une machine de Turing; si vous ouvrez un livre d&rsquo;informatique théorique, vous y trouverez une définition très formelle et un peu intimidante des machines de Turing avec des lettres grecques:</p>
<p>MT = (Q, &#931;, &#915;, &#948;, q0, qa, qr)</p>
<p>Qu&rsquo;est-ce que c&rsquo;est ce charabia?  Commençons par décrire plus informellement une machine de Turing et son fonctionnement:</p>
<pre>
+----------+
|          |
| CONTRÔLE |----
|          |   |
+----------+   |  TÊTE
               |
               v
 +---+---+---+---+---+---+---+---+---
     |   |   | a | b | c | b | a |
 +---+---+---+---+---+---+---+---+---
            RUBAN
</pre>
<p>La machine de Turing possède trois partie:</p>
<ul>
<li>Le contrôle: cette partie contient une seule information: l&rsquo;état actuel de la machine de Turing.  C&rsquo;est le programmeur qui décide de l&rsquo;état qui va dans le contrôle.</li>
<li>Le ruban: un ruban infini vers la gauche et vers la droite où se trouve dans chaque cellule un caractère ou un blanc.</li>
<li>La tête: la tête pointe vers un caractère dans le ruban.  La tête peut se déplacer à gauche ou à droite d&rsquo;une seule cellule et elle ne peut pas rester sur place.</li>
</ul>
<p>Si on reprend la définition formelle de la machine de Turing, voici ce que signifie chacune des 7 composantes du tuple:</p>
<ul>
<li>Q: un ensemble fini d&rsquo;états (ceux-ci iront dans le contrôle)</li>
<li>&#931;: l&rsquo;alphabet d&rsquo;entrée: un ensemble fini et non-vide de caractères acceptés pour l&rsquo;entrée.</li>
<li>&#915;: l&rsquo;alphabet du ruban: un sur-ensemble de &#931; qui décrit les caractères acceptés sur le ruban.  Au minimum, &#915; = &#931; plus le caractère blanc.</li>
<li>&#948;: la fonction de transition: elle prend la configuration actuelle de la machine de Turing (l&rsquo;état actuel, et le caractère pointé par la tête) et donne le nouvel état, le caractère à écrire sur le ruban et la direction dans laquelle la tête de lecture doit se déplacer.</li>
<li>q0: l&rsquo;état initial</li>
<li>qa: l&rsquo;état acceptant: nous utiliserons toujours le mot &laquo;&nbsp;ACCEPTE&nbsp;&raquo;</li>
<li>qr: l&rsquo;état rejetant: nous utiliserons toujours le mot &laquo;&nbsp;REJETTE&nbsp;&raquo;</li>
</ul>
<p>Voici un exemple d&rsquo;une machine de Turing qui accepte si le mot donné en entrée possède un nombre pair de &lsquo;a&rsquo; et rejette si l&rsquo;entrée possède un nombre impair de &lsquo;a':</p>
<pre>
pair,   a, pair,     a, D
pair,   b, impair,   b, D
pair,   _, ACCEPTE,  _, D

impair, a, impair,   a, D
impair, b, pair,     b, D
impair, _, REJETTE,  _, D
</pre>
<p>Chaque ligne possède 5 informations séparées par des virgules: les deux premières sont les configurations possibles: est-ce qu&rsquo;on est dans l&rsquo;état &laquo;&nbsp;pair&nbsp;&raquo; et que le caractère sous la tête de lecture est &lsquo;a&rsquo;?  Si oui, le nouvel état est &laquo;&nbsp;pair&nbsp;&raquo;, on écrit &lsquo;a&rsquo; sur le ruban et on déplace la tête de lecture vers la droite.</p>
<p>Ce programme va lire tous les caractères de l&rsquo;entrée et les réécrire sur le ruban.  Quand il lit un &lsquo;b&rsquo;, il change l&rsquo;état du contrôleur de pair à impair et vice-versa.  Quand on lit le caractère blanc, cela indique la fin de l&rsquo;entrée et on accepte si on est dans l&rsquo;état pair et on rejette si on est dans l&rsquo;état impair.</p>
<p>Nous allons concevoir un simulateur qui prendra en entrée un tel fichier, un état de départ et une chaîne d&rsquo;entrée et qui simulera la machine sur cet entrée.  La machine affichera à la fin si on accepte ou rejette l&rsquo;entrée et en combien d&rsquo;étapes:</p>
<pre>
$ ./tm pair.tm aaaba pair
ACCEPTE (6)
</pre>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
